2017-11-24 17 views
0

私は以下のスタック構造を持っています。AWS Cloudformation:クロススタックリファレンス

ParentStack:私がする必要がどのような

  • ChildStack1
  • ChildStack2

はChildStack1に、パラメータとしてChildStack2Nameを持つ、ChildStack2で作成LambdaExecutionRoleのARNを通過させることです。

"Resources": { 
    "ChildStack1": { 
     "Type": "AWS::CloudFormation::Stack", 
     "Properties": { 
     "Parameters": { 
      "ChildStack2Name": {"Fn::GetAtt": ["ChildStack2", "Outputs.StackName"]} 
     }, 
     .... 

ChildStack1: はここ

親スタック私のスクリプトの抜粋です

"Parameters" { 
    "ChildStack2Name": { 
     "Type": "String", 
     "Description": "Name of commons stack" 
    }, 
... 
"Resources": { 
    "Role": { 
    HERE I NEED A LambdaExecutionRole ARN CREATED IN CHILDSTACK2 
    } 
} 

ChildStack2

"Resources": { 
    "LambdaExecutionRole": { 
     ..... 
    } 
} 
"Outputs": { 
    "LambdaExecutionRole": { 
     "Value": {"Fn::Join" : [ ":", [ { "Ref" : "AWS::StackName" }, "LambdaExecutionRole" ]]}, 
     "Export": { 
     "Name": { 
      "Fn::Join" : [ ":", [ { "Ref" : "AWS::StackName" }, "LambdaExecutionRole" ]] 
     } 
     } 
    }, 
    "StackName": { 
     "Value": {"Ref": "AWS::StackName"}, 
     "Export": { 
     "Name": {"Ref": "AWS::StackName"} 
     } 
    } 
    } 
} 

私はcloudformationに新たなんだと、おそらくこれらのスニペットができました何らかの方法でリファクタリングされます。

ありがとうございます。

+0

を使用してChildStack2からChildStack 1にARNを渡すことができますが、あなたができます[ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html)を使用して戻り値の特定のプロパティにアクセスしますが、これはリソースによって異なります。 – tkwargs

+0

スタックや関連する抜粋などの詳細を投稿してください。 – sashoalm

+0

こんにちは。申し訳ありませんが、私は問題を誤解していましたので、トピック名を変更し、追加のコードスニペットを提供しました。詳しい情報が必要な場合はお知らせください。ありがとうございました。 –

答えて

0

まず、テンプレートからLambdaExecutionRoleのARNを出力する必要があります。以下の例は、ChildStack2のリソースLambdaExecutionRoleAWS::IAM::Roleタイプで、出力名がLambdaExecutionRoleARNであると仮定しています。

"Outputs": { 
    "LambdaExecutionRole": { 
    "Value": {"Fn::Join" : [ ":", [ { "Ref" : "AWS::StackName" }, "LambdaExecutionRole" ]]}, 
    "Export": { 
     "Name": { 
     "Fn::Join" : [ ":", [ { "Ref" : "AWS::StackName" }, "LambdaExecutionRole" ]] 
     } 
    } 
    }, 
    "LambdaExecutionRoleARN": { 
    "Value": {"Fn::GetAtt" : ["LambdaExecutionRole", "Arn"]} 
    }, 

次に、ChildStack1に、親スタックから渡されるARN値を保持する別のパラメータを追加します。次にRefのパラメータをRoleリソースに入れることができます。

"Parameters" { 
    "ChildStack2Name": { 
     "Type": "String", 
     "Description": "Name of commons stack" 
    }, 
    "LambdaExecutionRoleArn": { 
     "Type": "String", 
     "Description": "Lambda Execution Role's ARN" 
    }, 
    ... 
    "Resources": { 
    "Role": { 
     // Here use { "Ref": "LambdaExecutionRoleArn"} to get the value of the parameters 
    } 
} 

あなたのための属性をたいリソースがcloudformationテンプレートで作成された場合次に、あなたの親スタックに、あなたはFn::GetAtt

"Resources": { 
    "ChildStack1": { 
    "Type": "AWS::CloudFormation::Stack", 
    "Properties": { 
     "Parameters": { 
     "ChildStack2Name": {"Fn::GetAtt": ["ChildStack2", "Outputs.StackName"]} 
     "LambdaExecutionRoleArn": {"Fn::GetAtt": ["ChildStack2", "Outputs.LambdaExecutionRoleARN"]} 
     }, 

     .... 
+0

ポポイ、ありがとうございました。しかし、ChildStack1のChildStack2から複数のリソースを参照する必要がある場合はどうすればよいですか?リソースごとに個別のパラメータを作成すると、オーバーヘッドのように見えます。それを達成するためのベストプラクティスはありますか? –

関連する問題