2017-10-13 12 views
0

のための環境変数として、私はCloudFormationテンプレート内のマッピングを持って、私たちはそれがあるとしましょう:使用CloudFormationマッピングカスタムリソースラムダ

"Mappings" : { 
    "RegionMap" : { 
     "us-east-1" : { "Name" : "Aaaa" }, 
     "ap-northeast-1" : { "Name" : "Bbbb" } 
    } 
} 

は今、私はこの内のラムダに環境変数としてこのマッピングを渡したいですテンプレート:

"Environment": { 
    "Variables": { 
      "regions": { 
       "Ref": "RegionMap" 
      } 
    } 
    } 

しかし、これは私にエラーを与える:

Template contains errors.: Template format error: Unresolved resource dependencies [RegionMap] in the Resources block of the template

それを動作させる方法はありますか?

+0

完全なマッピングをラムダ関数または1つのAMIだけに渡しますか? –

+0

完全なマッピング。このマッピングの構造は、実際の内容とは関係のない単なる例です。 – Andremoniy

答えて

2

CloudFormationマッピングセクションのデータは、組み込み関数Fn::FindInMapを使用してのみ抽出されます。つまり、マッピングオブジェクト全体を環境変数として送信することはできません。さらに、コンテキストに関係なく、環境変数は常に文字列です。 CloudFormationはこのオブジェクトをjsonやyamlなどの形式でシリアル化しなければならないでしょう。それはおそらくあなたがそれを行かせない理由です。

あなたはこれを自分で行うことができます。マッピングをコピーしてjson文字列(エスケープされた引用符など)として変換し、値を環境変数として渡すことができます。その後、ラムダコードでオブジェクトに戻すことができます。

ラムダ関数を使用してCustom Resourceを作成する場合は、JSONオブジェクト全体をパラメータとしてリソースに渡すことができます。例:

"AMIInfo": { 
    "Type": "Custom::AMIInfo", 
    "Properties": { 
    "ServiceToken": { "Fn::GetAtt" : ["AMIInfoFunction", "Arn"] }, 
    "RegionMap" : { 
     "us-east-1" : { "Name" : "Aaaa" }, 
     "ap-northeast-1" : { "Name" : "Bbbb" } 
    } 
    } 
} 
+0

興味深い。しかし、もし私が1つのテンプレート内のいくつかの異なるラムダでこのマップを使用したいのですか? – Andremoniy

+1

地図が静的な場合は、Lambdasでハードコーディングすることを検討できます。もう一つの解決策(読み込みハック)は、CloudFormationパラメータ(ユーザ入力)を使用してマップを文字列として渡すことです。次に、すべてのラムダ関数定義で "Ref"することができます。必要な値をそのパラメータの「デフォルト」として設定することもできます。最後の解決策は、コードの再利用が気になる場合は、https://github.com/cloudtools/troposphereのようなツールを使用して、ラムダ定義ごとに同じマップを使用しながらテンプレートを動的に生成することができます。 –

+0

mapをパラメータのデフォルト値として渡すことについてのアイデアはとても良いです。この特定のアイデアのために+1と受け入れ:)ありがとう! – Andremoniy

関連する問題