Sự cố khi thực thi tập lệnh Python trên hàm AWS Lambda
Tôi đã thử chạy tập lệnh dưới đây trên AWS Lambda, nhưng rất tiếc, nó không thực thi thành công. Bất cứ ai có thể giúp tôi sửa lỗi này hoặc sửa cho tôi nếu có vấn đề với tập lệnh cần một số thay đổi khi thực thi nó từ Lambda?
#!/usr/bin/env python3
import boto3
client = boto3.client('athena')
def run_query(query, database, s3_output):
response = client.start_query_execution(
QueryString=query,
QueryExecutionContext={
'Database': 'database'
},
ResultConfiguration={
'OutputLocation': s3_output,
}
)
print('Execution ID: ' + response['QueryExecutionId'])
return response
#Athena configuration
s3_input = 's3://smathena/cf-ant-prod/'
s3_ouput = 's3://smathena/athenatest/'
database = 's3_accesslog'
table = 'test_output1'
#Athena database and table definition
create_database = "CREATE DATABASE IF NOT EXISTS %s;" % (database)
delete_table = "drop table %s.%s;" % ( database, table )
create_table = \
"""CREATE EXTERNAL TABLE IF NOT EXISTS %s.%s (
`Date` DATE,
ScContentLen BIGINT,
ScRangeStart BIGINT,
ScRangeEnd BIGINT
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LOCATION '%s'
TBLPROPERTIES ('skip.header.line.count' = '2');""" % ( database, table, s3_input )
#Query definitions
query_1 = "SELECT * FROM %s.%s where CAST(status AS VARCHAR) like '404';" % (database, table)
#Execute all queries
queries = [ create_database, delete_table, create_table, query_1 ]
for q in queries:
print("Executing query: %s" % (q))
res = 'run_query(q, database, s3_ouput)'
Lỗi khi thử nghiệm trên AWS Lambda:
Response:
{
"errorMessage": "run_query() missing 1 required positional argument: 's3_output'",
"errorType": "TypeError",
"stackTrace": [
" File \"/var/runtime/bootstrap.py\", line 131, in handle_event_request\n response = request_handler(event, lambda_context)\n"
]
}
ID yêu cầu: "2cb2175c-8838-470d-a8dd-efdf4c051312"
Nhật ký hàm: START RequestId: 2cb2175c-8838-470d-a8dd-efdf4c051312 Phiên bản: $ MỚI NHẤT [LỖI] LoạiError: run_query () thiếu 1 đối số vị trí bắt buộc: 's3_output' Traceback (lần gọi gần đây nhất): File "/ var / runtime /bootstrap.py ", dòng 131, trong handle_event_request response = request_handler (event, lambda_context) END RequestId: 2cb2175c-8838-470d-a8dd-efdf4c051312
import boto3
client = boto3.client('athena')
def run_query(event, context):
response = client.start_query_execution(
QueryString=query,
QueryExecutionContext={
'Database': 'database'
},
ResultConfiguration={
'OutputLocation': s3_output,
}
)
print('Execution ID: ' + response['QueryExecutionId'])
return event
Gặp lỗi dưới đây:
START RequestId: 55dbf703-f30c-4106-8873-c685f3d06e4d Phiên bản: $ MỚI NHẤT [ERROR] NameError: name 's3_output' không được xác định Traceback (cuộc gọi gần đây nhất): File "/var/task/lambda_ Chức năng.py", dòng 12 , trong run_query 'OutputLocation': s3_output, END RequestId: 55dbf703-f30c-4106-8873-c685f3d06e4d REPORT RequestId: 55dbf703-f30c-4106-8873-c685f3d06e4d Dung lượng bộ nhớ: 128: MB 100 ms Bộ nhớ đã sử dụng : 75 MB Init Thời lượng: 649,66 ms
Trả lời
Đây là sự cố tương tự như trong câu hỏi trước đó của bạn: Lỗi khi chạy tập lệnh python trên AWS Lambda - Stack Overflow
Hàm AWS Lambda có định dạng sau:
import boto3
def lambda_handler(event, context):
print(event)
print(context)
Khi hàm Lambda được gọi, nó sẽ gọi lambda_handler()hàm. Tên của hàm này có thể được thay đổi nếu muốn, nhưng nó sẽ luôn nhận được hai tham số đến: eventvàcontext
Tùy thuộc vào cách hàm Lambda được gọi, nội dung của eventhàm chứa thông tin được "chuyển vào" hàm Lambda. Ví dụ:
- Nếu hàm được gọi từ Amazon S3, nó chứa tên của nhóm và đối tượng đã kích hoạt sự kiện
- Nếu hàm được gọi từ Amazon SNS, nó chứa thông báo đã được gửi đến chủ đề SNS
Có vẻ như bạn đang muốn sử dụng ba giá trị trong hàm: query, database, s3_output
Các giá trị này sẽ cần phải được chuyển đến hàm Lambda thông qua bất kỳ phương tiện nào mà hàm Lambda đang được gọi. Sau đó, hàm có thể lấy các giá trị đó thông qua eventtham số.