python - 在 AWS Lambda 函数上执行 Python 脚本时出现问题

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

函数日志: 开始 RequestId: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 中 'OutputLocation':s3_output, 结束 RequestId:55dbf703-f30c-4106-8873-c685f3d06e4d 报告 RequestId:55dbf703-f30c-4106-8873-c685f3d06e4d 持续时间:14.30 毫秒计费持续时间:100 毫秒内存大小:128 MB 使用的最大内存:75 MB 初始化持续时间:649.66 毫秒

最佳答案

这与您之前的问题相同: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 函数的方式,事件 的内容包含“传递到”Lambda 函数的信息。例如:

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

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

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

https://stackoverflow.com/questions/63599039/

相关文章:

markdown - 如何在 Sublime Text 3 中为 Markdown 启用 Emmet

php - 如何使用 line bot webhook 请求在线路组中使用 @mention/@ta

python - 将 PNG 图像从文件夹转换为 JPG - Python

java - 致命异常 : java. lang.IllegalArgumentException

swift - 如何比较 Result 和 .succeed in swift

reactjs - 如何在 React Navigation 5 中将图像添加到抽屉?

apache-flink - Apache Flink JobListener 无法正常工作

javascript - 从 javascript 到 mssql 的瑞典字符 - 在数据库表中显示

html - CSS Grid - 在自动流列上自动生成新的行中断

ios - 使用 ShareExtension 分发 Flutter 应用程序时缺少 CFBundl