연습: 테스트 및 프로덕션 스택용 파이프라인 빌드 - AWS CloudFormation

연습: 테스트 및 프로덕션 스택용 파이프라인 빌드

AWS CloudFormation 템플릿을 제출하면 AWS CloudFormation에서 이 템플릿을 사용하여 테스트 스택을 자동으로 빌드하는 릴리스 프로세스가 있다고 상상해 보십시오. 테스트 스택을 검토한 후, 변경 시 프로덕션 스택이 어떻게 수정될지 미리 보고 나서 구현 여부를 선택할 수 있습니다. 이 워크플로우를 실현하기 위해 AWS CloudFormation을 사용하여 테스트 스택을 빌드한 후, 테스트 스택을 삭제한 다음, 변경 세트를 생성하고 나서 변경 세트를 실행할 수 있습니다. 하지만 각 작업마다 AWS CloudFormation과 수동으로 상호 작용해야 합니다. 이 연습에서는 AWS CloudFormation 스택을 사용하여 연속 전달 워크플로를 실현하는 데 도움이 되도록 이러한 여러 작업을 자동화하는 CodePipeline 파이프라인을 구축하겠습니다.

필수 조건

이 연습에서는 CodePipeline 및 AWS CloudFormation을 사용해본 적이 있으며 파이프라인과 AWS CloudFormation 템플릿 및 스택의 작동 방식에 대해 잘 알고 있다고 가정하겠습니다. CodePipeline에 대한 자세한 내용을 알아보려면 AWS CodePipeline 사용 설명서를 참조하세요. 파이프라인을 생성할 동일한 AWS 리전에 Amazon S3 버킷도 있어야 합니다.

중요

샘플 WordPress 템플릿은 인터넷에 연결해야 하는 EC2 인스턴스를 생성합니다. 인터넷에 대한 트래픽을 허용하는 기본 VPC와 서브넷이 있는지 확인합니다.

연습 개요

이 연습은 스택에서 샘플 WordPress 사이트용 파이프라인을 빌드합니다. 파이프라인은 세 단계로 분리됩니다. 각 단계마다 최소 한 개의 작업이 포함되어야 하며, 이 때의 작업은 파이프라인에서 아티팩트(입력)에 대해 수행되는 작업입니다. 스테이지는 파이프라인에 작업을 구성합니다. CodePipeline이 스테이지에서 새 아티팩트를 처리하기 전에(예를 들어 파이프라인을 재실행하기 위해 새 입력을 제출한 경우) 스테이지의 모든 작업은 완료해야 합니다.

이 연습이 끝나면 다음 워크플로우를 수행하는 파이프라인이 생성됩니다.

  1. 파이프라인의 첫 번째 단계는 리포지토리에서 소스 아티팩트(AWS CloudFormation 템플릿과 관련 구성 파일)를 검색합니다.

    샘플 WordPress 템플릿을 포함하는 아티팩트를 준비하여 S3 버킷에 업로드합니다.

  2. 두 번째 단계에서는 파이프라인이 테스트 스택을 생성하고 승인을 기다립니다.

    테스트 스택을 검토한 후 원래 파이프라인을 계속 사용할지 아니면 다른 아티팩트를 생성 및 제출하여 변경할지 선택할 수 있습니다. 승인하고 나면 이 단계에서 테스트 스택이 삭제되고 나서 파이프라인이 다음 단계로 이동합니다.

  3. 세 번째 단계에서는 파이프라인이 프로덕션 스택에 대해 변경 세트를 생성하고 나서 승인을 기다립니다.

    초기 실행에서는 프로덕션 스택이 없습니다. 변경 세트에는 AWS CloudFormation에서 생성할 모든 리소스가 표시됩니다. 승인하면 이 단계에서 변경 세트가 실행되고 프로덕션 스택이 빌드됩니다.

참고

AWS CloudFormation은 무료 서비스입니다. 하지만 각각에 대해 현재 요금에서 스택에 포함시키는 EC2 인스턴스 같은 AWS 리소스에 대해 요금이 청구됩니다. AWS 요금에 대한 자세한 내용을 알아보려면 http://aws.amazon.com의 제품별 세부 정보 페이지를 참조하세요.

