首页 > 解决方案 > Cloudformation Cloudwatch 输入模板格式

问题描述

我正在尝试使用 cloudformation 模板创建与粘合事件匹配的 cloudwatch 事件规则,并以 SNS 主题为目标发送消息,我可以在 cloudwatch 控制台中创建它,但不能通过云观察模板创建它。这是我的活动规则:

NotifyEventRule:
  Type: AWS::Events::Rule
  Properties:
    Name: JobNotifyEvent
    Description: Notification event on job status change.
    EventPattern:
      source:
        - aws.glue
      account:
        - !Ref AWS::AccountId
      detail-type:
        - Glue Job State Change
      detail:
        jobName:
          - !Ref GlueJobName
    Targets:
        - 
          Arn: 
              Ref: "JobNotificationTopic"
          Id: 
              Ref: "JobNotificationTopicName"
          InputTransformer:
            InputTemplate: "Job finished in the following state: <state>."
            InputPathsMap: 
              state: "$.detail.state"

问题出在 InputTemplate 上。我得到的错误是:

目标 JobNotificationTopic 的 InputTemplate 无效:[Source: (String)"Job 在以下状态下完成:null。"; 行:1,列:10]。(服务:AmazonCloudWatchEvents;状态代码:400;错误代码:ValidationException;请求 ID:12345678...)

似乎<state>可能是问题所在。

标签: amazon-web-servicesamazon-cloudformationamazon-cloudwatch

解决方案


InputTemplate 的语法由于某种原因在 CloudFormation 中非常严格。它是字符串类型,但不接受任何形式的有效 YAML 字符串。

在您的情况下,您应该在输入字符串之前使用 YAML 文字块标量 |。

InputTransformer:
    InputPathsMap: 
        state: "$.detail.state"
    InputTemplate: |
        "Job finished in the following state: <state>."

如果输入字符串是多行的,则每行都必须用双引号引起来。

InputTransformer:
    InputPathsMap:
        state: $.detail.state
        name: $.detail.name
    InputTemplate: |
        "Job <name> has just been run."
        "Job finished in the following state: <state>."

请注意,您的字符串使用纯流标量,这对 : 字符很挑剔。冒号不能出现在空格或换行符之前。有关详细信息,请参阅 Yaml 多行。但是,正如我所指出的,大多数 YAML 多行规则不适用于 InputTemplate。


推荐阅读