ปัญหาขณะเรียกใช้สคริปต์ Python บนฟังก์ชัน AWS Lambda
ฉันพยายามเรียกใช้สคริปต์ด้านล่างบน AWS Lambda แต่น่าเสียดายที่มันดำเนินการไม่สำเร็จ ใครสามารถช่วยฉันแก้ไขหรือแก้ไขฉันได้หากมีปัญหากับสคริปต์ที่ต้องการการเปลี่ยนแปลงบางอย่างที่เรียกใช้งานจาก 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)'
เกิดข้อผิดพลาดขณะทดสอบบน 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"
]
}
รหัสคำขอ: "2cb2175c-8838-470d-a8dd-efdf4c051312"
บันทึกการทำงาน: START RequestId: 2cb2175c-8838-470d-a8dd-efdf4c051312 เวอร์ชัน: $ LATEST [ERROR] TypeError: run_query () ไม่มีอาร์กิวเมนต์ตำแหน่งที่ต้องการ 1 รายการ: 's3_output' Traceback (การเรียกล่าสุดล่าสุด): File "/ var / runtime /bootstrap.py "บรรทัด 131 ใน 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
รับข้อผิดพลาดด้านล่าง:
START RequestId: 55dbf703-f30c-4106-8873-c685f3d06e4d เวอร์ชัน: $ LATEST [ERROR] NameError: name 's3_output' ไม่ได้กำหนด Traceback (การเรียกล่าสุดล่าสุด): File "/var/task/lambda_function.py" บรรทัด 12 , ใน run_query 'OutputLocation': s3_output, END RequestId: 55dbf703-f30c-4106-8873-c685f3d06e4d REPORT RequestId: 55dbf703-f30c-4106-8873-c685f3d06e4d ระยะเวลาหน่วยความจำสูงสุด 128 ms ระยะเวลาที่เรียกเก็บ: 100 ms : 75 MB ระยะเวลาเริ่มต้น: 649.66 ms
คำตอบ
นี่เป็นปัญหาเดียวกับคำถามก่อนหน้านี้ของคุณ: เกิดข้อผิดพลาดขณะเรียกใช้สคริปต์ python บน AWS Lambda - python - Program QA
ฟังก์ชัน AWS Lambda มีรูปแบบนี้:
import boto3
def lambda_handler(event, context):
print(event)
print(context)
เมื่อเรียกใช้ฟังก์ชัน Lambda จะเรียกใช้lambda_handler()ฟังก์ชัน ชื่อของฟังก์ชันนี้สามารถเปลี่ยนแปลงได้หากต้องการ แต่จะได้รับพารามิเตอร์ขาเข้าทั้งสองนี้เสมอ : eventและcontext
ขึ้นอยู่กับวิธีเรียกใช้ฟังก์ชัน Lambda เนื้อหาของeventข้อมูลประกอบด้วยข้อมูลที่ "ส่งผ่านไปยัง" ฟังก์ชัน Lambda ตัวอย่างเช่น:
- หากมีการเรียกใช้ฟังก์ชันจาก Amazon S3 ฟังก์ชันนี้จะมีชื่อของที่เก็บข้อมูลและอ็อบเจ็กต์ที่ทริกเกอร์เหตุการณ์
- หากเรียกใช้ฟังก์ชันจาก Amazon SNS จะมีข้อความที่ส่งไปยังหัวข้อ SNS
ดูเหมือนว่าคุณต้องการใช้ค่าสามค่าในฟังก์ชัน: query, database, s3_output
ค่าเหล่านี้จะต้องถูกส่งผ่านไปยังฟังก์ชัน Lambda ด้วยวิธีใดก็ตามที่เรียกใช้ฟังก์ชัน Lambda จากนั้นฟังก์ชันสามารถดึงค่าเหล่านั้นผ่านทางeventพารามิเตอร์