다른 AWS 계정으로 Blue/Green 자동 배포(교차 계정 배포 @ECS Fargate)
AWS Fargate
에서 Blue/Green 자동 배포를 설정합니다(개발 환경-> 프로덕션 환경에 배포를 가정).소스 리포지토리에는
GitHub
, 빌드에는 CodeBuild
, 배포 파이프라인에는 CodePipeline
를 사용합니다.자동 빌드 설정은
CloudFormation
및 관리 콘솔을 사용합니다.※이하의 순서를 실행하면,
AWS
의 서비스 이용료가 발생합니다.※개발 환경(배포 원 환경), 프로덕션 환경(배포처 환경)의 전제로 기재합니다.
※개발 환경(배포 원본 환경), 프로덕션 환경(배포 대상 환경)의 Blue/Green 배포 설정은 완료되어 있는 것으로 합니다.
※
Fargate
의 Blue/Green 배포 설정은 아래를 참조하십시오.ECS Fargate에서 Blue/Green 배포 설정
※개발 환경(배포 원 환경)의 Blue/Green 자동 배치 설정은 완료되어 있는 것으로 합니다.
※
Fargate
의 Blue/Green 자동 배포는 아래를 참조하십시오.ECS Fargate에서 GitHub WebHook에 Blue/Green 자동 배포
※이번 샘플은 이하를 이용하고 있습니다.
htps : // 기주 b. 코 m / 테 로스 에 / c 로 s - 아코 t에서 p ぉ y - mp ぇ
구성 이미지
이번 구성의 이미지는 아래 그림과 같습니다.
1. 프로덕션 환경(배포 대상 환경) 사전 준비
ECR Push를 허용하는 역할 및 배포 구성 파일 배포
-> 이하
S3
를 yaml
또는 관리 콘솔에서 실행합니다( AWS CLI
).yaml
# ------------------------------------------------------------#
# Cross Account Role For Develop Account
# ------------------------------------------------------------#
ECRRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
AWS: !Sub arn:aws:iam::${TargetAccountId}:root #開発環境のアカウントIDをParameterに設定
Action: sts:AssumeRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryFullAccess #必要に応じ権限を絞る
RoleName: auto-deploy-for-fargate
# ------------------------------------------------------------#
# Bucket For DeploySetting
# ------------------------------------------------------------#
ECSDeploySettingBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub ${Env}-${ServiceName}-auto-deploy
VersioningConfiguration:
Status: Enabled
ECSDeploySettingBucketPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref ECSDeploySettingBucket
PolicyDocument:
Id: "Allow-Cross-Account-Access"
Version: '2012-10-17'
Statement:
- Sid: CrossAccountBucketPolicy
Effect: Allow
Principal:
AWS: !Sub arn:aws:iam::${TargetAccountId}:root #開発環境のアカウントIDをParameterに設定
Action:
- s3:*
Resource: !Sub arn:aws:s3:::${Env}-${ServiceName}-auto-deploy/*
※설정 파일의 전량은 아래를 참조하십시오.
htps : // 기주 b. 코 m / 테 로스 에 / c 로 s - 아코 t에서 p ぉ y - mp ぇ / b b b 로사코 응 t로 pぉyふぉrふぁr가. 또는 ml
2. 개발 환경(배포 원 환경)의 추가 설정(빌드/배포)
CloudFormation
에 다음을 추가하여 프로덕션 환경에 컨테이너 이미지와 배포 구성 파일을 연결합니다.-> 사용자 스위치없이 Push하면
CodeBuild
가 트리거되지 않으므로 계정을 전환합니다.-> 작업 정의 파일(
CodePipeline
)과 같은 AWS 계정 ID를 지정해야 하는 파일을 taskdef.json
의 환경 변수로 바꿉니다.buildspec.yaml
- echo ########## 【Production】 Prepare Deploy Settings ... on `date`
- PROD_REPOSITORY_URI=${PROD_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${IMAGE_NAME} #本番のアカウントIDでURIを生成
- docker tag $REPOSITORY_URI:latest $PROD_REPOSITORY_URI:latest
- docker tag $REPOSITORY_URI:$IMAGE_TAG $PROD_REPOSITORY_URI:$IMAGE_TAG
- sed -i -e "s/__ACOUNTID__/$PROD_ACCOUNT_ID/" .prod-config #クレデンシャルファイルを本番のアカウントIDで置換
- echo ########## 【Production】 Pushing the Docker image ... on `date`
- export AWS_CONFIG_FILE=.prod-config #クレデンシャルファイルパスを環境変数から設定
- $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION --profile cross-account-role) #本番環境で付与したアカウントでECRにログインする
- docker push $PROD_REPOSITORY_URI:latest #本番アカウントにイメージPush
- docker push $PROD_REPOSITORY_URI:$IMAGE_TAG
- echo ########## 【Production】 Writing Task Definitions file...
- sed -i -e "s/__ACOUNTID__/$PROD_ACCOUNT_ID/" taskdef.json #タスク定義ファイルを本番のアカウントIDで置換
- echo ########## 【Production】 Writing image definitions file...
- printf '{"Version":"1.0","ImageURI":"%s"}' $PROD_REPOSITORY_URI:$IMAGE_TAG > imageDetail.json #イメージ定義ファイルの書き出し
- echo ########## 【Production】 Sync Deploy Setting file...
- aws s3 cp appspec.yaml s3://prod-sample-app-auto-deploy/ --acl bucket-owner-full-control #本番アカウントでアクセスできるようにbucket-owner-full-controlオプション付与
- aws s3 cp taskdef.json s3://prod-sample-app-auto-deploy/ --acl bucket-owner-full-control
- aws s3 cp imageDetail.json s3://prod-sample-app-auto-deploy/ --acl bucket-owner-full-control
.prod-config
[profile cross-account-role]
credential_source = EcsContainer
role_arn = arn:aws:iam::__ACOUNTID__:role/auto-deploy-for-fargate ## 1.で作成したロール ※アカウントIDを置換
taskdef.json
{
"executionRoleArn": "arn:aws:iam::__ACOUNTID__:role/sample-app-ECSTaskExecutionRole", ## アカウントIDを置換
"containerDefinitions": [
{
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/var/log/sample-app",
"awslogs-region": "ap-northeast-1",
"awslogs-stream-prefix": "front"
}
},
"portMappings": [
{
"hostPort": 80,
"protocol": "tcp",
"containerPort": 80
}
],
"image": "<IMAGE_NAME>",
"name": "front"
}
],
"memory": "512",
"compatibilities": ["EC2", "FARGATE"],
"family": "sample-app-front",
"requiresCompatibilities": ["FARGATE"],
"networkMode": "awsvpc",
"cpu": "256"
}
imageDetail.json
{"Version":"1.0","ImageURI":"__ACOUNTID__.dkr.ecr.ap-northeast-1.amazonaws.com/sample-app:ec5b627"}
※설정 파일의 전량은 아래를 참조하십시오.
htps : // 기주 b. 코 m/테페로스에/c 롯 s-아코 t-에서 pぉyーさ mpぇ/bぉb/마s r/부이 ldsぺc후우 rC 로사코응 t. yml
※ 프로덕션의 AWS 계정에
CodeBuild
하지 않고 이미지를 Push 하면 AssumeRole
가 트리거되지 않습니다 (이하, 인용원).CodeBuild 빌드 내에서 AssumeRole (크로스 계정 액세스)하는 방법과 빠진 이야기
3. 프로덕션 환경(배포 대상 환경)의 빌드 파이프라인 생성
마지막으로
CodePipeline
와 관리 콘솔에서 프로덕션 빌드 파이프라인을 만듭니다.-> 타겟 소스는
CloudFormation
-> ECR
와 연관된 배포 구성 파일( S3
, appspec.yaml
, taskdef.json
)을 기반으로 imageDetail.json
에서 CodeDeploy
에 배포합니다.3-1. 파이프라인의 빌드 스테이지까지 작성
Fargate
를 yaml
또는 관리 콘솔에서 실행합니다 ( AWS CLI
).yaml
BuildProject:
Type: AWS::CodeBuild::Project
Properties:
Artifacts:
Type: CODEPIPELINE
Source:
Type: CODEPIPELINE
BuildSpec: |
version: 0.2
phases:
install:
runtime-versions:
docker: 18
post_build:
commands:
- aws s3 cp s3://prod-sample-app-auto-deploy/appspec.yaml . ## 連携されたデプロイ設定ファイルを取得
- aws s3 cp s3://prod-sample-app-auto-deploy/taskdef.json .
- aws s3 cp s3://prod-sample-app-auto-deploy/imageDetail.json .
- cat imageDetail.json
artifacts:
files:
- appspec.yaml
- taskdef.json
- imageDetail.json
Environment:
ComputeType: BUILD_GENERAL1_SMALL
Image: aws/codebuild/standard:3.0
Type: LINUX_CONTAINER
PrivilegedMode: true
LogsConfig:
CloudWatchLogs:
Status: ENABLED
Name: !Sub ${ServiceName}-codebuild
ServiceRole: !Ref CodeBuildServiceRole
BuildPipeline:
Type: AWS::CodePipeline::Pipeline
Properties:
Name: !Sub ${ServiceName}-codepipeline
RoleArn: !GetAtt CodePipelineServiceRole.Arn
ArtifactStore:
Type: S3
Location: !Ref ECSDeploySettingBucket
Stages:
- Name: Source
Actions:
- ActionTypeId:
Category: Source
Owner: AWS
Provider: ECR ## ECR Push Trigger
Version: 1
Name: Source
Configuration:
RepositoryName: !Ref ServiceName
OutputArtifacts:
- Name: BuildSource
RunOrder: 1
- Name: Build
Actions:
- ActionTypeId:
Category: Build
Owner: AWS
Provider: CodeBuild
Version: 1
Name: Build
Configuration:
ProjectName: !Ref BuildProject
InputArtifacts:
- Name: BuildSource
OutputArtifacts:
- Name: BuildOutPut
RunOrder: 1
※설정 파일의 전량은 아래를 참조하십시오.
htps : // 기주 b. 코 m / 테 로스 에 / c 로 s - 아코 t에서 p ぉ y - mp ぇ / b b b 로사코 응 t로 pぉyふぉrふぁr가. 또는 ml
3-2. 파이프라인 배포 단계 추가
방금 만든 빌드 파이프라인 끝에 Blue/Green 배포 설정을 추가합니다.
설정 방법은 아래를 참조하십시오.
ECS Fargate에서 Blue/Green 배포 설정
교차 계정 자동 배포 확인
변경 사항을
CloudFormation
로 푸시합니다.-> 샘플 프로젝트라면 index.html의 제목을 수정해보십시오.
다음과 같이 개발 환경과 프로덕션 환경에 성공적으로 배포되어야 합니다.
Reference
이 문제에 관하여(다른 AWS 계정으로 Blue/Green 자동 배포(교차 계정 배포 @ECS Fargate)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/takeshi_hirosue/items/e1ec87bf707ad69cdc93텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)