AWS Lambda 함수에서 Python 스크립트를 실행하는 동안 문제

Aug 26 2020

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"
  ]
}

요청 ID : "2cb2175c-8838-470d-a8dd-efdf4c051312"

함수 로그 : START RequestId : 2cb2175c-8838-470d-a8dd-efdf4c051312 버전 : $ LATEST [ERROR] 유형 오류 : run_query () 필수 위치 인수 1 개 누락 : 's3_output'Traceback (가장 최근 호출 마지막) : 파일 "/ var / runtime /bootstrap.py ", 131 행, handle_event_request 응답 = 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'is not defined Traceback (most recent call last) : File "/var/task/lambda_function.py", line 12 , in run_query 'OutputLocation': s3_output, END RequestId : 55dbf703-f30c-4106-8873-c685f3d06e4d REPORT RequestId : 55dbf703-f30c-4106-8873-c685f3d06e4d Duration : 14.30ms Billed Duration : 100ms Memory Size : 128MB Max Memory Used : 75MB Init 기간 : 649.66ms

답변

JohnRotenstein Aug 27 2020 at 11:06

이것은 이전 질문과 동일한 문제 입니다 .AWS Lambda에서 Python 스크립트를 실행하는 동안 오류가 발생했습니다.

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매개 변수 를 통해 해당 값을 검색 할 수 있습니다 .