기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
자습서: Amazon ECS 표준 배포를 사용한 CodePipeline
이 자습서는 Amazon ECS를 사용하여 완전한 end-to-end 지속적 배포 (CD) 파이프라인을 생성하는 데 도움이 됩니다. CodePipeline
참고
이 자습서는 Amazon ECS 표준 배포 작업을 위한 CodePipeline 것입니다. Amazon ECS를 사용하여 CodeDeploy 블루/그린 배포 작업을 수행하는 방법에 대한 자습서는 을 참조하십시오. CodePipeline 자습서: Amazon ECR 소스 및 ECS-to-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 서비스를 업데이트하지 않고 작업 정의에 대한 새 수정 사항을 생성하면 배포 작업에서 해당 수정 사항을 무시합니다.
다음은 이 자습서에서 사용된 샘플 태스크 정의입니다.
name
및family
에 사용하는 값은 빌드 사양 파일의 다음 단계에서 사용됩니다.{ "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
파일을 해당 소스 리포지토리에 추가하려면
-
텍스트 편집기를 연 후 위의 빌드 사양을 복사하여 새 파일에 붙여 넣습니다.
-
REPOSITORY_URI
값(
)을 해당 도커 이미지의 Amazon ECR 리포지토리 URI(이미지 태그 제외)로 바꿉니다.012345678910.dkr.ecr.us-west-2.amazonaws.com/hello-world
를 해당 서비스 작업 정의에서 도커 이미지를 참조하는 컨테이너 이름으로 바꿉니다.hello-world
-
buildspec.yml
파일을 커밋한 후 소스 리포지토리에 푸시합니다.-
파일을 추가합니다.
git add .
-
변경 내용을 커밋합니다.
git commit -m "Adding build specification."
-
커밋을 푸시합니다.
git push
-
2단계: CD(Continuous Deployment) 파이프라인 만들기
CodePipeline 마법사를 사용하여 파이프라인 단계를 생성하고 소스 리포지토리를 ECS 서비스에 연결합니다.
파이프라인을 생성하려면
https://console.aws.amazon.com/codepipeline/
에서 CodePipeline 콘솔을 엽니다. -
[Welcome] 페이지에서 [Create pipeline]을 선택합니다.
처음 사용하는 CodePipeline 경우 Welcome 대신 소개 페이지가 나타납니다. 지금 시작을 선택합니다.
-
1단계: 이름 페이지에서 파이프라인 이름에 파이프라인 이름을 입력합니다. 이 자습서에서 파이프라인 이름은 hello-world입니다.
-
파이프라인 유형에서 이 자습서의 목적에 맞는 V1을 선택합니다. V2를 선택할 수도 있지만 파이프라인 유형별 특성과 가격이 다르다는 점에 유의하십시오. 자세한 설명은 파이프라인 유형 섹션을 참조하세요. 다음을 선택하세요.
-
2단계: 소스 단계 추가 페이지의 소스 공급자에서 AWS CodeCommit를 선택합니다.
-
Repository name에서 CodeCommit 리포지토리 이름을 선택하여 해당 파이프라인의 소스 위치로 사용합니다.
-
브랜치 이름에서 사용할 브랜치를 선택한 후 다음을 선택합니다.
-
-
3단계: 빌드 단계 추가 페이지의 빌드 공급자에서 AWS CodeBuild를 선택한 후 프로젝트 생성을 선택합니다.
-
프로젝트 이름에서 고유한 빌드 프로젝트 이름을 선택합니다. 이 자습서에서 프로젝트 이름은 hello-world입니다.
-
환경 이미지에서 이미지 관리를 선택합니다.
-
운영 체제에서 Amazon Linux 2를 선택합니다.
-
런타임에서 표준을 선택합니다.
-
이미지에서
aws/codebuild/amazonlinux2-x86_64-standard:3.0
를 선택합니다. -
이미지 버전 및 환경 유형의 경우 기본값을 사용합니다.
-
Docker 이미지를 빌드하거나 빌드에서 승격된 권한을 얻으려는 경우 이 플래그 활성화를 선택합니다.
-
CloudWatch 로그를 선택 취소합니다. 고급을 확장해야 할 수도 있습니다.
-
계속하기를 CodePipeline 선택합니다.
-
다음을 선택합니다.
참고
마법사는 빌드 프로젝트에 대한 codebuild-
build-project-name
-service-role이라는 CodeBuild 서비스 역할을 만듭니다. 이 역할 이름은 나중에 Amazon ECR 권한을 역할에 추가할 때 필요하므로 메모해 둡니다.
-
-
4단계: 배포 단계 추가 페이지의 배포 공급자에서 Amazon ECS를 선택합니다.
-
클러스터 이름에서 해당 서비스가 실행 중인 Amazon ECS 클러스터를 선택합니다. 이 자습서에서는 클러스터가 default입니다.
-
서비스 이름에서 업데이트할 서비스를 선택한 후 다음을 선택합니다. 이 자습서에서 서비스 이름은 hello-world입니다.
-
-
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
https://console.aws.amazon.com/iam/
에서 IAM 콘솔을 엽니다. -
왼쪽 탐색 창에서 역할을 선택합니다.
-
검색 상자에 codebuild-를 입력하고 마법사가 생성한 역할을 선택합니다. CodePipeline 이 자습서에서는 역할 이름이 codebuild-hello-world-service-role입니다.
-
요약 페이지에서 정책 연결을 선택합니다.
-
Amazon EC2 ContainerRegistryPowerUser 정책 왼쪽에 있는 상자를 선택하고 [정책 연결] 을 선택합니다.
4단계: 파이프라인 테스트
파이프라인에는 end-to-end 네이티브 AWS 지속적 배포를 실행하기 위한 모든 것이 포함되어 있어야 합니다. 이제 소스 리포지토리에 코드 변경을 푸시하여 파이프라인 기능을 테스트해 보겠습니다.
파이프라인을 테스트하려면
-
구성된 소스 리포지토리에 대한 코드를 변경하고 커밋한 후 변경 사항을 푸시합니다.
https://console.aws.amazon.com/codepipeline/
에서 CodePipeline 콘솔을 엽니다. -
목록에서 파이프라인을 선택합니다.
-
단계를 수행하면서 파이프라인 진행 상황을 관찰합니다. 파이프라인이 완료되고 코드 변경을 통해 생성된 도커 이미지를 Amazon ECS 서비스가 실행해야 합니다.