🌱 Infra/Container_AWS_ECS

[CodePipeline] ECR을 소스로 해서 CodeDeploy로 ECS 배포하기

mini_world 2022. 7. 16. 02:24
목차 접기

안녕하세요 :) 
오래간만의 포스팅입니다.

오늘은 ECR에 이미지가 Push 되면, ECS서비스 배포 방식(blue/green, rolling)에 따라 ECS에 배포하는 방법을 작성합니다.
그냥, ECR 레포지토리에 latest 태그를 가진 도커이미지가 push 되면, 바로 배포되게끔... 구성합니다.

AWS 공식 문서는 여기를 참조할 수 있으며, ECS 서비스가 이미 구성 되어있다고 가정합니다.

 


📌 아키텍쳐

 

 


📌 Step 1) CodeCommit 구성

codecommit이 아니어도 괜찮습니다. Github, Bitbucket도 가능합니다.

  • 코드커밋 리포지토리를 생성합니다.
  • 블루/그린 배포를 사용할 경우 appspec.yaml, taskdef.json 두개의 파일이 필요합니다.
  • 롤링 배포를 사용할 경우 imagedefinitions.json 하나의 파일이 필요합니다.
  • 각 배포 방식에 맞는 파일을 CodeCommit에 업로드 하여 준비합니다.

 

👇 appspec.yaml 샘플

더보기

컨테이너 설정에 맞게 ContainerName, ContainerPort 두개만 수정하면 됩니다.

version: 0.0
Resources:
  - TargetService:
      Type: AWS::ECS::Service
      Properties:
        TaskDefinition: <TASK_DEFINITION>
        LoadBalancerInfo:
          ContainerName: "컨테이너 이름"
          ContainerPort: 80
        CapacityProviderStrategy:
          - Base: 0
            CapacityProvider: "용량공급자 이름"
            Weight: 1
# # Optional properties
#         PlatformVersion: "LATEST"
#         NetworkConfiguration:
#             AwsvpcConfiguration:
#               Subnets: ["subnet-name-1", "subnet-name-2"]
#               SecurityGroups: ["security-group"]
#               AssignPublicIp: "ENABLED"
# Hooks:
# - BeforeInstall: "BeforeInstallHookFunctionName"
# - AfterInstall: "AfterInstallHookFunctionName"
# - AfterAllowTestTraffic: "AfterAllowTestTrafficHookFunctionName"
# - BeforeAllowTraffic: "BeforeAllowTrafficHookFunctionName"
# - AfterAllowTraffic: "AfterAllowTrafficHookFunctionName"

 

👇 taskdef.json 샘플

더보기

"aws ecs describe-task-definition --task-definition <작업정의:버전>"을 터미널에서 실행하여 값을 확인하고, 
"taskDefinition" 키 아래의 값을 모두 그대로 사용하면 됩니다. 
taskdef.jon에 정의된 데로 컨테이너가 실행되기때문에 주의가 필요합니다.

{
    "executionRoleArn": "arn:aws:iam::account_ID:role/ecsTaskExecutionRole",
    "containerDefinitions": [
        {
            "name": "sample-website",
            "image": "<IMAGE1_NAME>",
            "essential": true,
            "portMappings": [
                {
                    "hostPort": 80,
                    "protocol": "tcp",
                    "containerPort": 80
                }
            ]
        }
    ],
    "requiresCompatibilities": [
        "FARGATE"
    ],
    "networkMode": "awsvpc",
    "cpu": "256",
    "memory": "512",
    "family": "ecs-demo"
}

 

👇  imagedefinitions.json 샘플

더보기

 제일 간단합니다. 컨테이너 이름과 이미지 태그를 지정합니다.

[
  {
    "name": "컨테이너 이름"
    "imageUri": "이미지URL:latest"
  }
]

 

 

📌 Step 2) CodePipeline 구성

결과 먼저 보자면, 아래처럼 구성되면 됩니다. 
주의해야할 부분은 CodeCommit/Github/bitbucket 먼저 소스에 등록한 후 ECR을 등록해야 합니다.

1) Source에 레포지토리를 등록합니다.

2) 빌드 단계를 건너뜁니다.

3) 배포 스테이지에서 배포할 ECS 서비스 를 선택합니다. 직관적이기때문에.. 캡쳐 없이 지나가도록 하겠습니다.
     완료 버튼을 누릅니다.

4) 코드파이프라인 수정 -> 소스 스테이지 편집을 누르고 ECR을 추가합니다.
     이때 출력 아티펙트 이름을 지정합니다. AWS 공식자습서 문서에 따라 "MyImage"로 지정했지만 이름은 다른것으로 해도 괜찮습니다.

5) 위 단계에서 추가한 ECR 소스를 트리거 할 수 있도록 Deploy도 수정합니다.
     입력 아티팩트에 MyImage를 추가합니다.

      아래로 스크롤 다운하여 "이미지 세부 정보가 있는 입력 아티팩트" - "MyImage"를 선택하고,
       "작업 정의의 자리 표시자 텍스트"- "IMAGE1_NAME"을 입력합니다.
       작업정의의 자리 표시자 텍스트는 taskdef.json에서 정의했었습니다.

📌 Step 3) 테스트

 

이제 잘 동작하는지 테스트 해봅시다.
ECR 레포에 이미지를 push 해보세요! 잘 될겁니다.

 


https://docs.aws.amazon.com/ko_kr/codepipeline/latest/userguide/tutorials-ecs-ecr-codedeploy.html

 

자습서: Amazon ECR 소스와 ECS-to-CodeDeploy 배포를 사용하여 파이프라인 생성 - AWS CodePipeline

이러한 단계를 사용하여 Amazon ECS 클러스터를 생성하는 경우네트워킹만 가능클러스터 템플릿, 프로비저닝AWSFargate 컨테이너.AWS Fargate는 컨테이너 인스턴스 인프라를 관리하는 기술입니다. Amazon E

docs.aws.amazon.com

 

 

728x90