1단계: 아티팩트 편집 및 S3 버킷에 업로드

파이프라인을 구축하기 전에 소스 리포지토리와 파일을 설정해야 합니다. CodePipeline에서는 이러한 소스 파일을 파이프라인의 아티팩트 스토어로 복사하고 나서 이러한 파일을 사용하여 AWS CloudFormation 스택 생성 같은 작업을 파이프라인에서 수행합니다.

Amazon Simple Storage Service(Amazon S3)를 소스 리포지토리로 사용하는 경우 CodePipeline에서는 소스 파일을 S3 버킷으로 업로드하기 전에 이러한 파일을 압축해야 합니다. 압축한 파일은 AWS CloudFormation 템플릿, 템플릿 구성 파일 또는 2가지 모두를 포함할 수 있는 CodePipeline 아티팩트입니다. Amazon에서는 샘플 WordPress 템플릿 하나와 템플릿 구성 파일 두 개를 포함하는 아티팩트를 제공합니다. 2개의 구성 파일은 WordPress 템플릿의 파라미터 값을 지정합니다. CodePipeline은 WordPress 스택을 생성할 때 이를 사용합니다. 파일 하나에는 테스트 스택용 파라미터 값이 들어 있으며 다른 하나에는 프로덕션 스택용 파라미터 값이 들어 있습니다. 예를 들어 자신의 고유한 기존 EC2 키-페어 이름을 지정하려면 구성 파일을 편집해야 합니다. 아티팩트에 대한 자세한 내용은 AWS CloudFormation 아티팩트 단원을 참조하십시오.

아티팩트를 빌드한 후에는 S3 버킷에 업로드합니다.

아티팩트를 편집 및 업로드하려면
  1. 샘플 아티팩트인 https://s3.amazonaws.com/cloudformation-examples/user-guide/continuous-deployment/wordpress-single-instance.zip을 다운로드하여 엽니다.

    아티팩트에는 세 가지 파일이 들어 있습니다.

    • 샘플 WordPress 템플릿: wordpress-single-instance.yaml

    • 테스트 스택용 템플릿 구성 파일: test-stack-configuration.json

    • 프로덕션 스택용 템플릿 구성 파일: prod-stack-configuration.json

  2. 모든 파일의 압축을 풀고 나서 텍스트 편집기를 사용하여 템플릿 구성 파일을 수정합니다.

    구성 파일을 열어서 WordPress 템플릿의 파라미터로 매핑되는 키-값 페어가 들어 있는지 확인합니다. 이 구성 파일은 테스트 및 프로덕션 스택 생성 시 파이프라인에서 사용하는 파라미터 값을 지정합니다.

    test-stack-configuration.json 파일에는 테스트 스택용 파라미터 값이 들어 있으며 prod-stack-configuration.json 파일에는 프로덕션 스택용 파라미터 값이 들어 있습니다.

    • DBPasswordDBRootPassword 키의 값을 WordPress 데이터베이스에 로그인할 때 사용할 수 있는 암호로 변경합니다. WordPress 템플릿에 정의된 대로, 파라미터 값에는 영숫자만 포함되어야 합니다.

    • 파이프라인을 생성할 리전의 기존 EC2 키-페어 이름으로 KeyName 키의 값을 변경합니다.

  3. 수정된 구성 파일을 원래 아티팩트(.zip) 파일에 추가하여 중복 파일을 대체합니다.

    이제 S3 버킷에 업로드할 수 있는 사용자 지정 아티팩트가 있습니다.

  4. 자신의 고유 S3 버킷에 아티팩트를 업로드합니다.

    파일 위치를 적어둡니다. 파이프라인을 빌드할 때 이 파일의 위치를 지정합니다.

    아티팩트 및 S3 버킷에 대한 중요 정보:

    • 파이프라인을 생성할 동일한 AWS 리전에 있는 버킷을 사용합니다.

    • CodePipeline에서는 버킷에 대해 버전 관리가 활성화되어야 합니다.

    • 소스 리포지토리로 업로드하기 전에 파일을 압축할 필요가 없는 GitHub 또는 CodeCommit 같은 서비스를 사용할 수도 있습니다.

    • 암호 등 중요 정보가 아티팩트에 포함될 수 있습니다. 허용된 사용자만 파일을 볼 수 있도록 액세스를 제한하십시오. 그렇게 해도 CodePipeline에서는 여전히 파일에 액세스할 수 있습니다.

