python - 如何在返回响应之前等待 python lambda 处理程序中的所有事件?
问题描述
我在 python 中有一个 AWS Lambda 函数,它使用 SSM 在 EC2 实例中运行脚本。执行后的脚本在 S3 中创建一个文件夹(随机名称)。创建文件夹后,lambda 函数需要返回带有 S3 文件夹名称的响应。
当我检查 Cloudwatch 日志时,我可以在其中一个事件中看到文件夹的名称。但 Lambda 函数在所有事件运行之前返回 200。如何让处理程序等到所有事件都完成后再返回响应/200?
import boto3
import time
def lambda_handler(event, context):
print('event is: ', event)
if 'number' in event.keys():
command = 'python lambda_test.py ' + str(event['number']);
workingDirectory = '/home/ubuntu/src';
executionTimeout = "3600";
ssm = boto3.client('ssm');
ssmresponse = ssm.send_command(InstanceIds=['I-***********a1'], DocumentName='AWSLambdaSampleRun', Parameters= { 'commands': [command], 'workingDirectory': [workingDirectory], 'executionTimeout' : [executionTimeout] }, ServiceRoleArn='arn:aws-us-west-1:sts::***************:assumed-role/lambda/sample', OutputS3BucketName = 'sample-ui' )
records = [x for x in event.get('Records', []) if x.get('eventName') == 'ObjectCreated:Put']
print("records : ", records)
if records:
awsRegion = records[0].get('awsRegion', '')
info = records[0].get('s3', {})
file_key = info.get('object', {}).get('key')
bucket_name = info.get('bucket', {}).get('name')
message = {
'body' : "Script execution completed. See https://console.amazonaws.com/s3/buckets/" + bucket_name + "/" + file_key.replace('err', 'out') + "/?region=" + awsRegion + "&tab=overview for complete output"
}
print message
return message
较早的事件具有参数('event is : ', {u'number': u'1'})
脚本执行后,事件包含 s3 键的名称 -
('event is : ', {u'Records': [{u'eventVersion': u'2.1', u'eventTime': u'2019-04-15T04:48:06.217Z', u'requestParameters': {u'sourceIPAddress': u’**.**.**.***’}, u's3': {u'configurationId': u’*************’, u'object': {u'eTag': u’*********8a11', u'sequencer': u’*********83C', u'key': u’**********’, u'size': 5946}, u'bucket': {u'arn': u'arn:aws-us-****’, u'name': u'sample', u'ownerIdentity': {u'principalId': u'AWS:********’}}, u's3SchemaVersion': u'1.0'}, u'responseElements': {u'x-amz-id-2': u’**/**/**/**=‘, u'x-amz-request-id': u’***’}, u'awsRegion': u'us-west-1', u'eventName': u'ObjectCreated:Put', u'userIdentity': {u'principalId': u'AWS:**:I-**’}, u'eventSource': u'aws:s3'}]})
解决方案
https://pypi.org/project/waiting/
看一下这个。我最近遇到了类似的情况,我正在测试一个事件驱动的 lambda。
推荐阅读
- java - How can I add a method or make this code so that I am not repeating myself so many times?
- asp.net - 如何在 asp.net c# 中创建基于令牌的登录表单
- python - Python:用#字符分割文本文件并总结总数
- javascript - Convert nested object to array of object
- java - I cannot print the user input from my arraylist
- c++ - 我在 switch case 中输入了一个字母,但它没有输出我输入的字母
- reactjs - how to get value onchange event when state data in object
- ios - viewWillAppear(_:) viewDidDisappear(_:) View SwiftUI
- java - Spring Session 中的 SaveMode 和 FlushMode 有什么区别?
- .net - Cometd/bayeux 客户端问题