Я использую событие 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