본문 바로가기
AWS

[ECS] AWS ECS 세팅하기 - 3. 서비스 생성 - 블루/그린 배포 2

by yonikim 2021. 9. 12.
728x90

이제 본격적인 블루/그린 배포를 위해 서비스를 생성해 보고 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
728x90