2017-04-13 2 views
1

기타 AWS 관련 질문! 좋습니다, 그래서 하나의 마스터 템플릿이 모든 중첩 된 스택을 호출하는 아이디어입니다. 여기에서 도움을 받아 마스터에서 중첩 된 스택으로 매개 변수를 전달하는 방법을 알아 냈습니다. 이제 중첩 스택에서 중첩 스택으로 값을 전달하는 방법을 알아 내려고 노력 중입니다. 나는 이것이 수출과 수입을 통해 이루어져야한다고 믿지만, 나는 이것이 옳다고 생각하지 않는다. 수입품인지 아니면 수출품인지 확실하지 않습니다.AWS CloudFormation : 중첩 스택간에 값 전달

내가 점점 오전 오류 :

No export named TestStack1-VpcStackID found. Rollback requested by user. 

마스터 :

{ 
    "AWSTemplateFormatVersion" : "2010-09-09", 
    "Description" : "Master template", 
    "Parameters" : { 
     "availabilityZone" : { 
      "Default" : "us-east-1d", 
      "Description" : "Enter AvailabilityZone.", 
      "Type" : "String" 
     }, 
     "VpcCidrBlock" : { 
      "Default" : "10.0.0.0/16", 
      "Description" : "VPC CIDR Block.", 
      "Type" : "String" 
     }, 
     "PublicSubnetCidrBlock" : { 
      "Default" : "10.0.0.0/24", 
      "Description" : "Public subnet CIDR block.", 
      "Type" : "String" 
     } 
    }, 
    "Resources" : { 
     "VpcStack" : { 
      "Type" : "AWS::CloudFormation::Stack", 
      "Properties" : { 
       "Parameters" : { 
        "VpcCidrBlock" : { 
         "Ref" : "VpcCidrBlock" 
        } 
       }, 
       "TemplateURL" : "https://s3.amazonaws.com/url/templates/vpcStack.json", 
       "TimeoutInMinutes" : "5" 
      } 
     }, 
     "PublicRouteStack" : { 
      "Type" : "AWS::CloudFormation::Stack", 
      "Properties" : { 
       "Parameters" : { 
        "PublicSubnetCidrBlock" : { 
         "Ref" : "PublicSubnetCidrBlock" 
        }, 
        "VpcStack" : { 
         "Fn::ImportValue" : { 
          "Fn::Sub" : "${AWS::StackName}-VpcStackID" 
         } 
        } 
       }, 
       "TemplateURL" : "https://s3.amazonaws.com/url/templates/publicRouteStack.json", 
       "TimeoutInMinutes" : "5" 
      } 
     } 
    } 
} 

VpcStack (중첩 - 내가 바로 출력 있다고 생각하지 않습니다) :

{ 
    "AWSTemplateFormatVersion" : "2010-09-09", 
    "Description" : "VPC template", 
    "Parameters" : { 
     "VpcCidrBlock" : { 
      "Description" : "Vpc CIDR Block.", 
      "Type" : "String" 
     } 
    }, 
    "Resources" : { 
     "VpcStack" : { 
      "Type" : "AWS::EC2::VPC", 
      "Properties" : { 
       "EnableDnsSupport" : "true", 
       "EnableDnsHostnames" : "true", 
       "CidrBlock" : { 
        "Ref" : "VpcCidrBlock" 
       }, 
       "Tags" : [ 
        { 
         "Key" : "Application", 
         "Value" : { 
          "Ref" : "AWS::StackName" 
         } 
        } 
       ] 
      } 
     } 
    }, 
    "Outputs" : { 
     "VpcStack" : { 
      "Description" : "VPC Stack ID.", 
      "Value" : { 
       "Ref" : "VpcStack" 
      }, 
      "Export" : { 
       "Name" : { 
        "Fn::Sub" : "${AWS::StackName}-VpcStackID" 
       } 
      } 
     } 
    } 
} 

PublicStubnetStack (나는 그것이 실패하는 곳이라고 생각) :

