

# 기존 리소스에서 스택 생성
<a name="resource-import-new-stack"></a>

이 주제에서는 템플릿에서 기존 AWS 리소스를 설명하여 해당 리소스에서 스택을 생성하는 방법을 보여줍니다. 이렇게 하는 대신, 기존 리소스를 스캔하고 해당 리소스를 CloudFormation으로 가져오거나 새 계정에 해당 리소스를 복제하는 데 사용할 수 있는 템플릿을 자동으로 생성하려면 [IaC 생성기를 사용하여 기존 리소스에서 템플릿 생성](generate-IaC.md) 섹션을 참조하세요.

**사전 조건**

시작하기 전에 다음을 완비해야 합니다.
+ 새 스택에 필요한 모든 리소스를 설명하는 템플릿. 템플릿을 로컬 또는 Amazon S3 버킷에 저장합니다.
+ 가져오려는 각 리소스에 대해 다음을 포함하세요.
  + 리소스의 현재 구성을 정의하는 속성 및 속성값
  + 리소스의 고유 식별자(예: 리소스 이름) 자세한 내용은 [리소스 식별자](import-resources-manually.md#resource-import-identifiers-unique-ids) 섹션을 참조하세요.
  + [DeletionPolicy 속성](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-deletionpolicy.html)

**Topics**
+ [예제 템플릿](#resource-import-new-stack-example-template)
+ [AWS Management Console를 사용하여 기존 리소스에서 스택 생성](#resource-import-new-stack-console)
+ [AWS CLI를 사용하여 기존 리소스에서 스택 생성](#resource-import-new-stack-cli)

## 예제 템플릿
<a name="resource-import-new-stack-example-template"></a>

이 연습에서는 다음과 같이 CloudFormation 외부에서 생성된 두 개의 DynamoDB 테이블을 지정하는 `TemplateToImport.json`이라는 예제 템플릿을 사용한다고 가정합니다. `ServiceTable` 및 `GamesTable`은 가져오기의 대상입니다.

**참고**  
이 템플릿은 예로만 사용됩니다. 이 템플릿을 자체 테스트 목적으로 사용하려면 샘플 리소스를 계정의 리소스로 대체하세요.

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "Import test",
    "Resources": {
        "ServiceTable": {
            "Type": "AWS::DynamoDB::Table",
            "DeletionPolicy": "Retain",
            "Properties": {
                "TableName": "Service",
                "AttributeDefinitions": [
                    {
                        "AttributeName": "key",
                        "AttributeType": "S"
                    }
                ],
                "KeySchema": [
                    {
                        "AttributeName": "key",
                        "KeyType": "HASH"
                    }
                ],
                "ProvisionedThroughput": {
                    "ReadCapacityUnits": 5,
                    "WriteCapacityUnits": 1
                }
            }
        },
        "GamesTable": {
            "Type": "AWS::DynamoDB::Table",
            "DeletionPolicy": "Retain",
            "Properties": {
                "TableName": "Games",
                "AttributeDefinitions": [
                    {
                        "AttributeName": "key",
                        "AttributeType": "S"
                    }
                ],
                "KeySchema": [
                    {
                        "AttributeName": "key",
                        "KeyType": "HASH"
                    }
                ],
                "ProvisionedThroughput": {
                    "ReadCapacityUnits": 5,
                    "WriteCapacityUnits": 1
                }
            }
        }
    }
}
```

## AWS Management Console를 사용하여 기존 리소스에서 스택 생성
<a name="resource-import-new-stack-console"></a>

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)에서 CloudFormation 콘솔을 엽니다.

1. **스택** 페이지에서 **스택 생성**을 선택한 다음 **With existing resources(import resources)(기존 리소스 사용(리소스 가져오기))**를 선택합니다.  
![\[콘솔의 기존 리소스 옵션에서 스택 생성 옵션.\]](http://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/images/create-stack-with-existing-resources.png)

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

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

1. **Identify resources(리소스 식별)** 페이지에서 각 대상 리소스를 식별합니다. 자세한 내용은 [리소스 식별자](import-resources-manually.md#resource-import-identifiers-unique-ids) 섹션을 참조하세요.

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

   1. **Identifier value(식별자 값)**에서 실제 속성값을 입력합니다. 예를 들어 예제 템플릿의 `GamesTable` 리소스에 대한 `TableName`는 `Games`입니다.

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

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

1. ***stack-name* 검토** 페이지에서 올바른 리소스를 가져오고 있는지 확인한 다음, **Import resources(리소스 가져오기)**를 선택합니다. 이렇게 하면 마지막 단계에서 생성된 변경 세트가 자동으로 실행됩니다.

   새로운 스택에 대한 **Stack details**(스택 세부 정보) 페이지의 **Events**(이벤트) 창이 표시됩니다.  
![\[콘솔의 이벤트 탭.\]](http://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/images/import-events.png)

1. (선택 사항) 스택에서 드리프트 감지를 실행하여 가져온 리소스의 템플릿과 실제 구성이 일치하는지 확인합니다. 드리프트 감지에 대한 자세한 내용은 [전체 CloudFormation 스택의 드리프트 감지](detect-drift-stack.md) 섹션을 참조하세요.

1. (선택 사항) 가져온 리소스가 예상 템플릿 구성과 일치하지 않으면 템플릿 구성을 수정하거나 리소스를 직접 업데이트합니다. 이 연습에서는 템플릿 구성을 실제 구성과 일치하도록 수정합니다.

   1. 영향을 받는 리소스에 대해 [가져오기 작업을 되돌립니다](resource-import-revert.md#resource-import-revert-console).

   1. 템플릿 구성이 실제 구성과 일치하는지 확인하여 템플릿에 가져오기 대상을 다시 추가합니다.

   1. 수정된 템플릿을 사용해 2\$18단계를 반복하여 리소스를 다시 가져옵니다.

## AWS CLI를 사용하여 기존 리소스에서 스택 생성
<a name="resource-import-new-stack-cli"></a>

1. 템플릿의 각 리소스 유형을 식별하는 속성을 알아보고, 템플릿의 S3 URL을 지정하여 **get-template-summary** 명령을 실행합니다. 예를 들어 `TableName` 속성을 사용하여 `AWS::DynamoDB::Table` 리소스를 식별할 수 있습니다. 예제 템플릿의 `GamesTable` 리소스의에서 `TableName`의 값은 `Games`입니다. 다음 단계에는 이 정보가 필요합니다.

   ```
   aws cloudformation get-template-summary \
       --template-url https://amzn-s3-demo-bucket.s3.us-west-2.amazonaws.com/TemplateToImport.json
   ```

   자세한 내용은 [리소스 식별자](import-resources-manually.md#resource-import-identifiers-unique-ids) 섹션을 참조하세요.

1. 템플릿의 실제 리소스 목록과 고유한 식별자를 다음 JSON 문자열 형식으로 작성합니다.

   ```
   [{"ResourceType":"AWS::DynamoDB::Table","LogicalResourceId":"GamesTable","ResourceIdentifier":{"TableName":"Games"}},{"ResourceType":"AWS::DynamoDB::Table","LogicalResourceId":"ServiceTable","ResourceIdentifier":{"TableName":"Service"}}]
   ```

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

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

   ```
   [
      {
         "ResourceType":"AWS::DynamoDB::Table",
         "LogicalResourceId":"GamesTable",
         "ResourceIdentifier":{
            "TableName":"Games"
         }
      },
      {
         "ResourceType":"AWS::DynamoDB::Table",
         "LogicalResourceId":"ServiceTable",
         "ResourceIdentifier":{
            "TableName":"Service"
         }
      }
   ]
   ```

1. 변경 세트를 생성하려면 다음 **create-change-set** 명령을 사용하고 자리 표시자 텍스트를 변경합니다. `--change-set-type` 옵션의 경우, **IMPORT**의 값을 지정합니다. `--resources-to-import` 옵션의 경우 샘플 JSON 문자열을 방금 생성한 실제 JSON 문자열로 바꿉니다.

   ```
   aws cloudformation create-change-set \
       --stack-name TargetStack --change-set-name ImportChangeSet \
       --change-set-type IMPORT \
       --template-url https://amzn-s3-demo-bucket.s3.us-west-2.amazonaws.com/TemplateToImport.json \
       --resources-to-import '[{"ResourceType":"AWS::DynamoDB::Table","LogicalResourceId":"GamesTable","ResourceIdentifier":{"TableName":"Games"}},{"ResourceType":"AWS::DynamoDB::Table","LogicalResourceId":"ServiceTable","ResourceIdentifier":{"TableName":"Service"}}]'
   ```
**참고**  
`--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
   ```

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

   ```
   aws cloudformation describe-change-set \
       --change-set-name ImportChangeSet --stack-name TargetStack
   ```

1. 변경 세트를 시작하고 리소스를 가져오려면 다음 **execute-change-set** 명령을 사용하고 자리 표시자 텍스트를 변경합니다. 작업 `(IMPORT_COMPLETE)`이 성공적으로 완료되면 리소스가 성공적으로 가져오기 됩니다.

   ```
   aws cloudformation execute-change-set \
       --change-set-name ImportChangeSet --stack-name TargetStack
   ```

1. (선택 사항) `IMPORT_COMPLETE` 스택에서 드리프트 감지를 실행하여 가져온 리소스의 템플릿과 실제 구성이 일치하는지 확인합니다. 드리프트 감지의 자세한 내용은 [개별 스택 리소스의 드리프트 감지](detect-drift-resource.md) 섹션을 참조하세요.

   1. 지정된 스택에서 드리프트 감지를 실행합니다.

      ```
      aws cloudformation detect-stack-drift --stack-name TargetStack
      ```

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

      ```
      { "Stack-Drift-Detection-Id" : "624af370-311a-11e8-b6b7-500cexample" }
      ```

   1. 지정된 스택 드리프트 감지 ID에 대한 드리프트 감지 작업의 진행 상황을 확인합니다.

      ```
      aws cloudformation describe-stack-drift-detection-status \
          --stack-drift-detection-id 624af370-311a-11e8-b6b7-500cexample
      ```

   1. 지정된 스택에서 드리프트 여부가 확인된 리소스에 대한 드리프트 정보를 확인합니다.

      ```
      aws cloudformation describe-stack-resource-drifts --stack-name TargetStack
      ```

1. (선택 사항) 가져온 리소스가 예상 템플릿 구성과 일치하지 않으면 템플릿 구성을 수정하거나 리소스를 직접 업데이트합니다. 이 연습에서는 템플릿 구성을 실제 구성과 일치하도록 수정합니다.

   1. 영향을 받는 리소스에 대해 [가져오기 작업을 되돌립니다](resource-import-revert.md#resource-import-revert-cli).

   1. 템플릿 구성이 실제 구성과 일치하는지 확인하여 템플릿에 가져오기 대상을 다시 추가합니다.

   1. 수정된 템플릿을 사용해 3\$16단계를 반복하여 리소스를 다시 가져옵니다.