

# 기존 스택 중첩
<a name="resource-import-nested-stacks"></a>

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

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

가져오기를 처음 사용하는 경우 먼저 [수동으로 CloudFormation 스택에 AWS 리소스 가져오기](import-resources-manually.md) 주제의 소개 정보를 검토하는 것이 좋습니다.

## 중첩 스택 가져오기 확인
<a name="resource-import-nested-stacks-validation"></a>

중첩 스택 가져오기 작업 중에 CloudFormation에서는 다음과 같은 유효성 검사를 수행합니다.
+ 상위 스택 템플릿의 중첩 `AWS::CloudFormation::Stack` 정의는 실제 중첩 스택의 템플릿과 일치합니다.
+ 상위 스택 템플릿의 중첩 `AWS::CloudFormation::Stack` 정의에 대한 태그는 실제 중첩 스택 리소스의 태그와 일치합니다.

## AWS Management Console을 사용하여 기존 스택 중첩
<a name="resource-import-nested-stacks-console"></a>

1. `Retain` [DeletionPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-deletionpolicy.html)를 사용하여 상위 스택 템플릿에 `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}}
   ```

1. CloudFormation 콘솔을 엽니다.

1. **스택** 페이지에서 상위 스택을 선택한 상태에서 **Stack actions(스택 작업)**를 선택한 다음 **Import resources into stack(스택으로 리소스 가져오기)**을 선택합니다.   
![콘솔의 스택으로 리소스 가져오기 옵션.](http://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/images/stack-actions-import.png)

1. 이 작업 중에 제공해야 하는 항목 목록은 **Import overview(가져오기 개요)** 페이지를 참조하십시오. 그리고 **다음**을 선택합니다.

1. **Specify template(템플릿 지정)** 페이지에서 다음 방법 중 하나를 사용하여 업데이트된 템플릿을 제공하고 **다음**을 선택합니다.
   + **Amazon S3 URL**을 선택한 다음, 텍스트 상자에 템플릿의 URL을 지정합니다.
   + **템플릿 파일 업로드**를 선택한 다음 템플릿을 찾습니다.

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

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

   1. **식별자 값**에 가져오려는 스택의 ARN을 입력합니다. 예를 들어 `{{arn:aws:cloudformation:us-west-2:12345678910:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10}}`입니다.  
![콘솔의 리소스 식별 페이지.](http://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/images/resource-import-stackid.png)

   1. **다음**을 선택합니다.

1. **Specify stack details(스택 세부 정보 지정)** 페이지에서 어떤 파라미터든 수정하고 **다음**을 선택합니다. 이렇게 하면 변경 세트가 자동으로 생성됩니다.
**중요**  
생성, 업데이트 또는 삭제 작업을 시작하는 기존 파라미터를 수정하면 가져오기 작업이 실패합니다.

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

1. 상위 스택에 대한 **Stack details**(스택 세부 정보) 페이지의 **Events**(이벤트) 창이 표시됩니다.  
![콘솔의 이벤트 탭.](http://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/images/import-events.png)
**참고**  
`AWS::CloudFormation::Stack` 리소스가 이미 CloudFormation에서 관리되기 때문에 이러한 가져오기 작업을 수행한 후에 상위 스택에서 드리프트 감지를 실행할 필요가 없습니다.

## AWS CLI을 사용하여 기존 스택 중첩
<a name="resource-import-nested-stacks-cli"></a>

1. `Retain` [DeletionPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-deletionpolicy.html)를 사용하여 상위 스택 템플릿에 `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}}
   ```

1. 다음 예제와 같이 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}}
   ```

1. 변경 세트를 생성하려면 다음 **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 사용 설명서의 [문자열 안에 따옴표 사용](https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-parameters-quoting-strings.html#cli-usage-parameters-quoting-strings-containing)을 참조하세요.

   또는 다음 예제와 같이 `--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"
   }
   ```

1. 변경 세트를 검토하여 올바른 리소스를 가져오고 있는지 확인합니다.

   ```
   aws cloudformation describe-change-set --change-set-name {{ImportChangeSet}}
   ```

1. 변경 세트를 시작하고 스택을 소스 상위 스택으로 가져오려면 다음 **execute-change-set** 명령을 사용하고 자리 표시자 텍스트를 변경합니다. 이때 어떤 [스택 레벨 태그](cfn-console-create-stack.md#configure-stack-options)든 가져온 리소스에 적용됩니다. 가져오기 작업 `(IMPORT_COMPLETE)`이 성공적으로 완료되면 스택이 성공적으로 중첩됩니다.

   ```
   aws cloudformation execute-change-set --change-set-name {{ImportChangeSet}}
   ```
**참고**  
`AWS::CloudFormation::Stack` 리소스가 이미 CloudFormation에서 관리되기 때문에 이러한 가져오기 작업을 수행한 후에 상위 스택에서 드리프트 감지를 실행할 필요가 없습니다.