【问题标题】:Cloudwatch event rule creation via Ansible succeeds but not invoked通过 Ansible 创建 Cloudwatch 事件规则成功但未调用
【发布时间】:2017-12-30 04:16:37
【问题描述】:

按照blog post 启用在每个 ecs 主机上运行任务,我创建了一个 Ansible 角色,该角色成功创建了触发 Lambda 函数的 Cloudwatch 事件规则。

事件规则在 AWS 控制台中看起来没问题,并且似乎在指标中被触发,但 lambda 函数没有运行(ecs 服务未更改)。

当简单地编辑规则并保存它不做任何更改时,规则开始工作,并且 ecs 服务按预期更改。

这是我最初的剧本和角色,如果需要,我可以创建一个更简单的示例。

剧本:

- name: "create lambda and cloudwatch event rules"
  hosts: localhost
  roles:
    - {
        role: aws/lambda/lookup,
        lambda: ecs-task-on-all-hosts,
        lambda_lookup_register_as: lambda_lookup
      }
    - {
        role: aws/cloudwatch/event/rule/create,
        event_rule: ecs-task-on-all-hosts,
        cluster: "{{ cluster }}",
        lambda_ecs_task_on_all_hosts_arn: "{{ lambda_lookup.arn }}"
      }

角色aws/lambda/lookup

- name: "lookup lambda {{ lambda }}"
  lambda_facts:
    region: "{{ region }}"
    query: config #right now everything we need is given here
    function_name: "{{ lambda }}"
  register: _lambda_function_details

- name: "set lambda lookup result facts"
  set_fact:
    "{{ lambda_lookup_register_as }}":
      arn: "{{ _lambda_function_details.ansible_facts.lambda_facts.function[lambda].function_arn }}"
      name: "{{ _lambda_function_details.ansible_facts.lambda_facts.function[lambda].function_name }}"

角色aws/cloudwatch/event/rule/create: tasks/main.yml

- name: "include variables in file {{ event_rule }}.yml"
  include_vars: "files/{{ event_rule }}.yml"

- name: "verify mandatory parameters were provided"
  include_role:
    name: utilities/verify-parameters
  vars:
    mandatory: "{{ event_mandatory_parameters }}"
  when: event_mandatory_parameters is defined

- name: "create cloudwatch event rule"
  cloudwatchevent_rule:
    region: "{{ region }}"
    name: "{{ event_definition.name }}"
    description: "{{ event_definition.description }}"
    event_pattern: "{{ event_definition.event_pattern | to_json }}"
    targets: "{{ event_definition.targets }}"

正在使用的文件files/ecs-task-on-all-hosts:

event_mandatory_parameters: [ "cluster", "lambda_ecs_task_on_all_hosts_arn" ]
event_definition:
  name: ecs-task-on-all-hosts
  description: Ensure a task is running on all hosts in the cluster
  event_pattern: |-
    {
      "source": [
        "aws.ecs"
      ],
      "detail-type": [
        "ECS Container Instance State Change"
      ],
      "detail": {
        "clusterArn": [
          "arn:aws:ecs:{{ region }}:{{ account_id }}:cluster/{{ cluster }}"
        ]
      }
    }
  targets:
    - id: lambda_ecs_task_on_all_hosts
      arn: "{{ lambda_ecs_task_on_all_hosts_arn }}"

here 提出了一个类似的问题,但它有点不同,仍然没有答案,所以我在这里提供了所有我能提供的细节。如果需要更多信息,请告诉我。

【问题讨论】:

    标签: ansible aws-lambda amazon-cloudwatch amazon-ecs


    【解决方案1】:

    您需要添加允许 CloudWatch Events 调用您的 Lambda 函数的 Lambda 函数策略。编辑 CloudWatch Event 使其工作的原因是它在后台添加了 Lambda 函数策略。

    您可以使用aws lambda get-policy 检查函数的策略。在编辑事件之前,您应该看不到任何策略,在编辑之后,您将看到允许 CloudWatch Events 调用该函数的策略。

    您可以使用 Ansible 模块 lambda_policy 在 Ansible 中设置策略,例如

    - name: allow CloudWatch to invoke the Lambda function
      lambda_policy:
        region: "{{ aws_region }}"
        function_name: ecs-task-on-all-hosts
        state: present
        statement_id: lambda-cloudwatch-event-rule
        action: lambda:InvokeFunction
        principal: events.amazonaws.com
        source_arn: "{{ event.rule.arn }}"
    

    其中eventcloudwatchevent_rule 的返回值。

    来源:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-07
      • 2019-02-11
      • 2019-08-06
      • 1970-01-01
      • 2020-07-27
      • 1970-01-01
      • 2019-02-04
      相关资源
      最近更新 更多