{ 
    "AWSTemplateFormatVersion" : "2010-09-09", 
    "Description" : "Public Subnet Stack", 
    "Parameters" : { 
     "PublicSubnetCidrBlock" : { 
      "Default" : "10.0.0.0/24", 
      "Description" : "Public subnet CIDR block.", 
      "Type" : "String" 
     }, 
     "VpcStack" : { 
      "Description" : "VPC Stack.", 
      "Type" : "String" 
     } 
    }, 
    "Resources" : { 
     "PublicSubnet" : { 
      "Type" : "AWS::EC2::Subnet", 
      "Properties" : { 
       "VpcId" : { 
        "Ref" : "VpcStack" 
       }, 
       "CidrBlock" : { 
        "Ref" : "PublicSubnetCidrBlock" 
       }, 
       "Tags" : [ 
        { 
         "Key" : "Application", 
         "Value" : { 
          "Ref" : "AWS::StackName" 
         } 
        }, 
        { 
         " Key" : "Network", 
         "Value" : "Public" 
        } 
       ] 
      } 
     } 
    }, 
    "Outputs" : { 
     "PublicSubnet" : { 
      "Description" : "Public Subnet ID.", 
      "Value" : { 
       "Ref" : "PublicSubnet" 
      }, 
      "Export" : { 
       "Name" : { 
        "Fn::Sub" : "${AWS::StackName}-PublicSubnetID" 
       } 
      } 
     } 
    } 
} 

많은 게시 할 미안 해요, AWS에 아주 새로운 오전, 빨리 데리러 노력하고 있어요.

답변

3

문제점

귀하의 문제는 당신이 당신은 당신의 수출 변수 이름으로 현재 스택 이름을 대체 할 ${AWS::StackName} 변수를 사용하는

"Export" : { 
    "Name" : { 
    "Fn::Sub" : "${AWS::StackName}-VpcStackID" 
    } 
} 

로 값을 내보내는 것입니다. 이것은 중첩 된 스택 스택 이름입니다. 당신이 에 대한 변수 ${AWS::StackName}이 경우 에 래퍼 현재 스택를 대체하는, 다시

"Fn::ImportValue" : { 
    "Fn::Sub" : "${AWS::StackName}-VpcStackID" 
} 

:

반면, 래퍼 템플릿, 당신은 값을 가져올 시도 스택. 중첩 된 스택을 사용할 때, 당신이 실제로 새로운 스택을 만드는, 그래서 당신은에있는 템플릿있는 스택 이름에 따라 변경하는 것이

주.

레졸루션

가져 오기를 사용하지 마십시오/변수에 대한 내보내기.

중첩 템플릿에서 Export 요소를 출력에서 ​​삭제하십시오. 너는 필요 없어. 스택 매개 변수를 사용하여 래퍼 스택에서 중첩 스택으로 값을 전달하고 스택 출력을 사용하여 값을 중첩 스택에서 래퍼 스택으로 다시 전달합니다.래퍼 스택에서

이 같은 VpcStack의 출력을 사용 :이 경우, 나는 Fn::GetAtt 기능을 통해 VpcStack 중첩 된 스택에서 VpcStack를라는 출력을 사용하고 있음을

"PublicRouteStack" : { 
     "Type" : "AWS::CloudFormation::Stack", 
     "Properties" : { 
      "Parameters" : { 
       "PublicSubnetCidrBlock" : { 
        "Ref" : "PublicSubnetCidrBlock" 
       }, 
       "VpcStack" : { 
        "Fn::GetAtt" : [ "VpcStack", "Outputs.VpcStack" ] 
       } 
      }, 
      "TemplateURL" : "https://s3.amazonaws.com/url/templates/publicRouteStack.json", 
      "TimeoutInMinutes" : "5" 
     } 
    } 

참고.

추신. 명확하게하기 위해 이름의 일부를 변경해야합니다. 그 곳곳에 같은 이름을 재사용하지 않도록하십시오. 그것은 일을 분명하게하는 데 도움이됩니다.

관련 문제