【问题标题】:Ansible Cloudwatch rule reports failed invocationsAnsible Cloudwatch 规则报告失败的调用
【发布时间】:2017-09-07 23:08:03
【问题描述】:

我创建了一个 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 规则只有调用失败。

知道这是为什么吗?我看不到任何日志。有没有办法可以使用 ansible 中的 cloudwatchevent_rule 模块将版本设置为默认?

【问题讨论】:

  • 你解决了吗?我遇到了类似的问题。 Ansible 创建成功但事件失败。如果我编辑并保存事件规则(没有更改)它开始工作......
  • 不,我还没有找到解决方案。如果你找到了请告诉我。

标签: amazon-web-services ansible amazon-cloudwatch


【解决方案1】:

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

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

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

如果您在委托人“events.amazonaws.com”的 lambda 调用权限中添加源账户条件以防止任何 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 事件所有者/创建者数据发生了一些奇怪的事情......也许是一个错误?不确定。我会继续努力的

【讨论】:

  • 太棒了。与那个失去了几个小时。我们一直在为 Lambda 函数创建各种不同类型的触发器,并且在包含 AWS:SourceAccount 时所有这些触发器都有效。事件似乎有所不同。我猜他们一定来自不同的帐户。调度程序本身可能不会在我们自己的 AWS 账户中运行。
  • 没错。我正在为 Lambda 函数创建 S3 触发器,包括没有问题的 AWS:SourceAccount 条件,但是使用 aws-cli 创建的 CloudWatch 事件不起作用,如果您使用仪表板运行良好的话。我认为事件所有者在由 api 创建时没有被正确定义。
  • 我在通过 Terraform 创建 CloudWatch 规则时遇到了这个问题。这篇文章将我引向了解决方案,这正是 Terraform 所需要的:terraform.io/docs/providers/aws/r/lambda_permission.html
【解决方案2】:

在这里扩展答案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

【讨论】:

  • 如果您想拥有(大量)动态创建的规则,则不可行的解决方案,因为您将达到 lambda 策略限制 (20kb)。
  • 如果在source-arn 中使用通配符是可行的,例如:arn:aws:events:&lt;region&gt;:&lt;account-id&gt;:rule/*
【解决方案3】:

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

Cloudwatch failedinvocation error no logs available

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-24
    • 2017-12-30
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    相关资源
    最近更新 更多