我创建了一个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版本/别名设置为“默认”,而将其设置为version时,则使用ansible创建时具有相应的版本号。

使用ansible创建的cloudwatch规则仅调用失败。

知道为什么会这样吗?我看不到任何日志。有没有办法通过ansible中的cloudwatchevent_rule模块将版本设置为Default?

最佳答案

我也为此花费了很多时间,同样的错误和困惑(为什么没有失败发票的日志?),我将分享我的““解决方案”“,它将解决这个问题给某人,并且将帮助其他人调试并找到最终的解决方案。

注意:请谨慎,这可能允许任何AWS账户执行您的lambda函数

由于您是通过手动创建规则目标来调用该函数的,因此我假设您已从CloudWatch向lambda添加了调用权限,但是当该事件由cli / api创建以及由何时创建时,看起来源帐户ID是不同的de AWS仪表板/控制台

如果您要在lambda中添加源帐户条件,请从主体“ events.amazonaws.com”调用权限以防止任何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": "sid",
    "Effect": "Allow",
    "Principal": {
        "Service": "events.amazonaws.com"
    },
    "Action": "lambda:InvokeFunction",,
    "Resource": "arn:aws:lambda:<region>:<account-id>:function:<lambda-function>"
}


而且“也许”它将为您工作。

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

关于amazon-web-services - Ansible Cloudwatch规则报告调用失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43364956/

10-11 08:50