블루/그린 배포를 지원하기 위해 hello-server-prod 두 개의 대상 그룹 hello-server-blue 및 hello-server-green 프로덕션 로드 밸런서에서 ALB의 포트 80 수신기는 경로를 사용하여 트래픽을 전달하도록 구성됩니다.
랩 구축 단계 요약
먼저 로드 밸런서에서 대상 그룹을 설정하고 ECS 서비스를 생성합니다.
- 1단계: 파란색/녹색 대상 그룹을 만듭니다.
- 2단계: 프로덕션 서비스용 CloudWatch Logs 그룹.
- 3단계: 프로덕션 서비스에 대한 작업 정의를 만들고 등록합니다.
- 4단계: 프로덕션용 ECS 서비스를 생성합니다.
다음으로 CodeDeploy 애플리케이션을 설정합니다.
- 5단계: 작업 정의 및 앱 사양 파일을 소스 리포지토리에 추가합니다.
- 6단계. CodeDeploy 애플리케이션을 생성합니다.
- 7단계: 프로덕션 클러스터에 대한 CodeDeploy 배포 그룹을 생성 및 구성합니다.
파이프라인에 두 단계를 추가합니다.
- 8단계: 빌드 사양을 업데이트합니다.
- 9단계: 승인 단계를 추가합니다.
- 10단계: DeployProd 단계를 추가합니다.
구성 및 애플리케이션 변경 사항을 푸시하여 파이프라인을 테스트합니다.
- 11단계: 구성 변경 사항을 푸시합니다(파이프라인 트리거).
- 12단계: 파이프라인을 관찰하고 프로덕션 배포를 승인합니다.
- 13단계: 프로덕션 애플리케이션을 테스트합니다.
- 14단계: 변경 사항을 생성하고 애플리케이션 코드에 푸시합니다.
- 15단계: 파이프라인을 관찰하고 프로덕션에 배포를 승인합니다.
1단계: 파란색/녹색 대상 그룹을 만듭니다.
save_var PROD_VPC $( \
aws cloudformation describe-stacks \
--stack-name prod-cluster \
--query "Stacks[0].Outputs[?OutputKey == 'VpcId'].OutputValue" --output text \
)
save_var PROD_BLUE_TG_ARN $( \
aws elbv2 create-target-group \
--name hello-server-blue \
--port 80 \
--protocol HTTP \
--health-check-path /ping \
--health-check-timeout-seconds 3 \
--health-check-interval-seconds 5 \
--healthy-threshold-count 2 \
--target-type instance \
--vpc-id $PROD_VPC \
--query "TargetGroups[0].TargetGroupArn" \
--output text \
)
aws elbv2 modify-target-group-attributes \
--target-group-arn $PROD_BLUE_TG_ARN \
--attributes "Key=deregistration_delay.timeout_seconds,Value=5"
save_var PROD_GREEN_TG_ARN $( \
aws elbv2 create-target-group \
--name hello-server-green \
--port 80 \
--protocol HTTP \
--health-check-path /ping \
--health-check-timeout-seconds 3 \
--health-check-interval-seconds 5 \
--healthy-threshold-count 2 \
--target-type instance \
--vpc-id $PROD_VPC \
--query "TargetGroups[0].TargetGroupArn" \
--output text \
)
aws elbv2 modify-target-group-attributes \
--target-group-arn $PROD_GREEN_TG_ARN \
--attributes "Key=deregistration_delay.timeout_seconds,Value=5"
블루 대상 그룹으로 라우팅하는 리스너 규칙을 추가합니다.
cd ~/environment
mkdir lab-2
cd lab-2
cat <<EoF >conditions-pattern.json
[
{
"Field": "path-pattern",
"PathPatternConfig": {
"Values": ["/hello/*"]
}
}
]
EoF
cat <<EoF >actions_blue.json
[
{
"Type": "forward",
"ForwardConfig": {
"TargetGroups": [ { "TargetGroupArn": "$PROD_BLUE_TG_ARN" } ]
}
}
]
EoF
save_var PROD_LISTENER_ARN $( \
aws cloudformation describe-stacks \
--stack-name prod-cluster \
--query "Stacks[0].Outputs[?OutputKey == 'PublicListener'].OutputValue" \
--output text \
)
save_var PROD_LISTENER_RULE_ARN $( \
aws elbv2 create-rule \
--listener-arn $PROD_LISTENER_ARN \
--priority 10 \
--conditions file://conditions-pattern.json \
--actions file://actions_blue.json \
--query "Rules[0].RuleArn" \
--output text \
)
콘솔을 사용하여 로드 밸런서 규칙을 검사하여 이 경로가 올바르게 설정되었는지 확인합니다.
2단계: 프로덕션 서비스용 CloudWatch Logs 그룹 생성
aws logs create-log-group --log-group-name /ecs/hello-server-prod
3단계: 프로덕션 서비스에 대한 작업 정의를 만들고 등록합니다.
cd ~/environment/lab-2
envsubst < ~/environment/cicd-for-ecs-workshop-code/lab-2/taskdef-prod-hello-server.json.template > taskdef-prod.json
cat taskdef-prod.json
aws ecs register-task-definition --cli-input-json file://taskdef-prod.json
작업 정의는 태그 없이 이미지의 위치를 지정합니다. 기본적으로 latest 이미지가 자동으로 선택됩니다.
4단계: 프로덕션용 ECS 서비스를 생성합니다.
cd ~/environment/lab-2
envsubst < ~/environment/cicd-for-ecs-workshop-code/lab-2/service-prod-hello-server.json.template > service-prod.json
cat service-prod.json
#서비스 생성
aws ecs create-service --service-name hello-server-prod --cli-input-json file://service-prod.json
#서비스 작동 확인
save_var PROD_ALB_URL $( \
aws cloudformation describe-stacks \
--stack-name prod-cluster \
--query "Stacks[0].Outputs[?OutputKey == 'ExternalUrl'].OutputValue" \
--output text \
)
curl $PROD_ALB_URL/hello/bob
5단계: 작업 정의 및 앱 사양 파일을 소스 리포지토리에 추가합니다.
cd ~/environment/hello-server
cp ../lab-2/taskdef-prod.json .
cp ~/environment/cicd-for-ecs-workshop-code/lab-2/appspec-hello-server.yaml ./appspec.yaml
taskdef-prod.json 파일에 image 속성의 현재 값을 <IMAGE_NAME>으로 변경합니다.
mv taskdef-prod.json old-taskdef-prod.json
jq '.containerDefinitions[0].image="<IMAGE_NAME>"' old-taskdef-prod.json > taskdef-prod.json
rm old-taskdef-prod.json
cat taskdef-prod.json
#커밋에 포함하기 위해 파일을 추가합니다.
git add -A
6단계. CodeDeploy 애플리케이션을 생성합니다.
cd ~/environment/lab-2
cat <<EoF > codedeploy_trust_policy_doc.json
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "codedeploy.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
EoF
AWSCodeDeployRoleForECS 관리형 정책을 역할에 연결합니다.
save_var CODEDEPLOY_ROLE_NAME Cloud9-CodeDeploy-Role-$(date +%s)
save_var CODEDEPLOY_ROLE_ARN $( \
aws iam create-role \
--role-name $CODEDEPLOY_ROLE_NAME \
--assume-role-policy-document file://codedeploy_trust_policy_doc.json \
--query Role.Arn \
--output text \
)
aws iam attach-role-policy \
--role-name $CODEDEPLOY_ROLE_NAME \
--policy-arn arn\:aws\:iam::aws\:policy/AWSCodeDeployRoleForECS
AWS Codeploy Console(console.aws.amazon.com/codedeploy)에 접근한 다음 애플리케이션을 생성합니다.
- 먼저 애플리케이션 생성을 선택합니다.
- 애플리케이션 이름은 hello-server로 설정합니다.
- 컴퓨팅 플랫폼은 Amazon ECS를 선택합니다.
- 애플리케이션 생성을 선택합니다.
7단계: 프로덕션 클러스터에 대한 CodeDeploy 배포 그룹을 생성 및 구성합니다.
- 배포 그룹 생성을 선택합니다.(우측 하단)
- 배포 그룹 이름을 입력합니다. hello-server-prod
- 서비스 역할은 이전에 생성해준 Role을 연결합니다.
- 환경 구성 Cluster Name은 prod를 선택하고 서비스 이름은 hello-server-prod를 선택합니다.
- 로드 벨런서 부분은 아래와 같이 설정합니다.
- 배포 설정은 그대로 둡니다. 그런 다음 배포 그룹 생성을 선택합니다.
8단계: 빌드 사양을 업데이트합니다. buildspec.yml 파일에 부분을 수정합니다. (경로: hello-server/buildspec.yml)
version: 0.2
env:
exported-variables:
- AWS_DEFAULT_REGION
phases:
pre_build:
commands:
- echo Logging in to Amazon ECR...
- aws --version
- $(aws ecr get-login --region $AWS_DEFAULT_REGION --no-include-email)
- REPOSITORY_URI=xxxxxxx1231.dkr.ecr.ap-northeast-2.amazonaws.com/hello-server #수정합니다.
- 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-server","imageUri":"%s"}]' $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json
- printf '{"ImageURI":"%s"}' $REPOSITORY_URI:$IMAGE_TAG > imageDetail.json
artifacts:
files:
- imagedefinitions.json
- imageDetail.json
- appspec.yaml
- taskdef-prod.json
저장 한다음 아래 명령을 입력합니다. 단, 아직 commit, Push 절차는 하지 않습니다.
cd ~/environment/hello-server
git add .
9단계: 승인 단계를 추가합니다. AWS CodePipeline 콘솔에서 파이프라인으로 이동하여 다음 단계를 실행합니다.
- Codepipeline 서비스 부분에서 편집을 선택합니다.
- 페이지 하단으로 스크롤 합니다.
- Deploy 아래에 있는 스테이지 추가를 선택합니다.
- 단계 이름을 입력하고 승인 합니다.
- 단계 추가를 선택합니다. 아래 Apporve와 같아야합니다.
- 작업 그룹 추가를 선택합니다.
- 작업 이름을 입력합니다.
- 작업 공급자에서 수동 승인을 선택합니다.
- 검토용 URL에 입력을 합니다. 아래에 Note에 복사 해서 붙여넣습니다.
https://console.aws.amazon.com/codesuite/codecommit/repositories/hello-server/commit/#{SourceVariables.CommitId}?region=#{BuildVariables.AWS_DEFAULT_REGION}
설명 부분에 Codecommit message: #{SourceVariables.CodecommitMessage} 를 입력합니다
URL에서 및 주석 파이프라인 변수를 사용하여 검토할 커밋과 커밋 메시지에 대한 링크를 동적으로 생성했습니다.
10단계: DeployProd 단계를 추가합니다.
- 현재 실습 부분에서 그대로 진행합니다. 파이프라인 페이지 맨 아래로 스크롤하고 승인 단계 아래에서 스테이지 추가를 선택합니다.
- 단계이름을 입력합니다.
- 작업 공급자에서 Amazon ECS(Blue/Green)을 선택합니다
- 입력 아티펙트는 BuildArtifact를 선택합니다
- CodeDeploy 애플리케이션 이름을 선택합니다
- CodeDeploy 배포 그룹을 선택합니다.
- ECS 작업 정의는 BuildArtifact를 선택 후, taskdef-prod.json을 입력합니다.
- AWS CodeDeploy Appspec File의 경우, BuildArtifact를 선택 후 appspec.yml을 입력합니다.
- 이미지 세부 정보가 있는 입력 아티펙트의 BuildArtifact를 선택 후 IMAGE_NAME을 입력합니다.
- 완료를 선택합니다. 그런 다음 상단에 저장을 선택합니다. 그럼 현재 CodePipeline에 아래 모습은 아래와 같습니다.
11단계: 구성 변경 사항을 푸시합니다(파이프라인 트리거).
git commit -m "Configuration changes"
git push origin master
12단계: 파이프라인을 관찰하고 프로덕션 배포를 승인합니다. 11단계의 Code 메시지와 검토용 URL이 포함된 대화 상자가 표시됩니다. Approve 부분에서 말입니다. 이제 그럼 사용자는 해야할 행동이 Approve 부분에서 검토를 선택합니다.
- 그런 다음 검토할 URL을 선택합니다. 그리고 작업에 대한 설명도 Configuration changes를 확인하실 수 있습니다.
- 그럼 안에 이제 Commit 한 데이터를 사용자가 확인할 수 있습니다.
- 검토 대화 상자로 돌아가서 일부 검토 의견을 입력한 다음 승인을 눌러 실행을 활성화하여 프로덕션 단계로 배포를 진행할 수 있습니다.
- 승인이 되면 Blue/ Green 배포가 정상적으로 작동하는 것을 확인하실 수 있습니다.
- 배포 완료 !!!!!!!!!!
- 이제 Curl를 해볼까요?
curl $PROD_ALB_URL/hello/bob
1시간 뒤에는 완전히 대체로 실행중인 Service를 연결합니다.
'2022년 전에 정리한 문서들' 카테고리의 다른 글
EKS - Bastion Instance(Controller Instance) (0) | 2022.08.24 |
---|---|
EKS - VPC 생성 (0) | 2022.08.24 |
ECS CI/CD Workshop 정리(3) - Rolling Deploy (0) | 2022.08.23 |
Md를 사용해서 Codecommit에 Docker Push 까지 명령어 보여주기 (0) | 2022.08.23 |
ECS CI/CD Workshop 정리(2) (0) | 2022.08.23 |