자습서: Amazon ECS Standard 배포 CodePipeline - AWS CodePipeline

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

자습서: Amazon ECS Standard 배포 CodePipeline

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

중요

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

참고

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

사전 조건

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

참고

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

  • Dockerfile 및 애플리케이션 소스와 함께 소스 제어 리포지토리(이 자습서에서는 사용 CodeCommit) 자세한 내용은 AWS CodeCommit 사용 설명서의 리포지토리 생성을 CodeCommit 참조하세요.

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

  • 이미지 리포지토리에서 호스팅되는 Docker 이미지를 참조하는 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단계: 소스 리포지토리에 빌드 사양 파일 추가

이 자습서에서는 CodeBuild 를 사용하여 Docker 이미지를 빌드하고 이미지를 Amazon 로 푸시합니다ECR. 소스 코드 리포지토리에 buildspec.yml 파일을 추가하여 방법을 알아봅니다 CodeBuild. 아래의 빌드 사양 예제는 다음을 수행합니다.

  • 빌드 전 단계:

    • Amazon 에 로그인합니다ECR.

    • 리포지토리를 ECR 이미지URI에 설정하고 소스의 Git 커밋 ID의 처음 7자가 포함된 이미지 태그를 추가합니다.

  • 빌드 단계:

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

  • 빌드 후 단계:

    • 두 태그를 모두 사용하여 이미지를 ECR리포지토리로 푸시합니다.

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

이 샘플 텍스트를 붙여 넣어 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)을 Docker 이미지의 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. 에서 CodePipeline 콘솔을 엽니다https://console.aws.amazon.com/codepipeline/.

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

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

  3. 1단계: 이름 페이지에서 파이프라인 이름 에 파이프라인 이름을 입력합니다. 이 자습서에서 파이프라인 이름은 hello-world입니다.

  4. 파이프라인 유형 에서 V2를 선택합니다. 자세한 내용은 파이프라인 유형 단원을 참조하십시오. Next(다음)를 선택합니다.

  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. Next(다음)를 선택합니다.

      참고

      마법사는 빌드 프로젝트에 대한 CodeBuild 서비스 역할을 생성합니다. codebuild-build-project-name-service-role . 나중에 Amazon ECR 권한을 추가할 때 이 역할 이름을 기록해 둡니다.

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

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

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

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

    참고

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

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

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. 에서 IAM 콘솔을 엽니다https://console.aws.amazon.com/iam/.

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

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

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

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

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

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

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

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

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

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