안녕하세요 :)
오래간만의 포스팅입니다.
오늘은 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