기존 스택 중첩 - AWS CloudFormation

기존 스택 중첩

resource import 기능을 사용하여 기존 스택을 다른 기존 스택에 중첩합니다. 중첩된 스택은 다른 템플릿 내에서 선언하고 참조하는 공통 구성 요소입니다. 따라서 동일한 구성을 복사하여 템플릿에 붙여 넣을 필요가 없고 스택 업데이트를 간소화할 수 있습니다. 공통 구성 요소에 대한 템플릿이 있는 경우 AWS::CloudFormation::Stack 리소스를 사용하여 다른 템플릿 내에서 이 템플릿을 참조할 수 있습니다. 중첩된 스택에 대한 자세한 내용은 중첩 스택 작업 단원을 참조하십시오.

AWS CloudFormation는 resource import를 사용하여 한 수준의 중첩만 지원합니다. 즉, 스택을 하위 스택으로 가져오거나 하위 요소가 있는 스택을 가져올 수 없습니다.

가져오기를 처음 사용하는 경우 먼저 CloudFormation 관리로 기존 리소스 가져오기 주제의 소개 정보를 검토하는 것이 좋습니다.

중첩 스택 가져오기 확인

중첩 스택 가져오기 작업 중에 AWS CloudFormation에서는 다음과 같은 유효성 검사를 수행합니다.

  • 상위 스택 템플릿의 중첩 AWS::CloudFormation::Stack 정의는 실제 중첩 스택의 템플릿과 일치합니다.

  • 상위 스택 템플릿의 중첩 AWS::CloudFormation::Stack 정의에 대한 태그는 실제 중첩 스택 리소스의 태그와 일치합니다.

AWS Management Console을 사용하여 기존 스택 중첩

  1. Retain DeletionPolicy를 사용하여 상위 스택 템플릿에 AWS::CloudFormation::Stack 리소스를 추가합니다. 다음 예제 상위 스택 템플릿에서 MyNestedStack은 가져오기 작업의 대상입니다.

    JSON

    { "AWSTemplateFormatVersion" : "2010-09-09", "Resources" : { "ServiceTable":{ "Type":"AWS::DynamoDB::Table", "Properties":{ "TableName":"Service", "AttributeDefinitions":[ { "AttributeName":"key", "AttributeType":"S" } ], "KeySchema":[ { "AttributeName":"key", "KeyType":"HASH" } ], "ProvisionedThroughput":{ "ReadCapacityUnits":5, "WriteCapacityUnits":1 } } }, "MyNestedStack" : { "Type" : "AWS::CloudFormation::Stack", "DeletionPolicy": "Retain", "Properties" : { "TemplateURL" : "https://s3.amazonaws.com/cloudformation-templates-us-east-2/EC2ChooseAMI.template", "Parameters" : { "InstanceType" : "t1.micro", "KeyName" : "mykey" } } } } }

    YAML

    AWSTemplateFormatVersion: 2010-09-09 Resources: ServiceTable: Type: 'AWS::DynamoDB::Table' Properties: TableName: Service AttributeDefinitions: - AttributeName: key AttributeType: S KeySchema: - AttributeName: key KeyType: HASH ProvisionedThroughput: ReadCapacityUnits: 5 WriteCapacityUnits: 1 MyNestedStack: Type: 'AWS::CloudFormation::Stack' DeletionPolicy: Retain Properties: TemplateURL: >- https://s3.amazonaws.com/cloudformation-templates-us-east-2/EC2ChooseAMI.template Parameters: InstanceType: t1.micro KeyName: mykey
  2. AWS CloudFormation 콘솔을 엽니다.

  3. 스택 페이지에서 상위 스택을 선택한 상태에서 Stack actions(스택 작업)를 선택한 다음 Import resources into stack(스택으로 리소스 가져오기)을 선택합니다.

    콘솔의 스택으로 리소스 가져오기 옵션.
  4. 이 작업 중에 제공해야 하는 항목 목록은 Import overview(가져오기 개요) 페이지를 참조하십시오. 그리고 다음을 선택합니다.

  5. Specify template(템플릿 지정) 페이지에서 다음 방법 중 하나를 사용하여 업데이트된 템플릿을 제공하고 다음을 선택합니다.

    • Amazon S3 URL을 선택한 다음, 텍스트 상자에 템플릿의 URL을 지정합니다.

    • 템플릿 파일 업로드를 선택한 다음 템플릿을 찾습니다.

  6. Identify resources(리소스 식별) 페이지에서 AWS::CloudFormation::Stack 리소스를 식별합니다.

    1. Identifier property(식별자 속성)에서 리소스 식별자의 유형을 선택합니다. 예를 들어 AWS::CloudFormation::Stack 리소스는 StackId 속성을 사용하여 식별할 수 있습니다.

    2. 식별자 값에 가져오려는 스택의 ARN을 입력합니다. 예를 들면 arn:aws:cloudformation:us-west-2:12345678910:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10입니다.

      콘솔의 리소스 식별 페이지.
    3. 다음을 선택합니다.

  7. Specify stack details(스택 세부 정보 지정) 페이지에서 어떤 파라미터든 수정하고 다음을 선택합니다. 이렇게 하면 변경 세트가 자동으로 생성됩니다.

    중요

    생성, 업데이트 또는 삭제 작업을 시작하는 기존 파라미터를 수정하면 가져오기 작업이 실패합니다.

  8. MyParentStack 검토 페이지에서 올바른 리소스를 가져오고 있는지 확인하고, 리소스 가져오기를 선택합니다. 이렇게 하면 마지막 단계에서 생성된 변경 세트가 자동으로 실행됩니다. 이때 어떤 스택 레벨 태그든 가져온 리소스에 적용됩니다.

  9. 상위 스택에 대한 Stack details(스택 세부 정보) 페이지의 Events(이벤트) 창이 표시됩니다.

    콘솔의 이벤트 탭.
    참고

    AWS::CloudFormation::Stack 리소스가 이미 AWS CloudFormation에서 관리되기 때문에 이러한 가져오기 작업을 수행한 후에 상위 스택에서 드리프트 감지를 실행할 필요가 없습니다.

