首页 > 解决方案 > 在 cloudwatch 事件规则 cloudformation 中动态附加事件名称

问题描述

这是我的云形成模板,它将事件模式传递给实际上根据事件数据创建规则的子堆栈。

cloudwatchRule:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: !Sub "${s3Path}/cw-rule.yml"
      Parameters:
        eventPattern: !Join
        - ' '
        - -  '{"source":["aws.iam"],"detail-type":["AWS API Call via CloudTrail"],"detail":{"eventSource":["iam.amazonaws.com"],"eventName":['
          -  Fn::Split:
             - ','
             - !Sub ${ssmParamWhichContainsEventNames}
          -  ']}}'
        ruleState: "ENABLED"

#The value of ssmParamWhichContainsEventNames is of format #"CreateServiceSpecificCredential,DeactivateMFADevice"

当我运行它时,我收到以下错误

模板错误:每个 Fn::Join 对象都需要两个参数,(1) 字符串分隔符和 (2) 要连接的字符串列表或返回要连接的字符串列表(例如 Fn::GetAZs)的函数.. 用户请求回滚。

我尝试了各种技术来格式化!Join !Split !Sub的顺序 我也尝试过使用Fn::Join(全功能格式),但它一直失败。

eventPattern 参数中的 eventName 需要以下格式的输入。

“事件名称”:[“事件 1”,“事件 2”,“事件 3”,“事件 4”]

我的 SSM 变量的事件名称格式为“event1,event2,event3...”为了使其与eventName兼容并运行 cloudwatch 规则,我必须将“event1,event2,event3...”转换为' “事件 1”、“事件 2”、“事件 3”...'

一种选择是我将 SSM 转换为我可接受的格式,但出于某种原因,这是我想要避免的事情。

谁能帮我弄清楚将“CreateServiceSpecificCredential,DeactivateMFADevice”转换为“”“CreateServiceSpecificCredential”,“DeactivateMFADevice””的方法(每个值用双引号括起来,整个字符串用单引号括起来

我一直觉得我没有以正确的顺序在上面的代码中正确编写内部函数。

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

解决方案


如果有人仍在寻找如何实现它。这是 cloudformation 模板片段,它将逗号分隔的字符串拆分并使其成为要注入“eventName”属性的单个元素的数组:

cloudwatchRule:
  Type: AWS::CloudFormation::Stack
  Properties:
    TemplateURL: !Sub "${s3Path}/cw-rule.yml"
    Parameters:
      eventPattern: !Sub
        - |
           {"source":["aws.iam"],"detail-type":["AWS API Call via CloudTrail"],"detail":{"eventSource":["iam.amazonaws.com"],"eventName":[
           "${eventNames}"
           ]}}
        - eventNames: !Join
          - '","'
          - !Split
            - ','
            - !Ref ssmParamWhichContainsEventNames
      ruleState: "ENABLED"

推荐阅读