기존 리소스에서 스택 생성 - AWS CloudFormation

기존 리소스에서 스택 생성

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

사전 조건

시작하기 전에 다음을 완비해야 합니다.

  • 새 스택에 필요한 모든 리소스를 설명하는 템플릿. 템플릿을 로컬 또는 Amazon S3 버킷에 저장합니다.

  • 가져오려는 각 리소스에 대해 다음을 포함하세요.

    • 리소스의 현재 구성을 정의하는 속성 및 속성값

    • 리소스의 고유 식별자(예: 리소스 이름) 자세한 내용은 리소스 식별자 단원을 참조하십시오.

    • DeletionPolicy 속성.

예제 템플릿

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

참고

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

{ "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를 사용하여 기존 리소스에서 스택 생성

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

  2. 스택 페이지에서 스택 생성을 선택한 다음 With existing resources(import resources)(기존 리소스 사용(리소스 가져오기))를 선택합니다.

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

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

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

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

  5. Identify resources(리소스 식별) 페이지에서 각 대상 리소스를 식별합니다. 자세한 내용은 리소스 식별자 단원을 참조하십시오.

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

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

    3. 다음을 선택합니다.

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

    중요

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

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

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

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

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

    1. 영향을 받는 리소스에 대해 가져오기 작업을 되돌립니다.

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

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

AWS CLI를 사용하여 기존 리소스에서 스택 생성

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

    $ aws cloudformation get-template-summary \ --template-url https://DOC-EXAMPLE-BUCKET.s3.us-west-2.amazonaws.com/TemplateToImport.json

    자세한 내용은 리소스 식별자 단원을 참조하십시오.

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

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

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

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

    [ { "ResourceType":"AWS::DynamoDB::Table", "LogicalResourceId":"GamesTable", "ResourceIdentifier":{ "TableName":"Games" } }, { "ResourceType":"AWS::DynamoDB::Table", "LogicalResourceId":"ServiceTable", "ResourceIdentifier":{ "TableName":"Service" } } ]
  3. 변경 세트를 생성하려면 다음 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://DOC-EXAMPLE-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 사용 설명서의 문자열 안에 따옴표 사용을 참조하세요.

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

    --resources-to-import file://ResourcesToImport.txt
  4. 변경 세트를 검토하여 올바른 리소스를 가져올 것인지 확인합니다.

    $ aws cloudformation describe-change-set \ --change-set-name ImportChangeSet --stack-name TargetStack
  5. 변경 세트를 시작하고 리소스를 가져오려면 다음 execute-change-set 명령을 사용하고 자리 표시자 텍스트를 변경합니다. 작업 (IMPORT_COMPLETE)이 성공적으로 완료되면 리소스가 성공적으로 가져오기 됩니다.

    $ aws cloudformation execute-change-set \ --change-set-name ImportChangeSet --stack-name TargetStack
  6. (선택 사항) IMPORT_COMPLETE 스택에서 드리프트 감지를 실행하여 가져온 리소스의 템플릿과 실제 구성이 일치하는지 확인합니다. 드리프트 감지의 자세한 내용은 개별 스택 리소스의 드리프트 감지 섹션을 참조하세요.

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

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

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

      { "Stack-Drift-Detection-Id" : "624af370-311a-11e8-b6b7-500cexample" }
    2. 지정된 스택 드리프트 감지 ID에 대한 드리프트 감지 작업의 진행 상황을 확인합니다.

      $ aws cloudformation describe-stack-drift-detection-status \ --stack-drift-detection-id 624af370-311a-11e8-b6b7-500cexample
    3. 지정된 스택에서 드리프트 여부가 확인된 리소스에 대한 드리프트 정보를 확인합니다.

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

    1. 영향을 받는 리소스에 대해 가져오기 작업을 되돌립니다.

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

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