【问题标题】:Issue while executing Python script on AWS Lambda function在 AWS Lambda 函数上执行 Python 脚本时出现问题
【发布时间】:2020-08-27 12:06:21
【问题描述】:

我尝试在 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"

功能日志: 开始请求 ID:2cb2175c-8838-470d-a8dd-efdf4c051312 版本:$LATEST [错误] 类型错误:run_query() 缺少 1 个必需的位置参数:'s3_output' 回溯(最近一次通话最后): 文件“/var/runtime/bootstrap.py”,第 131 行,在 handle_event_request 中 响应 = request_handler(事件,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 [错误] NameError:名称's3_output'未定义 回溯(最近一次通话最后): 文件“/var/task/lambda_function.py”,第 12 行,在 run_query '输出位置':s3_output, 结束请求 ID:55dbf703-f30c-4106-8873-c685f3d06e4d 报告请求 ID:55dbf703-f30c-4106-8873-c685f3d06e4d 持续时间:14.30 毫秒计费持续时间:100 毫秒内存大小:128 MB 使用的最大内存:75 MB 初始化持续时间:649.66 毫秒

【问题讨论】:

  • 您似乎错过了处理程序。不是吗?
  • 感谢您的回复。尝试添加上面附加的处理程序仍然得到 NameError: name 's3_output' is not defined。任何建议将不胜感激。
  • 函数是如何被触发的? query, database, s3_output 的值是如何提供给 Lambda 函数的?

标签: python aws-lambda amazon-athena


【解决方案1】:

这与您之前的问题相同:Error while running a python script on AWS Lambda - Stack Overflow

AWS Lambda 函数具有以下格式:

import boto3

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

当调用 Lambda 函数时,它会调用 lambda_handler() 函数。如果需要,可以更改此函数的名称,但它会始终接收这两个传入参数:eventcontext

根据调用 Lambda 函数的方式,event 的内容包含“传递到”Lambda 函数的信息。例如:

  • 如果从 Amazon S3 调用该函数,则它包含触发事件的存储桶和对象的名称
  • 如果从 Amazon SNS 调用该函数,则它包含发送到 SNS 主题的消息

您似乎想在函数中使用三个值:query, database, s3_output

这些值需要通过调用 Lambda 函数的任何方式传递给 Lambda 函数。然后该函数可以通过event 参数检索这些值。

【讨论】:

    猜你喜欢
    • 2019-07-16
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    相关资源
    最近更新 更多