我创建了一个AWS lambda,在我测试它时以及通过cloudwatch规则手动创建cron作业时效果很好。
它将指标报告为调用(未失败),并记录有关执行的详细信息。
然后我决定删除手动创建的cloudwatch规则,以便创建一个带有ansible的规则。
- name: Create lambda service.
lambda:
name: "{{ item.name }}"
state: present
zip_file: "{{ item.zip_file }}"
runtime: 'python2.7'
role: 'arn:aws:iam::12345678901:role/lambda_ecr_delete'
handler: 'main.handler'
region: 'eu-west-2'
environment_variables: "{{ item.env_vars }}"
with_items:
- name: lamda_ecr_cleaner
zip_file: assets/scripts/ecr-cleaner.zip
env_vars:
'DRYRUN': '0'
'IMAGES_TO_KEEP': '20'
'REGION': 'eu-west-2'
register: new_lambda
- name: Schedule a cloudwatch event.
cloudwatchevent_rule:
name: ecr_delete
schedule_expression: "rate(1 day)"
description: Delete old images in ecr repo.
targets:
- id: ecr_delete
arn: "{{ item.configuration.function_arn }}"
with_items: "{{ new_lambda.results }}"
这创建了几乎完全相同的cloudwatch规则。我可以看到手动创建的唯一区别在于目标,lambda版本/别名在设置为版本时手动创建时设置为默认值,并在使用ansible创建时具有相应的版本号。
使用ansible创建的cloudwatch规则只有失败的调用。
知道为什么会这样吗?我看不到任何日志。有没有办法我可以将版本设置为Default以及ansible中的cloudwatchevent_rule模块?
答案 0 :(得分:9)
我也因此失去了工作时间,同样的错误和相同的混淆(为什么没有记录失败的调用?),我将分享我的"&#34 ;解决方案"",它将解决问题给某人,并帮助其他人调试并找到最终的解决方案。
注意:请注意,这可能允许任何AWS账户执行您的lambda功能
由于您通过手动创建规则目标来调用该函数,我假设您从CloudWatch添加了对lambda的调用权限,但是当cli / api创建事件时,看起来源帐户ID不同由de AWS dashboard / console
创建如果要在来自Principre" events.amazonaws.com"的lambda调用权限中添加源帐户条件。防止任何AWS账户执行你的lambdas只是删除它(在你的责任下!)。
所以,如果你的lambda政策是这样的:
{
"Sid": "<sid>",
"Effect": "Allow",
"Principal": {
"Service": "events.amazonaws.com"
},
"Action": "lambda:InvokeFunction",,
"Condition": {
"StringEquals": {
"AWS:SourceAccount": "<account-id>"
}
},
"Resource": "arn:aws:lambda:<region>:<account-id>:function:<lambda-function>"
}
删除&#34;条件&#34;字段
{
"Sid": "sid",
"Effect": "Allow",
"Principal": {
"Service": "events.amazonaws.com"
},
"Action": "lambda:InvokeFunction",,
"Resource": "arn:aws:lambda:<region>:<account-id>:function:<lambda-function>"
}
和&#34;也许&#34;它会对你有用。
我认为当cli / api创建事件时,cloudwatch事件所有者/创建者数据会发生奇怪的事情......可能是个错误?不确定。我会继续努力
答案 1 :(得分:4)
扩展此处的答案https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/CWE_Troubleshooting.html#LAMfunctionNotInvoked。由于您是通过API创建的,因此您应该像前面提到的那样为Lambda添加权限。在不损害安全性的情况下,您可以执行以下操作:
使用PutRule
api调用添加规则,它会返回
{
"RuleArn": "string"
}
在Lambda AddPermission调用中使用RuleArn
aws lambda add-permission \
--function-name MyFunction \
--statement-id MyId \
--action 'lambda:InvokeFunction' \
--principal events.amazonaws.com \
--source-arn arn-from-PutRule-request
答案 2 :(得分:0)
如果您正在寻找调用失败的原因,请查看其他答案,除非您尝试实施AWS :: Events :: Rule并看到失败的调用。以下答案可能会解决该问题,并且不需要查找这些不存在的日志。