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

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

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

이 자습서는 Amazon ECS를 사용하여 완전한 end-to-end 지속적 배포 (CD) 파이프라인을 생성하는 데 도움이 됩니다. CodePipeline

참고

이 자습서는 Amazon ECS 표준 배포 작업을 위한 CodePipeline 것입니다. Amazon ECS를 사용하여 CodeDeploy 블루/그린 배포 작업을 수행하는 방법에 대한 자습서는 을 참조하십시오. CodePipeline 자습서: Amazon ECR 소스 및 ECS에서 배포할 때 사용하는 파이프라인 생성 CodeDeploy

필수 조건

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

참고

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

  • Dockerfile 및 애플리케이션 소스가 포함된 소스 제어 리포지토리 (이 자습서에서는 사용 CodeCommit). 자세한 내용은 사용 설명서의 CodeCommit리포지토리 만들기를 참조하십시오.AWS CodeCommit

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

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

    중요

    의 Amazon ECS 표준 배포 작업은 Amazon ECS 서비스에서 사용하는 수정 버전을 기반으로 작업 정의의 자체 수정 버전을 CodePipeline 생성합니다. 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단계: 소스 리포지토리에 빌드 사양 파일 추가

이 자습서에서는 Docker 이미지를 빌드하고 Amazon ECR로 이미지를 푸시하는 CodeBuild 데 사용합니다. 소스 코드 리포지토리에 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단계: 이름 페이지에서 파이프라인 이름에 파이프라인 이름을 입력합니다. 이 자습서에서 파이프라인 이름은 hello-world입니다.

  4. 파이프라인 유형에서 이 자습서의 목적에 맞는 V1을 선택합니다. V2를 선택할 수도 있지만 파이프라인 유형별 특성과 가격이 다르다는 점에 유의하십시오. 자세한 정보는 파이프라인 유형을 참조하세요. 다음을 선택하세요.

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

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

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

  6. 3단계: 빌드 단계 추가 페이지의 빌드 공급자에서 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. 계속하기를 CodePipeline 선택합니다.

    10. 다음을 선택합니다.

      참고

      마법사는 빌드 프로젝트에 대한 codebuild- build-project-name-service-role이라는 CodeBuild 서비스 역할을 만듭니다. 이 역할 이름은 나중에 Amazon ECR 권한을 역할에 추가할 때 필요하므로 메모해 둡니다.

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

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

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

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

    참고

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

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

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

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

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

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

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

  5. Amazon EC2 ContainerRegistryPowerUser 정책 왼쪽에 있는 상자를 선택하고 [정책 연결] 을 선택합니다.

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

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

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

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

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

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