aws cloudformation使用Fn :: Join列表

时间:2016-10-19 19:22:07

标签: amazon-web-services amazon-cloudformation

我有一个使用lambda函数支持的自定义资源的cloudformation模板。 lambda函数的一个参数是字符串列表。我只有一个项目在列表中传递,并希望使用Fn:Join来连接创建字符串。但是,使用Fn :: Join会产生错误,因为它会导致无效的json。任何意见都表示赞赏。

“订阅”:[“Fn :: Join”:[“:”,[“a”,“b”,“c”]]]

  

调用CreateStack时发生客户端错误(ValidationError)   操作:模板格式错误:JSON格式不正确。

Cloudformation片段: -

  "Resources": {
"MyCustomRes": {
      "Type": "Custom::CustomResource",
      "Properties": {
        "ServiceToken": { "Fn::Join": [ "", [
                                        "arn:aws:lambda:",
                                        { "Ref": "AWS::Region" },
                                        ":",
                                        { "Ref": "AWS::AccountId" },
                                        ":function:LambdaFn"
                                      ] ] },
        "Version": 1,
        "ResourceName": { "Ref": "ResourceName" },
        "Subscriptions"       : [ "Fn::Join": [ "", [
                                        "arn:aws:sns:",
                                        { "Ref": "AWS::Region" },
                                        ":",
                                        { "Ref": "AWS::AccountId" },
                                        ":Topic1"
                                      ] ] ]
    }
}     },

2 个答案:

答案 0 :(得分:4)

用于构建Fn::Join属性值的Subscriptions Intrinsic Function需要是一个对象而不是一个数组。

使用像['Fn::Join' : [...]]之类的数组是无效的JSON语法,而是必须采用{"Fn::Join" : [...]}

的形式

文档将语法描述为

{ "Fn::Join" : [ "delimiter", [ comma-delimited list of values ] ] }

因此,您的Cloud Formation模板应使用以下

    "Subscriptions": {
        "Fn::Join": [":", [
            "arn:aws:sns", 
            { "Ref": "AWS::Region"},
            { "Ref": "AWS::AccountId"},
            "Topic1"]
         ]
     }

答案 1 :(得分:1)

我到达这里是为了在YAML文件中寻找相同的语法。我想到的是必须有两个args列表:一个包含2个要加入的项的列表,第二个是列表本身。完整的YAML语法如下所示:

  SourceArn: 
    Fn::Join: 
    - ""
    - - 'arn:aws:execute-api:'
      - !Ref AWS::Region
      - ':'
      - !Ref AWS::AccountId
      - ':'
      - !Ref ApiGatewayRestApiResource
      - '/*'