Функция AWS Lambda запускается дважды из cloudwatch, успешно запускается только один раз, почему ошибки не регистрируются - PullRequest
0 голосов
/ 02 января 2019

Я использую событие cloudwatch для запуска labmda при запуске нового экземпляра ecs.

Я немного озадачен журналами, похоже, что функция вызывается, затем завершается сбоем, а затем вызывается снова и успешно выполняется с тем же входом события.

Я понимаю, что лямбда-функцииможет быть вызван несколько раз из cloudwatch для одного и того же события, потому что контракт на поставку хотя бы один раз, и я планирую внести изменения в функцию, чтобы она стала идемпотентной.

Мой вопрос: что происходит, когда он называется первым?время и просто перестает работать?

Больше информации, основанной на вопросе Джармода

При первом вызове функции доступны только следующие теги:

'Tags': [{'Key': 'aws:ec2launchtemplate:id', 'ResourceId': 'i-0a0500abc17bc7e9e', 'ResourceType': 'instance', 'Value': 'lt-01e5585a011e48b97'}]

Это означает, что мой код не выполнялся в следующей строке:

if 'torres' in ec2_response['Tags'][0]['Value']

Поскольку, когда я установил фильтр только для получения тега Name, теги возвращались пустыми в первый раз.Я предполагаю, что лямбда была перезапущена на основе Документация по перезапуску лямбды , и во второй раз она называется тегом имени, и все замечательно.

Итак, у меня возникает вопрос: почему я не получаю сообщение об ошибке в своих лямбда-логах?

Вот вывод журнала:

2019-01-01 11:34:46
START RequestId: 63190c9b-0dd2-11e9-b6ed-256f780af4a8 Version: $LATEST
Event: {'version': '0', 'id': '12f0dc8e-2c49-be57-823f-ab6229b12804', 
'detail-type': 'EC2 Instance State-change Notification', 'source': 
'aws.ec2', 'account': '701704546303', 'time': '2019-01-01T14:34:46Z', 
'region': 'us-west-2', 'resources': ['arn:aws:ec2:us-west- 
2:701704546303:instance/i-0a4af714ff4396d55'], 'detail': {'instance-id': 'i-0a4af714ff4396d55', 'state': 'running'}}
, Context: <bootstrap.LambdaContext object at 0x7fc8f40525f8>
Making ec2 name request
END RequestId: 63190c9b-0dd2-11e9-b6ed-256f780af4a8
REPORT RequestId: 63190c9b-0dd2-11e9-b6ed-256f780af4a8 Duration: 366.46 ms  Billed Duration: 400 ms Memory Size: 128 MB Max Memory Used: 39 MB  

2019-01-01 11:35:46
START RequestId: 63190c9b-0dd2-11e9-b6ed-256f780af4a8 Version: $LATEST
Event: {'version': '0', 'id': '12f0dc8e-2c49-be57-823f-ab6229b12804',                     
'detail-type': 'EC2 Instance State-change Notification', 'source': 
'aws.ec2', 'account': '701704546303', 'time': '2019-01-01T14:34:46Z', 
'region': 'us-west-2', 'resources': ['arn:aws:ec2:us-west- 
2:701704546303:instance/i-0a4af714ff4396d55'], 'detail': {'instance- 
id': 'i-0a4af714ff4396d55', 'state': 'running'}}
, Context: <bootstrap.LambdaContext object at 0x7fc8f724ca58>
Making ec2 name request
torres instance, starting ecs task
END RequestId: 63190c9b-0dd2-11e9-b6ed-256f780af4a8
REPORT RequestId: 63190c9b-0dd2-11e9-b6ed-256f780af4a8  Duration: 1022.97 ms    Billed Duration: 1100 ms Memory Size: 128 MB    Max Memory Used: 40 MB  

Вот функция:

def lambda_handler(event, context):
    print('Event: {}\n, Context: {}'.format(event, context))
    if event['detail-type'] != 'EC2 Instance State-change Notification':
        print('Wrong event detail-type')
        ret = {
            'status': 'Wrong event detail-type'
        }
        print(event)
    else:
        print('Making ec2 name request')
        ec2_client = boto3.client('ec2', region_name='us-west-2')
        try:
            ec2_response = ec2_client.describe_tags(
                Filters=[
                    {
                        'Name': 'resource-id',
                        'Values': [
                            event['detail']['instance-id']
                        ]
                    },
                    {
                        'Name': 'key',
                        'Values': [
                            'Name'
                        ]
                    }
                ]
            )
        except Exception as e:
            print('Failed ec2 call')
            print(e)
            raise e
        if 'torres' in ec2_response['Tags'][0]['Value']:
            print('torres instance, starting ecs task')
            ecs_client = boto3.client('ecs', region_name='us-west-2')
            try:
                ecs_response = ecs_client.run_task(
                    cluster='torres',
                    taskDefinition='torres:16'
                )
            except Exception as e:
                print('Failed ecs call')
                print(e)
                raise e
            task_definition_arns = [t['taskDefinitionArn'] for t in ecs_response['tasks']]
            ecs_status = ecs_response['ResponseMetadata']['HTTPStatusCode']

            ret = {
                'task_definition_arns': task_definition_arns,
                'ecs_status': ecs_status
            }
        else:
            print('Wrong instance')
            ret = {
                'status': 'Wrong instance',
                'event': event
            }

    return ret
...