8
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【AWS】ECS構築の基礎 −Blue/Greenデプロイ編−

Last updated at Posted at 2021-07-11

#はじめに
前回の記事でCodeCommit, CodeBuild, CodePipelineを使って、AWSサービスのみでCI/CDパイプラインを構築しました。
今回は構築したパイプラインにBlue/Greenデプロイを追加して、CodeDeployから制御してみました。

ECS初心者向けの記事を何本か書いていますので、どれか参考になれば幸いです。

#Blue/Greenデプロイ
Blue/Greenデプロイは、アプリケーションやマイクロサービスの古いバージョン(Blue環境)からテスト済の新しいバージョン(Green環境)に、ユーザートラフィックを徐々に転送するリリースモデルで、両バージョンが稼働中の状態で実施するものです。

BlueからGreenへのトラフィックの転送が完了すると、Blueはロールバックに備えてスタンバイさせるか、あるいはプロダクションからプルして更新し、次回の更新の際にテンプレートとして使用することができます。

ECSやFargateでBlue/Greenデプロイを実行するために、CodeDeployを使用します。

##実装
前回の記事で作成したCI/CDパイプラインに以下の手順でBlue/Greenデプロイを追加します。

  1. IAMロールの作成
  2. ELBリスナーの作成
  3. サービスの作成
  4. buildspec.ymlの作成
  5. appspec.yamlの作成
  6. taskdef.jsonの作成
  7. Buildの編集
  8. Deployの編集
  9. パイプラインの実行

###IAMロールの作成
CodeDeploy - ECSというユースケースを選択します。
スクリーンショット 2021-07-10 10.19.09.png

この中にはAWSCodeDeployRoleForECSというポリシー(中身は以下)が含まれています。
スクリーンショット 2021-07-10 10.21.22.png

CodeDeployServiceRoleと名付けます。
スクリーンショット 2021-07-10 10.22.00.png

###ELBリスナーの作成
次にELBでリスナーを作成します。
リスナーは設定したプロトコルとポートを使用して接続リクエストをチェックするプロセスです。
リスナーに対して定義したルールによって、ELBが登録済みターゲットにリクエストをルーティングする方法が決まります。

プロダクションリスナーを新しく追加します。
スクリーンショット 2021-07-10 10.35.27.png

また、検証テストを使用するECSデプロイには2番目のリスナー(テストリスナー)が必要です。
このリスナーは、更新されたアプリケーションにテストトラフィックを提供するために置き換えタスクセットで使用されます。
検証テストは、テストトラフィックに対して実行されます。

HTTP:8088でTestリスナーを作成します。
スクリーンショット 2021-07-10 10.37.10.png

###サービスの作成
ECSクラスターecs-serviceに新しくサービスを作成します。
タスク定義やクラスターを選択して、サービス名を設定します。
スクリーンショット 2021-07-10 10.43.09.png

デプロイメントタイプ、デプロイメント設定、CodeDeployのサービスロールをそれぞれ選択します。
スクリーンショット 2021-07-10 10.43.28.png

ELBの設定で、プロダクションリスナーポートやテストリスナーポートを選択します。
スクリーンショット 2021-07-10 10.48.11.png

以上の設定でサービスを作成します。
ELBのリスナーの中身をみてみると、ターゲットグループが正しく設定されています。
スクリーンショット 2021-07-10 10.51.19.png

また、CodeDeployを開くと作成したアプリケーションの中身も確認できます。
スクリーンショット 2021-07-10 10.54.00.png

###buildspec.ymlの修正
artifactsの記述を修正します。

version: 0.2

phases:
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - aws --version
      - echo $AWS_DEFAULT_REGION
      - $(aws ecr get-login --region $AWS_DEFAULT_REGION --no-include-email)
      - REPOSITORY_URI=<<account-id>>.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-simplehttp
      - 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`
      - docker push $REPOSITORY_URI:latest
      - docker push $REPOSITORY_URI:$IMAGE_TAG
      - printf '[{"name":"simplehttp-container","imageUri":"%s"}]' $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json
      - printf '{"ImageURI":"%s"}' $REPOSITORY_URI:$IMAGE_TAG > imageDetail.json
artifacts:
  files:
    - 'image*.json'
    - 'appspec.yaml'
    - 'taskdef.json'
  secondary-artifacts:
    DefinitionArtifact:
      files:
        - appspec.yaml
        - taskdef.json
    ImageArtifact:
      files:
        - imageDetail.json

###appspec.yamlの作成
ルートディレクトリに新しくAppSpecファイルappspec.yamlを作成します。
AppSpecファイルでは、ECSサービスの名前と、新しいタスクセットにトラフィックを送信するために使用されるコンテナ名とポートなどを指定します。

appspec.yaml
version: 0.0

Resources:
  - TargetService:
      Type: AWS::ECS::Service
      Properties:
        TaskDefinition: <TASK_DEFINITION>
        LoadBalancerInfo:
          ContainerName: "simplehttp-container"
          ContainerPort: 8000

###taskdef.jsonの作成
ルートディレクトリにtaskdef.jsonを作成し、タスク定義のJSONを貼り付けます。
スクリーンショット 2021-07-10 11.02.40.png

imageの箇所を以下のように修正します。

"image": <IMAGE1_NAME>,

###Buildの編集
CodeDeployからBuildの出力アーティファクトにDefinitionArtifactImageArtifactを追加します。
スクリーンショット 2021-07-10 11.07.36.png

###Deployの編集
Deployについても修正します。
入力アーティファクトにDefinitionArtifactImageArtifactを追加します。
その他にはCodeDeployアプリケーション名やデプロイグループの指定、DefinitionArtifactののファイル選択、ImageArtifactの選択などを行います。
スクリーンショット 2021-07-10 11.28.40.png

###パイプラインの実行
パイプラインを実行すると、CodeDeployからトラフィック移行の進行状況を確認することができます。
スクリーンショット 2021-07-10 11.34.07.png

トラフィックの移行が終わると置き換えタスクセットの方が100 %と表示されます。
スクリーンショット 2021-07-10 11.43.46.png

#参考資料

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?