이제 CodePipeline에서 파이프라인에 아티팩트를 추가할 수 있습니다. 다음 단계에서는 아티팩트의 위치를 지정하고 WordPress 파이프라인을 빌드하겠습니다.

2단계: 파이프라인 스택 생성

WordPress 파이프라인을 생성하려면 샘플 AWS CloudFormation 템플릿을 사용합니다. 파이프라인 빌드 외에도, 이 템플릿은 CodePipeline 및 AWS CloudFormation용 AWS Identity and Access Management(IAM) 서비스 역할, CodePipeline 아티팩트 스토어용 S3 버킷, 그리고 파이프라인에서 알림(예: 검토에 대한 알림)을 보낼 Amazon Simple Notification Service(Amazon SNS) 주제를 설정합니다. 이 샘플 템플릿을 사용하면 이러한 리소스를 단일 AWS CloudFormation 스택에서 쉽게 프로비저닝 및 구성할 수 있습니다.

파이프라인 구성에 대한 자세한 내용은 파이프라인의 기능 단원을 참조하십시오.

중요

샘플 WordPress 템플릿은 인터넷에 연결해야 하는 EC2 인스턴스를 생성합니다. 기본 VPC와 서브넷에서 인터넷에 대한 트래픽을 허용하는지 확인합니다.