AWS CLI을 사용하여 기존 스택 중첩

  1. Retain DeletionPolicy를 사용하여 상위 스택 템플릿에 AWS::CloudFormation::Stack 리소스를 추가합니다. 다음 예제 상위 템플릿에서 MyNestedStack은 가져오기 작업의 대상입니다.

    JSON

    { "AWSTemplateFormatVersion" : "2010-09-09", "Resources" : { "ServiceTable":{ "Type":"AWS::DynamoDB::Table", "Properties":{ "TableName":"Service", "AttributeDefinitions":[ { "AttributeName":"key", "AttributeType":"S" } ], "KeySchema":[ { "AttributeName":"key", "KeyType":"HASH" } ], "ProvisionedThroughput":{ "ReadCapacityUnits":5, "WriteCapacityUnits":1 } } }, "MyNestedStack" : { "Type" : "AWS::CloudFormation::Stack", "DeletionPolicy": "Retain", "Properties" : { "TemplateURL" : "https://s3.amazonaws.com/cloudformation-templates-us-east-2/EC2ChooseAMI.template", "Parameters" : { "InstanceType" : "t1.micro", "KeyName" : "mykey" } } } } }

    YAML

    AWSTemplateFormatVersion: 2010-09-09 Resources: ServiceTable: Type: 'AWS::DynamoDB::Table' Properties: TableName: Service AttributeDefinitions: - AttributeName: key AttributeType: S KeySchema: - AttributeName: key KeyType: HASH ProvisionedThroughput: ReadCapacityUnits: 5 WriteCapacityUnits: 1 MyNestedStack: Type: 'AWS::CloudFormation::Stack' DeletionPolicy: Retain Properties: TemplateURL: >- https://s3.amazonaws.com/cloudformation-templates-us-east-2/EC2ChooseAMI.template Parameters: InstanceType: t1.micro KeyName: mykey
  2. 다음 예제와 같이 JSON 문자열을 작성하고, 다음을 변경합니다.

    • MyNestedStack을 템플릿에 지정된 대상 리소스의 논리적 ID로 바꿉니다.

    • arn:aws:cloudformation:us-west-2:12345678910:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10을 가져오려는 스택의 ARN으로 바꿉니다.

    [{"ResourceType":"AWS::CloudFormation::Stack","LogicalResourceId":"MyNestedStack","ResourceIdentifier":{"StackId":"arn:aws:cloudformation:us-east-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10"}}]

    또는 구성 파일에서 파라미터를 지정할 수 있습니다.

    예를 들어 MyNestedStack을 가져오려면 다음 구성이 포함된 ResourcesToImport.txt 파일을 만들 수 있습니다.

    JSON

    [ { "ResourceType":"AWS::CloudFormation::Stack", "LogicalResourceId":"MyNestedStack", "ResourceIdentifier": { "StackId":"arn:aws:cloudformation:us-west-2:12345678910:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10" } } ]

    YAML

    ResourceType: 'AWS::CloudFormation::Stack' LogicalResourceId: MyNestedStack ResourceIdentifier: StackId: >- arn:aws:cloudformation:us-west-2:12345678910:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10
  3. 변경 세트를 생성하려면 다음 create-change-set 명령을 사용하고 자리 표시자 텍스트를 변경합니다. --change-set-type 옵션의 경우, IMPORT의 값을 지정합니다. --resources-to-import 옵션의 경우 샘플 JSON 문자열을 방금 생성한 실제 JSON 문자열로 바꿉니다.

    $ aws cloudformation create-change-set \ --stack-name MyParentStack --change-set-name ImportChangeSet \ --change-set-type IMPORT \ --template-body file://TemplateToImport.json \ --resources-to-import '[{"ResourceType":"AWS::CloudFormation::Stack","LogicalResourceId":"MyNestedStack","ResourceIdentifier":{"StackId":"arn:aws:cloudformation:us-west-2:12345678910:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10"}}]'
    참고

    --resources-to-import에서는 인라인 YAML을 지원하지 않습니다. JSON 문자열의 인용 부호 요구 사항은 터미널에 따라 다릅니다. 자세한 내용은 AWS Command Line Interface 사용 설명서의 문자열 안에 따옴표 사용을 참조하세요.

    또는 다음 예제와 같이 --resources-to-import 옵션에 대한 입력으로 파일 URL을 사용할 수 있습니다.

    --resources-to-import file://ResourcesToImport.txt

    성공하면 이 명령에서 다음 샘플 출력이 반환됩니다.

    { "Id": "arn:aws:cloudformation:us-west-2:12345678910:changeSet/ImportChangeSet/8ad75b3f-665f-46f6-a200-0b4727a9442e", "StackId": "arn:aws:cloudformation:us-west-2:12345678910:stack/MyParentStack/4e345b70-1281-11ef-b027-027366d8e82b" }
  4. 변경 세트를 검토하여 올바른 리소스를 가져오고 있는지 확인합니다.

    $ aws cloudformation describe-change-set --change-set-name ImportChangeSet
  5. 변경 세트를 시작하고 스택을 소스 상위 스택으로 가져오려면 다음 execute-change-set 명령을 사용하고 자리 표시자 텍스트를 변경합니다. 이때 어떤 스택 레벨 태그든 가져온 리소스에 적용됩니다. 가져오기 작업 (IMPORT_COMPLETE)이 성공적으로 완료되면 스택이 성공적으로 중첩됩니다.

    $ aws cloudformation execute-change-set --change-set-name ImportChangeSet
    참고

    AWS::CloudFormation::Stack 리소스가 이미 AWS CloudFormation에서 관리되기 때문에 이러한 가져오기 작업을 수행한 후에 상위 스택에서 드리프트 감지를 실행할 필요가 없습니다.