자습서: CodePipeline을 사용한 Amazon ECS 표준 배포 - AWS CodePipeline

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

자습서: CodePipeline을 사용한 Amazon ECS 표준 배포

이 자습서에서는 CodePipeline을 통해 Amazon ECS를 사용하여 종단 간에 CD(Continuous Deployment) 파이프라인을 생성하는 방법을 설명합니다.

중요

콘솔에서 파이프라인을 생성하는 과정에서 CodePipeline은 S3 아티팩트 버킷을 아티팩트에 사용합니다. (이는 S3 소스 작업에 사용되는 버킷과 다릅니다.) S3 아티팩트 버킷이 파이프라인의 계정과 다른 계정에 있는 경우 S3 아티팩트 버킷을 안전하고 신뢰할 수 AWS 계정 있는가 소유해야 합니다.

참고

이 자습서는 CodePipeline의 Amazon ECS 표준 배포 작업에 대한 것입니다. CodePipeline의 Amazon ECS에서 CodeDeploy로의 블루/그린 배포 작업을 사용하는 자습서는 자습서: Amazon ECR 소스 및 ECS-to-CodeDeploy 배포를 사용하여 파이프라인 생성 단원을 참조하세요.

참고

이 자습서는 소스 작업이 있는 CodePipeline에 대한 Amazon ECS 표준 배포 작업을 위한 것입니다. Amazon ECSstandard 배포 작업을 CodePipeline의 ECRBuildAndPublish 빌드 작업과 함께 사용하여 이미지를 푸시하는 자습서는 섹션을 참조하세요자습서: CodePipeline을 사용하여 Docker 이미지를 빌드하고 Amazon ECR에 푸시.

사전 조건

이 자습서를 이용하여 CD 파이프라인을 만들려면 먼저 몇 가지 리소스를 갖춰야 합니다. 다음은 시작하기 위해 필요한 항목입니다.

참고

이러한 모든 리소스는 동일한 AWS 리전 내에 생성되어야 합니다.

  • Dockerfile 및 애플리케이션 소스에 대한 소스 컨트롤 리포지토리(이 자습서에서는 CodeCommit 사용). 자세한 내용은 AWS CodeCommit 사용 설명서CodeCommit 리포지토리 생성을 참조하세요.

  • Dockerfile 및 애플리케이션 소스에서 만든 이미지를 포함하는 도커 이미지 리포지토리(이 자습서에서는 Amazon ECR 사용). 자세한 내용은 Amazon Elastic Container Registry 사용 설명서리포지토리 생성이미지 푸시를 참조하세요.

  • 해당 이미지 리포지토리에서 호스팅되는 도커 이미지를 참조하는 Amazon ECS 작업 정의. 자세한 내용을 알아보려면 Amazon Elastic Container Service 개발자 안내서작업 정의 생성을 참조하세요.

    중요

    CodePipeline의 Amazon ECS 표준 배포 작업은 Amazon ECS 서비스에서 사용하는 수정 버전을 기반으로 작업 정의의 자체 수정 버전을 생성합니다. Amazon ECS 서비스를 업데이트하지 않고 작업 정의에 대한 새 수정 사항을 생성하면 배포 작업에서 해당 수정 사항을 무시합니다.

    다음은 이 자습서에서 사용된 샘플 태스크 정의입니다. namefamily에 사용하는 값은 빌드 사양 파일의 다음 단계에서 사용됩니다.

    { "ipcMode": null, "executionRoleArn": "role_ARN", "containerDefinitions": [ { "dnsSearchDomains": null, "environmentFiles": null, "logConfiguration": { "logDriver": "awslogs", "secretOptions": null, "options": { "awslogs-group": "/ecs/hello-world", "awslogs-region": "us-west-2", "awslogs-stream-prefix": "ecs" } }, "entryPoint": null, "portMappings": [ { "hostPort": 80, "protocol": "tcp", "containerPort": 80 } ], "command": null, "linuxParameters": null, "cpu": 0, "environment": [], "resourceRequirements": null, "ulimits": null, "dnsServers": null, "mountPoints": [], "workingDirectory": null, "secrets": null, "dockerSecurityOptions": null, "memory": null, "memoryReservation": 128, "volumesFrom": [], "stopTimeout": null, "image": "image_name", "startTimeout": null, "firelensConfiguration": null, "dependsOn": null, "disableNetworking": null, "interactive": null, "healthCheck": null, "essential": true, "links": null, "hostname": null, "extraHosts": null, "pseudoTerminal": null, "user": null, "readonlyRootFilesystem": null, "dockerLabels": null, "systemControls": null, "privileged": null, "name": "hello-world" } ], "placementConstraints": [], "memory": "2048", "taskRoleArn": null, "compatibilities": [ "EC2", "FARGATE" ], "taskDefinitionArn": "ARN", "family": "hello-world", "requiresAttributes": [], "pidMode": null, "requiresCompatibilities": [ "FARGATE" ], "networkMode": "awsvpc", "cpu": "1024", "revision": 1, "status": "ACTIVE", "inferenceAccelerators": null, "proxyConfiguration": null, "volumes": [] }
  • 앞에서 언급한 해당 작업 정의를 사용하는 서비스를 실행 중인 Amazon ECS 클러스터. 자세한 내용은 Amazon Elastic Container Service 개발자 안내서클러스터 생성서비스 생성을 참조하세요.

