1. ホーム
  2. amazon-web-services

[解決済み] aws cloudformationはリストでFn::Joinを使用します。

2022-02-10 02:45:17

質問

私は、ラムダ関数によってバックアップされたカスタムリソースを使用するcloudformationテンプレートを持っています。ラムダ関数のパラメータの1つは、文字列のリストです。私はリストで渡す1つのアイテムだけを持っており、Fn:Joinを使用して文字列を連結して作成したいと思います。しかし、Fn::Joinを使用すると、無効なjsonにつながるため、エラーが発生します。どんな入力でも感謝します。

サブスクリプション": [ "Fn::Join"です。[":", ["a", "b", "c"]]] といった感じです。

<ブロッククオート

CreateStackの呼び出し時にクライアントエラー(ValidationError)が発生しました。 operation : Template format error: 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"
                                      ] ] ]
    }
}     },

解決方法は?

その Fn::Join 固有機能 の値を構築するために使用されます。 Subscriptions プロパティは配列ではなく、オブジェクトである必要があります。

のような配列を使用することは、JSONの構文として無効です。 ['Fn::Join' : [...]] という形式でなければなりません。 {"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"]
         ]
     }