다른 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를 허용하는 역할 및 배포 구성 파일 배포
-> 이하 S3yaml 또는 관리 콘솔에서 실행합니다( 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. 파이프라인의 빌드 스테이지까지 작성


Fargateyaml 또는 관리 콘솔에서 실행합니다 ( 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의 제목을 수정해보십시오.

다음과 같이 개발 환경과 프로덕션 환경에 성공적으로 배포되어야 합니다.

좋은 웹페이지 즐겨찾기