이러한 사전 조건을 모두 갖췄으면 이제 자습서를 이용하여 CD 파이프라인을 만들 수 있습니다.

1단계: 소스 리포지토리에 빌드 사양 파일 추가

이 자습서에서는 CodeBuild를 사용하여 도커 이미지를 생성하고 Amazon ECR에 이미지를 푸시합니다. buildspec.yml 파일을 소스 코드 리포지토리에 추가하여 CodeBuild가 작업을 수행하는 방식을 지정합니다. 아래의 빌드 사양 예제는 다음을 수행합니다.

  • 빌드 전 단계:

    • Amazon ECR에 로그인합니다.

    • 리포지토리 URI를 해당 ECR 이미지로 설정하고 이미지 태그와 소스의 Git 커밋 ID의 첫 7자를 추가합니다.

  • 빌드 단계:

    • 도커 이미지를 빌드하고 latest 및 Git 커밋 ID로 이미지에 태그를 지정합니다.

  • 빌드 후 단계:

    • ECR 리포지토리에 두 태그와 함께 이미지를 푸시합니다.

    • Amazon ECS 서비스의 컨테이너 이름과 이미지 및 태그를 포함하는 imagedefinitions.json 파일을 빌드 루트에 씁니다. CD 파이프라인의 배포 단계에서는 이 정보를 사용하여 개정된 서비스 작업 정의를 생성한 후 새로운 작업 정의를 사용하도록 서비스를 업데이트합니다. imagedefinitions.json 파일은 ECS 작업자에게 필요합니다.

이 샘플 텍스트를 붙여 넣어 buildspec.yml 파일을 생성하고 이미지 및 작업 정의의 값을 바꿉니다. 이 텍스트는 예제 계정 ID인 111122223333을 사용합니다.

version: 0.2 phases: pre_build: commands: - echo Logging in to Amazon ECR... - aws --version - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-west-2.amazonaws.com - REPOSITORY_URI=012345678910.dkr.ecr.us-west-2.amazonaws.com/hello-world - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7) - IMAGE_TAG=${COMMIT_HASH:=latest} build: commands: - echo Build started on `date` - echo Building the Docker image... - docker build -t $REPOSITORY_URI:latest . - docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG post_build: commands: - echo Build completed on `date` - echo Pushing the Docker images... - docker push $REPOSITORY_URI:latest - docker push $REPOSITORY_URI:$IMAGE_TAG - echo Writing image definitions file... - printf '[{"name":"hello-world","imageUri":"%s"}]' $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json artifacts: files: imagedefinitions.json

이 자습서의 경우 Amazon ECS 서비스에서 사용하는 사전 조건에서 제공된 샘플 태스크 정의에 대해 빌드 사양을 썼습니다. REPOSITORY_URI 값은 image 리포지토리(이미지 태그 제외)에 해당하고, 파일 끝부분의 hello-world 값은 서비스 작업 정의의 컨테이너 이름에 해당합니다.

buildspec.yml 파일을 해당 소스 리포지토리에 추가하려면
  1. 텍스트 편집기를 연 후 위의 빌드 사양을 복사하여 새 파일에 붙여 넣습니다.

  2. REPOSITORY_URI 값(012345678910.dkr.ecr.us-west-2.amazonaws.com/hello-world)을 해당 도커 이미지의 Amazon ECR 리포지토리 URI(이미지 태그 제외)로 바꿉니다. hello-world를 해당 서비스 작업 정의에서 도커 이미지를 참조하는 컨테이너 이름으로 바꿉니다.

  3. buildspec.yml 파일을 커밋한 후 소스 리포지토리에 푸시합니다.

    1. 파일을 추가합니다.

      git add .
    2. 변경 내용을 커밋합니다.

      git commit -m "Adding build specification."
    3. 커밋을 푸시합니다.

      git push

2단계: CD(Continuous Deployment) 파이프라인 만들기

CodePipeline 마법사를 사용하여 파이프라인 단계를 생성하고, 소스 리포지토리를 ECS 서비스에 연결합니다.

