Как дождаться всех событий в обработчике python lambda перед отправкой ответа?

#python #amazon-s3 #aws-lambda

#python #amazon-s3 #aws-lambda

Вопрос:

У меня есть функция AWS Lambda в python, которая использует SSM для запуска сценариев в экземпляре EC2. Скрипт после выполнения создает папку в S3 (случайное имя). После создания папки лямбда-функция должна вернуть ответ с именем папки S3.

Когда я проверяю журналы Cloudwatch, я вижу имя папки в одном из событий. Но функция Lambda возвращает значение 200 до запуска всех событий. Как мне заставить обработчик дождаться завершения всех событий, прежде чем возвращать response/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   "amp;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'}]})

Ответ №1:

https://pypi.org/project/waiting/

Проверьте это. Недавно я столкнулся с аналогичной ситуацией, когда тестировал управляемую событиями лямбду.