Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在AWS Lambda函数上执行Python脚本时出现问题_Python_Aws Lambda_Amazon Athena - Fatal编程技术网

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

在AWS Lambda函数上执行Python脚本时出现问题,python,aws-lambda,amazon-athena,Python,Aws Lambda,Amazon Athena,我尝试在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( QueryS

我尝试在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 [ERROR]TypeError:run\u query()缺少1个必需的位置参数:“s3\u输出” 回溯(最近一次呼叫最后一次): handle\u event\u请求中的文件“/var/runtime/bootstrap.py”,第131行 响应=请求处理程序(事件,lambda\u上下文) 结束请求ID: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  
获取以下错误:

启动请求ID:55dbf703-f30c-4106-8873-c685f3d06e4d版本:$LATEST [错误]名称错误:未定义名称“s3_输出” 回溯(最近一次呼叫最后一次): 文件“/var/task/lambda_function.py”,第12行,在运行查询中 “OutputLocation”:s3\U输出, 结束请求ID:55dbf703-f30c-4106-8873-c685f3d06e4d
报告请求ID:55dbf703-f30c-4106-8873-c685f3d06e4d持续时间:14.30毫秒计费持续时间:100毫秒内存大小:128 MB最大已用内存:75 MB初始持续时间:649.66毫秒这与前面问题中的问题相同:

AWS Lambda函数具有以下格式:

导入boto3
def lambda_处理程序(事件、上下文):
打印(事件)
打印(上下文)
调用Lambda函数时,它将调用
Lambda\u handler()
函数。如果需要,可以更改此函数的名称,但它将始终接收这两个传入参数:
event
context

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

  • 如果从AmazonS3调用该函数,它将包含触发事件的bucket和对象的名称
  • 如果该函数是从Amazon SNS调用的,则它包含发送到SNS主题的消息
您似乎希望在函数中使用三个值:
query、database、s3\u output


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

您似乎错过了处理程序。是吗?谢谢你的回复。已尝试添加上面附加的处理程序,但仍获取名称错误:未定义名称“s3\u输出”。如有任何建议,将不胜感激。该功能是如何触发的?如何向Lambda函数提供查询、数据库、s3_输出的值?