AWS Lambda işlevinde Python betiği çalıştırılırken sorun
Aşağıdaki komut dosyasını AWS Lambda'da çalıştırmayı denedim, ancak maalesef başarıyla yürütülmüyor. Komut dosyasında, Lambda'dan çalıştırılırken biraz değişiklik yapılması gereken bir sorun varsa, bu düzeltmeyi almama veya beni düzeltmeme yardımcı olabilir mi?
#!/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 üzerinde test yapılırken hata oluştu:
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"
]
}
Talep Kimliği: "2cb2175c-8838-470d-a8dd-efdf4c051312"
İşlev günlükleri: START RequestId: 2cb2175c-8838-470d-a8dd-efdf4c051312 Sürüm: $ LATEST [HATA] TypeError: run_query () 1 gerekli konumsal bağımsız değişken: 's3_output' Traceback (en son çağrı): Dosya "/ var / çalışma zamanı /bootstrap.py ", satır 131, handle_event_request yanıtında = request_handler (olay, 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
Aşağıdaki hatayı almak:
BAŞLANGIÇ İstek Kimliği: 55dbf703-f30c-4106-8873-c685f3d06e4d Sürüm: $ SON [HATA] Ad Hatası: 's3_output' adı tanımlanmadı Geri izleme (en son çağrı son): Dosya "/var/task/lambda_function.py", satır 12 , run_query'de 'OutputLocation': s3_output, END RequestId: 55dbf703-f30c-4106-8873-c685f3d06e4d REPORT RequestId: 55dbf703-f30c-4106-8873-c685f3d06e4d Süre: 14,30 ms Faturalandırılmış Bellek: Maks. : 75 MB Başlatma Süresi: 649,66 ms
Yanıtlar
Bu, önceki sorunuzla aynı sorundur: AWS Lambda'da bir python betiği çalıştırırken hata - Stack Overflow
Bir AWS Lambda işlevi şu biçime sahiptir:
import boto3
def lambda_handler(event, context):
print(event)
print(context)
Lambda işlevi çağrıldığında, lambda_handler()işlevi çağırır . Bu işlevin adı istenirse değiştirilebilir, ancak her zaman bu iki gelen parametreyi alır: eventvecontext
Lambda işlevinin nasıl çağrıldığına bağlı olarak, içeriği eventLambda işlevine "aktarılan" bilgileri içerir. Örneğin:
- İşlev Amazon S3'ten çağrılırsa, olayı tetikleyen paket ve nesnenin adını içerir
- İşlev Amazon SNS'den çağrılırsa, SNS konusuna gönderilen mesajı içerir
İşlevde üç değer kullanmak istediğiniz anlaşılıyor: query, database, s3_output
Bu değerlerin, Lambda işlevi çağrılan yöntem ne olursa olsun Lambda işlevine aktarılması gerekecektir. Fonksiyon daha sonra bu değerleri eventparametre aracılığıyla alabilir .