Amazon web services Ansible Cloudwatch规则报告调用失败

Amazon web services Ansible Cloudwatch规则报告调用失败,amazon-web-services,ansible,amazon-cloudwatch,Amazon Web Services,Ansible,Amazon Cloudwatch,我已经创建了一个AWS lambda,当我测试它和通过cloudwatch规则手动创建cron作业时,它运行良好 它将度量报告为调用(未失败),并记录有关执行的详细信息 然后我决定删除手动创建的cloudwatch规则,以便使用ansible创建一个 - name: Create lambda service. lambda: name: "{{ item.name }}" state: present zip_file: "{{ item.zip

我已经创建了一个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版本/别名的唯一区别在于目标,手动创建时lambda版本/别名设置为默认值,而设置为版本,使用ansible创建时具有相应的版本号

使用ansible创建的cloudwatch规则只有失败的调用


知道为什么吗?我看不到任何日志。有没有办法将ansible中的cloudwatchevent\u规则模块的版本设置为默认版本?

同样的错误和困惑(为什么没有失败调用的日志?),我将分享我的“解决方案”,它将解决问题,并将帮助其他人调试并找到最终解决方案

注意:请小心,这可能允许任何AWS帐户执行您的lambda功能

由于您是通过手动创建规则目标来调用函数的,因此我假设您是从CloudWatch向lambda添加了调用权限,但是,当事件由cli/api创建时和由de AWS dashboard/console创建时,源帐户ID看起来是不同的

如果您正在主体“events.amazonaws.com”的lambda invoke权限中添加源帐户条件,以防止任何AWS帐户执行您的lambda,只需将其删除(由您负责!)

因此,如果您的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>"
}
{
“Sid”:“,
“效果”:“允许”,
“委托人”:{
“服务”:“events.amazonaws.com”
},
“操作”:“lambda:InvokeFunction”,,
“条件”:{
“StringEquals”:{
“AWS:SourceAccount”:”
}
},
“资源”:“arn:aws:lambda:::函数:”
}
删除“条件”字段

{
“Sid”:“Sid”,
“效果”:“允许”,
“委托人”:{
“服务”:“events.amazonaws.com”
},
“操作”:“lambda:InvokeFunction”,,
“资源”:“arn:aws:lambda:::函数:”
}
“也许”它会对你有用


我认为当通过cli/api创建事件时,cloudwatch事件所有者/创建者数据会发生一些奇怪的事情。。。也许是虫子?不确定。我将继续努力

来扩展这里的答案。因为您是通过API创建它的,所以应该像前面提到的那样向Lambda添加权限。在不影响安全性的情况下,您可以执行以下操作:

添加带有
PutRule
api调用的规则,它将返回您

{
   "RuleArn": "string"
}
在Lambda AddPermission调用中使用
规则arn

aws lambda add-permission \
--function-name MyFunction \
--statement-id MyId \
--action 'lambda:InvokeFunction' \
--principal events.amazonaws.com \
--source-arn arn-from-PutRule-request

如果您正在查找调用失败的原因,请参阅其他答案,除非您试图实现AWS::Events::Rule并且看到调用失败。下面的答案可能会解决这个问题,并且不需要查找这些不存在的日志


您解决了这个问题吗?我遇到了类似的问题。Ansible创建成功,但事件失败。如果我编辑并保存事件规则(没有更改),它将开始工作…没有,我还没有找到解决方案。如果你找到了,请告诉我。太棒了。在那件事上浪费了几个小时。我们已经为Lambda函数创建了各种不同类型的触发器,所有这些触发器在包含AWS:SourceAccount时都能正常工作。事件似乎有所不同。我想它们一定来自另一个账户。调度程序本身可能无法在我们自己的AWS帐户内运行。确切地说。我正在为Lambda函数创建S3触发器,包括AWS:SourceAccount条件,没有问题,但是如果使用仪表板运行良好,则使用AWS cli创建的CloudWatch事件无法工作。我认为事件所有者在api创建时没有正确定义。我在通过Terraform创建CloudWatch规则时遇到了这个问题。这篇文章把我引向了这个解决方案,这就是Terraform中需要的:如果你想要(很多)动态创建的规则,这是不可行的解决方案,因为你会达到lambda策略限制(20kb)。如果你在
源arn
中使用通配符,这是可行的,比如:
arn:aws:events::rule/*
aws lambda add-permission \
--function-name MyFunction \
--statement-id MyId \
--action 'lambda:InvokeFunction' \
--principal events.amazonaws.com \
--source-arn arn-from-PutRule-request