파이프라인 스택을 생성하려면
  1. https://s3.amazonaws.com/cloudformation-examples/user-guide/continuous-deployment/basic-pipeline.yml에서 샘플 템플릿을 다운로드합니다. 그런 다음 컴퓨터에 저장합니다.

  2. AWS CloudFormation 콘솔(https://console.aws.amazon.com/cloudformation/)을 엽니다.

  3. CodePipeline과 AWS CloudFormation을 지원하는 AWS 리전을 선택합니다.

    자세한 내용은 AWS 일반 참조AWS Regions and endpoints를 참조하세요.

  4. 스택 생성을 선택합니다.

  5. 템플릿 지정 섹션에서 템플릿 파일 업로드를 선택한 다음, 방금 다운로드한 템플릿인 basic-pipeline.yml을 선택합니다.

  6. 다음을 선택합니다.

  7. 스택 이름에는 sample-WordPress-pipeline을 입력합니다.

  8. 파라미터 섹션에서 다음 파라미터 값을 지정하고 나서 다음을 선택합니다. 스택 파라미터를 설정할 때, WordPress 템플릿 및 관련 구성 파일에 대해 동일한 이름을 유지한 경우, 기본값을 사용할 수 있습니다. 그렇지 않은 경우에는 사용했던 파일 이름을 지정합니다.

    PipelineName

    WordPress-test-pipeline 같은 파이프라인의 이름입니다.

    S3Bucket

    아티팩트(.zip 파일)를 저장한 S3 버킷의 이름입니다.

    SourceS3Key

    아티팩트의 파일 이름입니다. 아티팩트를 폴더에 저장한 경우 folder/subfolder/wordpress-single-instance.zip과 같이 파일 이름에 이를 포함시킵니다.

    이메일

    CodePipeline에서 파이프라인 알림을 보내는 이메일 주소입니다(예: myemail@example.com).

  9. 이 연습에서는 태그를 추가하거나 고급 설정을 지정할 필요가 없으므로 다음을 선택합니다.

  10. 스택 이름과 템플릿 URL이 올바른지 확인한 다음 스택 생성을 선택합니다.

  11. AWS CloudFormation이 IAM 리소스를 생성할 수 있다는 것을 알고 있음을 확인하려면 확인란을 선택합니다.

AWS CloudFormation에서 스택을 생성하는 데 몇 분 정도 걸릴 수 있습니다. 진행 상황을 모니터링하려면 스택 이벤트를 확인합니다. 자세한 내용은 AWS Management Console에서 AWS CloudFormation 스택 데이터 및 리소스 보기 단원을 참조하십시오.

스택이 생성되고 나면 CodePipeline에서 새 파이프라인을 시작합니다. 상태를 보려면 CodePipeline 콘솔을 확인합니다. 파이프라인 목록에서 WordPress-test-pipeline을 선택합니다.

파이프라인의 기능

이 섹션에서는 샘플 WordPress 파이프라인 템플릿의 코드 조각을 사용하여 파이프라인의 세 단계를 설명합니다.

1단계: 소스

파이프라인의 첫 번째 단계는 소스 코드의 위치를 지정하는 소스 단계입니다. 개정을 이 위치로 푸시할 때마다 CodePipeline에서 파이프라인을 다시 실행합니다.

소스 코드는 S3 버킷에 있으며 파일 이름으로 식별합니다. 파이프라인 스택을 생성할 때 이러한 값을 입력 파라미터 값으로 지정했습니다. 후속 단계에서 소스 아티팩트 사용을 허용하기 위해 코드 조각에서 OutputArtifacts 속성을 TemplateSource라는 이름으로 지정합니다. 이후 단계에서 이 아티팩트를 사용하려면 TemplateSource를 입력 아티팩트로 지정하면 됩니다.

- Name: S3Source Actions: - Name: TemplateSource ActionTypeId: Category: Source Owner: AWS Provider: S3 Version: '1' Configuration: S3Bucket: !Ref 'S3Bucket' S3ObjectKey: !Ref 'SourceS3Key' OutputArtifacts: - Name: TemplateSource

2단계: TestStage

TestStage 단계에서 파이프라인은 테스트 스택을 생성한 후, 승인을 기다렸다가 테스트 스택을 삭제합니다.

CreateStack 작업의 경우, 파이프라인은 테스트 구성 파일과 WordPress 템플릿을 사용하여 테스트 스택을 생성합니다. 두 파일은 TemplateSource 입력 아티팩트에 포함되어 있으며, 이 아티팩트는 소스 단계에서 가져옵니다. 이 코드 조각은 REPLACE_ON_FAILURE 작업 모드를 사용합니다. 스택 생성에 실패할 경우 파이프라인이 해당 스택을 대체하므로 파이프라인을 다시 실행하기 전에 스택을 정리하거나 문제를 해결할 필요가 없습니다. 작업 모드는 테스트 스택에 대해 신속히 반복할 때 유용합니다. RoleArn 속성의 경우, 값은 템플릿의 어딘가에 선언되어 있는 AWS CloudFormation 서비스 역할입니다.

ApproveTestStack 작업은 파이프라인을 일시 정지하고, 파이프라인 스택을 생성할 때 지정했던 이메일 주소로 알림을 전송합니다. 파이프라인이 일시 정지된 동안 WordPress 테스트 스택과 관련 리소스를 확인할 수 있습니다. CodePipeline을 사용하여 이 작업을 승인 또는 거부합니다. CustomData 속성에는 승인 대기 중인 작업에 대한 설명이 포함되어 있으며, 파이프라인은 이 설명을 알림 이메일에 추가합니다.

이 작업이 승인되고 나면 CodePipeline에서 DeleteTestStack 작업으로 이동하여 테스트 WordPress 스택과 관련 리소스를 삭제합니다.

- Name: TestStage Actions: - Name: CreateStack ActionTypeId: Category: Deploy Owner: AWS Provider: CloudFormation Version: '1' InputArtifacts: - Name: TemplateSource Configuration: ActionMode: REPLACE_ON_FAILURE RoleArn: !GetAtt [CFNRole, Arn] StackName: !Ref TestStackName TemplateConfiguration: !Sub "TemplateSource::${TestStackConfig}" TemplatePath: !Sub "TemplateSource::${TemplateFileName}" RunOrder: '1' - Name: ApproveTestStack ActionTypeId: Category: Approval Owner: AWS Provider: Manual Version: '1' Configuration: NotificationArn: !Ref CodePipelineSNSTopic CustomData: !Sub 'Do you want to create a change set against the production stack and delete the ${TestStackName} stack?' RunOrder: '2' - Name: DeleteTestStack ActionTypeId: Category: Deploy Owner: AWS Provider: CloudFormation Version: '1' Configuration: ActionMode: DELETE_ONLY RoleArn: !GetAtt [CFNRole, Arn] StackName: !Ref TestStackName RunOrder: '3'

3단계: ProdStage

파이프라인의 ProdStage 단계에서는 기존 프로덕션 스택과 대조하여 변경 세트를 생성한 다음, 승인을 기다렸다가 변경 세트를 실행합니다.

변경 세트는 수정 사항을 구현하기 전에 AWS CloudFormation에서 프로덕션 스택에 대해 수행할 모든 수정 사항에 대한 미리 보기를 제공합니다. 파이프라인을 처음 실행할 때는 실행 중인 프로덕션 스택이 없습니다. 변경 세트는 테스트 스택 생성 시 AWS CloudFormation에서 수행한 작업을 보여줍니다. 변경 세트를 생성하기 위해 CreateChangeSet 작업은 TemplateSource 입력 아티팩트의 WordPress 샘플 템플릿과 프로덕션 템플릿 구성을 사용합니다.

이전 단계와 마찬가지로, ApproveChangeSet 작업은 파이프라인을 일시 정지하고 이메일 알림을 보냅니다. 파이프라인이 일시 정지된 동안은 변경 세트를 보고 프로덕션 WordPress 스택에 대해 제안된 모든 수정 사항을 확인할 수 있습니다. CodePipeline을 사용하여 이 작업을 승인 또는 거부함으로써 각각 파이프라인을 계속 진행하거나 중지합니다.

이 작업을 승인한 후에는 ExecuteChangeSet 작업이 변경 세트를 실행하므로 AWS CloudFormation에서 변경 세트에 설명된 모든 작업을 수행합니다. 초기 실행의 경우, AWS CloudFormation에서 WordPress 프로덕션 스택을 생성합니다. 후속 실행 시 AWS CloudFormation에서는 스택을 업데이트합니다.

- Name: ProdStage Actions: - Name: CreateChangeSet ActionTypeId: Category: Deploy Owner: AWS Provider: CloudFormation Version: '1' InputArtifacts: - Name: TemplateSource Configuration: ActionMode: CHANGE_SET_REPLACE RoleArn: !GetAtt [CFNRole, Arn] StackName: !Ref ProdStackName ChangeSetName: !Ref ChangeSetName TemplateConfiguration: !Sub "TemplateSource::${ProdStackConfig}" TemplatePath: !Sub "TemplateSource::${TemplateFileName}" RunOrder: '1' - Name: ApproveChangeSet ActionTypeId: Category: Approval Owner: AWS Provider: Manual Version: '1' Configuration: NotificationArn: !Ref CodePipelineSNSTopic CustomData: !Sub 'A new change set was created for the ${ProdStackName} stack. Do you want to implement the changes?' RunOrder: '2' - Name: ExecuteChangeSet ActionTypeId: Category: Deploy Owner: AWS Provider: CloudFormation Version: '1' Configuration: ActionMode: CHANGE_SET_EXECUTE ChangeSetName: !Ref ChangeSetName RoleArn: !GetAtt [CFNRole, Arn] StackName: !Ref ProdStackName RunOrder: '3'

3단계: WordPress 스택 보기

CodePipeline은 파이프라인을 따라 실행하면서 AWS CloudFormation을 사용하여 테스트 및 프로덕션 스택을 생성합니다. 이러한 스택 및 출력의 상태를 보려면 AWS CloudFormation 콘솔을 사용합니다.

스택을 보려면
  1. AWS CloudFormation 콘솔(https://console.aws.amazon.com/cloudformation/)을 엽니다.

  2. 파이프라인이 테스트 단계에 있는지 프로덕션 단계에서 있는지에 따라, Test-MyWordPressSite 또는 Prod-MyWordPressSite 스택을 선택합니다.

  3. 스택의 상태를 보려면 이벤트를 확인합니다.

스택이 실패 상태인 경우 상태 이유를 보고 스택 오류를 찾습니다. 오류를 수정하고 나서 파이프라인을 다시 실행합니다. 스택이 CREATE_COMPLETE 상태에 있는 경우 관련 출력을 보고 WordPress 사이트의 URL을 가져옵니다.

CodePipeline을 사용하여 샘플 WordPress 사이트에 대해 연속 전달 워크플로우를 빌드했습니다. 변경 내용을 S3 버킷으로 제출할 경우 CodePipeline에서는 새 버전을 자동으로 감지한 다음 파이프라인을 다시 실행합니다. 이 워크플로우를 사용하면 프로덕션 사이트를 변경하기 전에 변경 내용을 보다 쉽게 제출 및 테스트할 수 있습니다.

4단계: 리소스 정리

원치 않는 서비스에 대해 요금이 청구되지 않도록 하려면 리소스를 삭제합니다.

중요

파이프라인 스택을 삭제하기 전에 테스트 및 프로덕션 WordPress 스택을 삭제합니다. 파이프라인 스택에는 WordPress 스택을 삭제하는 데 필요한 서비스 역할이 포함되어 있습니다. 파이프라인 스택을 처음 삭제한 경우 다른 서비스 역할 Amazon 리소스 이름(ARN)과 WordPress 스택을 연결하고 나서 이러한 스택을 삭제할 수 있습니다.

아티팩트 스토어에서 객체를 삭제하려면
  1. https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 엽니다.

  2. CodePipeline에서 파이프라인의 아티팩트 스토어로 사용된 S3 버킷을 선택합니다.

    버킷의 이름은 stackname-artifactstorebucket-id 형식이어야 합니다. 이 연습을 살펴본 경우 버킷의 이름이 다음 예제와 비슷할 것입니다. sample-WordPress-pipeline-artifactstorebucket-12345abcd12345.

  3. 아티팩트 스토어 S3 버킷에서 모든 객체를 삭제합니다.

    다음 단계에서 파이프라인 스택을 삭제할 경우 이 버킷이 비어 있어야 합니다. 그렇지 않으면, AWS CloudFormation에서 버킷을 삭제할 수 없습니다.

스택을 삭제하려면
  1. AWS CloudFormation 콘솔에서 삭제할 스택을 선택합니다.

    파이프라인에서 생성된 WordPress 스택이 여전히 실행 중인 경우 이들 스택을 먼저 선택합니다. 기본적으로 스택 이름은 Test-MyWordPressSiteProd-MyWordPressSite입니다.

    이미 WordPress 스택을 삭제한 경우 sample-WordPress-pipeline 스택을 선택합니다.

  2. [Actions]를 선택한 다음 [Delete Stack]을 선택합니다.

  3. 확인 메시지에서 예, 삭제를 선택합니다.

AWS CloudFormation은 EC2 인스턴스, 알림 주제, 서비스 역할 및 파이프라인 등 스택의 모든 리소스를 삭제합니다.

이제 CodePipeline을 사용하여 기본 AWS CloudFormation 워크플로를 구성하는 방법을 이해했으므로 샘플 템플릿 및 아티팩트에서 시작하여 자신만의 고유한 템플릿과 아티팩트를 구축할 수 있습니다.

다음 사항도 참조하십시오.

이러한 파라미터를 이용할 때 참조할 수 있는 관련 리소스는 다음과 같습니다.

  • CodePipeline의 AWS CloudFormation 작업 파라미터에 대한 자세한 내용을 알아보려면 AWS CodePipeline 사용 설명서AWS CloudFormation 작업 구성 참조를 참조하세요.

  • Owner 필드 또는 configuration 필드와 같은 작업 공급자별 예제 템플릿 값은 AWS CodePipeline 사용 설명서의 Action structure reference에서 확인하세요.

  • YAML 또는 JSON 형식의 예제 파이프라인 스택 템플릿을 다운로드하려면 AWS CodePipeline 사용 설명서AWS CloudFormation이 포함된 파이프라인 생성에서 자습서를 참조하세요.

  • 템플릿 예제 구성 파일은 AWS CloudFormation 아티팩트를 참조하세요.