在cloudwatch事件规则cloudformation中动态附加事件名称

时间:2019-11-13 10:44:09

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

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

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)要加入。.用户请求回滚。

我尝试了各种技巧来格式化!加入 !拆分 !Sub 的顺序 我也尝试过使用 Fn :: Join (完整功能格式),但是它总是失败。

eventPattern参数中的

eventName要求输入以下格式。

  

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

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

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

谁能帮我找出将“ CreateServiceSpecificCredential,DeactivateMFADevice” 转换为'“ CreateServiceSpecificCredential”,“ DeactivateMFADevice”'的方法(每个值都用双引号引起来)并且整个字符串都用单引号引起来

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

1 个答案:

答案 0 :(得分:1)

万一有人还在寻找实现它的方法。这是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"