Ansible Cloudwatch规则报告失败的调用

时间:2017-04-12 09:01:24

标签: 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_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模块?

3 个答案:

答案 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并看到失败的调用。以下答案可能会解决该问题,并且不需要查找这些不存在的日志。

Cloudwatch failedinvocation error no logs available