파이프라인을 생성하려면
  1. https://console.aws.amazon.com/codepipeline/에서 CodePipeline 콘솔을 엽니다.

  2. [Welcome] 페이지에서 [Create pipeline]을 선택합니다.

    CodePipeline을 처음으로 사용하는 경우 Welcome 페이지 대신 소개 페이지가 나타납니다. 지금 시작을 선택합니다.

  3. 1단계: 생성 옵션 선택 페이지의 생성 옵션에서 사용자 지정 파이프라인 빌드 옵션을 선택합니다. Next(다음)를 선택합니다.

  4. 2단계: 파이프라인 설정 선택에서 파이프라인 이름에 파이프라인 이름을 입력합니다. 이 자습서에서 파이프라인 이름은 hello-world입니다.

  5. 파이프라인 유형에서는 기본 선택을 V2로 유지합니다. 파이프라인 유형은 특성과 가격이 다릅니다. 자세한 내용은 파이프라인 유형 단원을 참조하십시오. Next(다음)를 선택합니다.

  6. 3단계: 소스 단계 추가 페이지의 소스 공급자에서 AWS CodeCommit를 선택합니다.

    1. 리포지토리 이름에서 파이프라인의 소스 위치로 사용할 CodeCommit 리포지토리의 이름을 선택합니다.

    2. 브랜치 이름에서 사용할 브랜치를 선택한 후 다음을 선택합니다.

  7. 4단계: 빌드 단계 추가 페이지에서 빌드 공급자에서 AWS CodeBuild를 선택한 다음 프로젝트 생성을 선택합니다.

    1. 프로젝트 이름에서 고유한 빌드 프로젝트 이름을 선택합니다. 이 자습서에서 프로젝트 이름은 hello-world입니다.

    2. 환경 이미지에서 이미지 관리를 선택합니다.

    3. 운영 체제에서 Amazon Linux 2를 선택합니다.

    4. 런타임에서 표준을 선택합니다.

    5. 이미지에서 aws/codebuild/amazonlinux2-x86_64-standard:3.0를 선택합니다.

    6. 이미지 버전환경 유형의 경우 기본값을 사용합니다.

    7. Docker 이미지를 빌드하거나 빌드에서 승격된 권한을 얻으려는 경우 이 플래그 활성화를 선택합니다.

    8. CloudWatch 로그를 선택 취소합니다. 고급을 확장해야 할 수도 있습니다.

    9. Continue to CodePipeline(CodePipeline으로 계속)을 선택합니다.

    10. Next(다음)를 선택합니다.

      참고

      마법사가 빌드 프로젝트를 위한 CodeBuild 서비스 역할(codebuild-build-project-name-service-role)을 생성합니다. 이 역할 이름은 나중에 Amazon ECR 권한을 역할에 추가할 때 필요하므로 메모해 둡니다.

  8. 5단계: 배포 단계 추가 페이지의 배포 공급자에서 Amazon ECS를 선택합니다.

    1. 클러스터 이름에서 해당 서비스가 실행 중인 Amazon ECS 클러스터를 선택합니다. 이 자습서에서는 클러스터가 default입니다.

    2. 서비스 이름에서 업데이트할 서비스를 선택한 후 다음을 선택합니다. 이 자습서에서 서비스 이름은 hello-world입니다.

  9. 6단계: 검토 페이지에서 파이프라인 구성을 검토하고 파이프라인 생성을 선택하여 파이프라인을 생성합니다.

    참고

    이제 파이프라인이 생성되었으며 다른 파이프라인 단계에서 이 파이프라인이 실행하려고 시도합니다. 하지만 마법사가 만든 기본 CodeBuild 역할이 buildspec.yml 파일에 포함된 모든 명령을 실행할 수 있는 권한을 갖고 있지 않으므로 빌드 단계가 실패합니다. 다음 단계에서는 빌드 단계를 위한 권한을 추가합니다.

3단계: CodeBuild 역할에 Amazon ECR 권한 추가

CodePipeline 마법사가 CodeBuild 빌드 프로젝트를 위한 IAM 역할(codebuild-build-project-name-service-role)을 생성했습니다. 이 자습서에서 이름은 codebuild-hello-world-service-role입니다. buildspec.yml 파일은 Amazon ECR API 작업을 호출하기 때문에 이 역할은 이러한 Amazon ECR 호출을 할 수 있는 권한을 허용하는 정책이 있어야 합니다. 다음 절차에서는 적절한 권한을 역할에 연결합니다.

CodeBuild 역할에 Amazon ECR 권한을 추가하려면
  1. https://console.aws.amazon.com/iam/에서 IAM 콘솔을 엽니다.

  2. 왼쪽 탐색 창에서 역할을 선택합니다.

  3. 검색란에 codebuild-를 입력하고 CodePipeline 마법사가 생성한 역할을 선택합니다. 이 자습서에서 역할 이름은 codebuild-hello-world-service-role입니다.

  4. 요약 페이지에서 정책 연결을 선택합니다.

  5. AmazonEC2ContainerRegistryPowerUser 정책 왼쪽의 상자를 선택하고 정책 연결을 선택합니다.

4단계: 파이프라인 테스트

파이프라인에는 end-to-end네이티브 AWS 지속적 배포를 실행하기 위한 모든 것이 있어야 합니다. 이제 소스 리포지토리에 코드 변경을 푸시하여 파이프라인 기능을 테스트해 보겠습니다.

파이프라인을 테스트하려면
  1. 구성된 소스 리포지토리에 대한 코드를 변경하고 커밋한 후 변경 사항을 푸시합니다.

  2. https://console.aws.amazon.com/codepipeline/에서 CodePipeline 콘솔을 엽니다.

  3. 목록에서 파이프라인을 선택합니다.

  4. 단계를 수행하면서 파이프라인 진행 상황을 관찰합니다. 파이프라인이 완료되고 코드 변경을 통해 생성된 도커 이미지를 Amazon ECS 서비스가 실행해야 합니다.