이제 본격적인 블루/그린 배포를 위해 서비스를 생성해 보고 Bitbucket Pipeline 을 통해 자동으로 배포되게끔 스크립트를 구성해 보자.
1. [ECS] AWS ECS 세팅하기 - 3. 서비스 생성 - 블루/그린 배포 1
2. [ECS] AWS ECS 세팅하기 - 3. 서비스 생성 - 블루/그린 배포 2
서비스 생성하기 - 블루/그린 배포
1. 클러스터 > [서비스] 탭 > [생성] 버튼을 클릭한다.
2. 서비스 구성
3. 로드 밸런싱에 [ECS] AWS ECS 세팅하기 - 3. 서비스 생성 - 블루/그린 배포 1에서 만든 Application Load Balancer 를 연결한다.
4. 로드 밸런싱할 컨테이너 > [로드 밸런서에 추가] 버튼을 클릭하고 포트를 입력한다.
5. 로드 밸런서에 붙일 대상 그룹을 설정한다.
6. Auto Scaling 여부를 선택한다.
7. 서비스 생성이 완료됐다.
8. 블루/그린 배포의 경우 AWS CodeDeploy 를 이용하여 실행되기 때문에 CodeDeploy > [애플리케이션] 에 가면 아래와 같이 애플리케이션이 자동으로 생성되어 있는 것을 확인할 수 있다.
Bitbucket Pipeline 을 이용하여 AWS ECS에 배포하기
(Bitbucket Pipeline 을 이용하여 AWS ECR에 이미지 push하기 참고)
Bitbucket Pipeline 을 이용하여 블루/그린 배포를 하기 위해서는 2개의 설정파일이 필요하다. 1. 작업 정의와 관련된 설정파일, 2. 클러스터 서비스와 관련된 설정파일.
각 설정파일과 관련된 정보들은 ECS > 작업 정의 > 태스크 클릭 > [JSON] 탭에서 가져올 수 있다.
1. 설정파일 세팅하기
▷ ecs-task-definition.json
containerDefinitions 값을 복사해 오면 되는데, null 이 아닌 값들만 가져와서 json 파일로 만들어 준다.
{
"containerDefinitions": [
{
"name": "test",
"image": "${ECR IMAGE URI}",
"cpu": 0,
"portMappings": [
{
"containerPort": 1001,
"hostPort": 1001,
"protocol": "tcp"
}
],
"essential": true,
"environment": [],
"mountPoints": [],
"volumesFrom": [],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/test",
"awslogs-region": "ap-northeast-2",
"awslogs-stream-prefix": "ecs"
}
}
}
],
"family": "wms-prd",
"taskRoleArn": "${taskRoleArn}",
"executionRoleArn": "${executionRoleArn}",
"networkMode": "awsvpc",
"placementConstraints": [],
"requiresCompatibilities": [
"FARGATE"
],
"cpu": "256",
"memory": "512"
}
▷ codedeploy-appspec.json
TaskDefinition 값에는 taskDefinitionArn 값을 복사해서 붙여준다.
{
"version": 1,
"Resources": [
{
"TargetService": {
"Type": "AWS::ECS::Service",
"Properties": {
"TaskDefinition": "${taskDefinitionArn}",
"LoadBalancerInfo": {
"ContainerName": "test",
"ContainerPort": 1001
},
"PlatformVersion": "1.3.0"
}
}
}
]
}
2. Bitbucket Pipeline 에 환경변수 추가하기
AWS CodeDeploy 의 애플리케이션명과 배포 그룹명을 Deployments 환경변수에 추가한다.
* Staging 배포는 롤링 업데이트 방식을(참고: [ECS] AWS ECS 세팅하기 - 2. 서비스 생성 - 롤링 업데이트), Production 배포는 블루/그린 배포를 이용해 보자.
▷ bitbucket-pipeline.xml
pipelines:
tags:
production-*:
- step:
name: Docker build and push to AWS ECR and deploy yo AWS CodeDeploy
services:
- docker
image: atlassian/pipelines-awscli
deployment: Production
script:
- aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $AWS_ECR_REPOSITORY
- IMAGE=$AWS_ECR_REPOSITORY/$AWS_ECR_REPOSITORY_NAME
- TAG=$BITBUCKET_TAG
- docker build -t $IMAGE:$TAG .
--build-arg ES_HOST=$ES_HOST
--build-arg ES_USER=$ES_USER
--build-arg ES_PASSWORD=$ES_PASSWORD
- docker push $IMAGE:$TAG
- MANIFEST=$(aws ecr batch-get-image --region $AWS_REGION --repository-name $AWS_ECR_REPOSITORY_NAME --image-ids imageTag=$TAG --query 'images[].imageManifest' --output text)
- aws ecr put-image
--region $AWS_REGION
--repository-name $AWS_ECR_REPOSITORY_NAME
--image-tag production
--image-manifest "$MANIFEST"
- aws ecs deploy
--region $AWS_REGION
--task-definition ./ecs-task-definition.json
--cluster $AWS_ECS_CLUSTER
--service $AWS_ECS_SERVICE
--codedeploy-appspec ./codedeploy-appspec.json
--codedeploy-deployment-group $AWS_CODEDEPLOY_APPLICATION_GROUP
3. Bitbucket 에 push 하기
$ git tag production-0.0.1
$ git push origin production-0.0.1
'AWS' 카테고리의 다른 글
[Lambda] API Gateway + Lambda 를 이용하여 S3 에 이미지 업로드 (0) | 2021.12.20 |
---|---|
[AWS] Glue vs DataPipeline vs DMS vs Kinesis (0) | 2021.12.08 |
[ECS] AWS ECS 세팅하기 - 3. 서비스 생성 - 블루/그린 배포 1 (0) | 2021.09.08 |
[AWS] 서버리스 애플리케이션을 위한 AWS 메시징 서비스와 아키텍처 구현 패턴 (0) | 2021.07.30 |
[AWS] 어떤 컨테이너 서비스를 이용해야 하나요? (0) | 2021.07.30 |