Problem beim Ausführen des Python-Skripts in der AWS Lambda-Funktion

Aug 26 2020

Ich habe versucht, das folgende Skript unter AWS Lambda auszuführen, aber leider wird es nicht erfolgreich ausgeführt. Kann mir jemand helfen, dieses Problem zu beheben oder mich zu korrigieren, wenn es ein Problem mit dem Skript gibt, das geändert werden muss, um es von Lambda aus auszuführen?

#!/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)'

Fehler beim Testen auf 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"
  ]
}

Anforderungs-ID: "2cb2175c-8838-470d-a8dd-efdf4c051312"

Funktionsprotokolle: START RequestId: 2cb2175c-8838-470d-a8dd-efdf4c051312 Version: $ LATEST [ERROR] TypeError: run_query () fehlt 1 erforderliches Positionsargument: 's3_output' Traceback (letzter Aufruf zuletzt): File "/ var / runtime /bootstrap.py ", Zeile 131, in handle_event_request response = request_handler (Ereignis, 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  

Den folgenden Fehler erhalten:

START RequestId: 55dbf703-f30c-4106-8873-c685f3d06e4d Version: $ LATEST [ERROR] NameError: Name 's3_output' ist nicht definiert Traceback (letzter Aufruf zuletzt): Datei "/var/task/lambda_function.py", Zeile 12 , in run_query 'OutputLocation': s3_output, END RequestId: 55dbf703-f30c-4106-8873-c685f3d06e4d REPORT RequestId: 55dbf703-f30c-4106-8873-c685f3d06e4d Speicherdauer: 14 ms : 75 MB Init. Dauer: 649,66 ms

Antworten

JohnRotenstein Aug 27 2020 at 11:06

Dies ist das gleiche Problem wie in Ihrer vorherigen Frage: Fehler beim Ausführen eines Python-Skripts unter AWS Lambda - Stack Overflow

Eine AWS Lambda-Funktion hat folgendes Format:

import boto3

def lambda_handler(event, context):
    
    print(event)
    print(context)

Wenn die Lambda-Funktion aufgerufen wird, ruft sie die lambda_handler()Funktion auf. Der Name dieser Funktion kann bei Bedarf geändert werden, es werden jedoch immer die beiden eingehenden Parameter empfangen: eventundcontext

Abhängig davon, wie die Lambda-Funktion aufgerufen wird, enthält der Inhalt der eventInformationen, die an die Lambda-Funktion "übergeben" werden. Zum Beispiel:

  • Wenn die Funktion von Amazon S3 aus aufgerufen wird, enthält sie den Namen des Buckets und des Objekts, die das Ereignis ausgelöst haben
  • Wenn die Funktion von Amazon SNS aufgerufen wird, enthält sie die Nachricht, die an das SNS-Thema gesendet wurde

Es scheint, dass Sie drei Werte in der Funktion verwenden möchten: query, database, s3_output

Diese Werte müssen mit allen Mitteln, die die Lambda-Funktion aufruft, an die Lambda-Funktion übergeben werden. Die Funktion kann diese Werte dann über den eventParameter abrufen .