【CI/CD for Amazon ECS】ECSへの自動デプロイで利用するファイルをまとめてみた

記事タイトルとURLをコピーする

こんにちは。AWS CLIが好きな福島です。

はじめに

今回は、以下のハンズオンを実施したため、ハンズオンの内容を基にCI/CD for Amazon ECSで利用するファイルをまとめました。

◆AWS CI/CD for Amazon ECS ハンズオン

https://pages.awscloud.com/rs/112-TZM-766/images/AWS_CICD_ECS_Handson.pdf

概要図

概要図は以下の通りです。

ファイル一覧

  • ①buildspec.yml : ビルド処理の定義書
  • ②Dockerfile : dockerビルド時に利用する定義書
  • ③appspec.yml : デプロイ処理の定義書
  • ④taskdef.json : タスク定義を作成する定義書
  • ⑤imageDetail.json : Amazon ECS Blue/Green デプロイ時に必要な定義書

フォルダ構成

php-sample  
└ src : ソースコードを格納するフォルダ
  └ index.php : コンテンツ  
└ appspec.yml : デプロイ処理の定義書  
└ buildspec.yml : ビルド処理の定義書  
└ Dockerfile : docker buildの定義書  
└ taskdef.json : ECSのタスク定義の定義書  

※1 src配下に格納するコンテンツ(index.php)の説明は割愛します。
※2 概要図に記載の通り、imageDetail.jsonはCodeBuild実行時に作成するため、上記には記載しておりません。

各ファイルの詳細

CodeBuildで利用

1. buildspec.yml: ビルド処理の定義書

一部内容を変えておりますが、ハンズオンで利用したbuildspec.ymlは以下の通りです。 ファイル名はデフォルトbuildspec.ymlとなり、ソースディレクトリのルートに保存する必要がありますが、ファイル名やパスを変更することも可能です。
詳細は以下を確認ください。

CodeBuild のビルド仕様に関するリファレンス - AWS CodeBuild

buildspec.ymlの例
version: 0.2
phases:
  pre_build:
    commands:
      - AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
      - aws ecr get-login-password | docker login --username AWS --password-stdin https://$AWS_ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com
      - REPOSITORY_URI=$AWS_ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/php-sample
      - IMAGE_TAG=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)

  build:
    commands:
      - docker build -t $REPOSITORY_URI:latest .
      - docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG

  post_build:
    commands:
      - docker push $REPOSITORY_URI:latest
      - docker push $REPOSITORY_URI:$IMAGE_TAG
      - printf '{"Version":"1.0","ImageURI":"%s"}' $REPOSITORY_URI:$IMAGE_TAG > imageDetail.json

artifacts:
 files: imageDetail.json

以下に各セクションの概要を記載します。

version

buildspec.ymlのバージョンを定義します。現在(2022/07時点)は、0.2が最新となります。

pre_build(ビルドの前処理)

今回は、主にECRへのログイン処理を行っています。

また、AWSアカウントID、作成するイメージをPushするリポジトリのURI、イメージに付与するタグ(コミットID)を環境変数に定義しております。

CODEBUILD_RESOLVED_SOURCE_VERSIONは、CodeBuild環境で利用できる環境変数となり、ビルドのソースコードのバージョンの識別子が定義されております。 その他、利用できる環境変数は以下のドキュメントを参照ください。

ビルド環境の環境変数 - AWS CodeBuild

build(ビルド)

今回は、docker buildおよび作成したイメージにタグを付与しております。

post_build(ビルドの後処理)

今回は、作成したイメージをlatestおよびイメージタグを付与し、ECRにpushしています。
また今回は、ECS Blue/Green デプロイを行うため、必要なimageDetail.jsonを生成しております。

imageDetail.jsonの例:

{
"ImageURI": "ACCOUNTID.dkr.ecr.us-west-2.amazonaws.com/dk-image-repo@sha256:example3"
}
  • 補足

ECS Blue/Green デプロイを行う際は、imageDetail.jsonが必要になりますが、 ECSの通常のデプロイの場合は、imagedefinitions.jsonが必要になります。

イメージ定義ファイルのリファレンス - AWS CodePipeline

artifacts

post_buildで生成したimageDetail.jsonをアーティファクトとして定義します。 アーティファクトとして定義することで、後続の処理(CodeDeploy)で利用できます。

2. Dockerfile: dockerビルド時に利用する定義書

Code兄弟とは関係なく、docker buildコマンドを利用する際に必要となるファイルです。

Dockerfileの例
FROM php:7.4.0-apache
COPY src/ /var/www/html
FROM

パブリックリポジトリからコンテナイメージを取得します。

COPY

srcフォルダ配下のファイルを/var/www/html(Apacheのドキュメントルート)にコピーします。

Dockerfileの詳細

Dockerfile リファレンス — Docker-docs-ja 20.10 ドキュメント

CodeDeployで利用

3. appspec.yml: デプロイ処理の定義書

ハンズオンで利用したappspec.ymlは以下の通りです。

version: 0.0
Resources:
  - TargetService:
      Type: AWS::ECS::Service
      Properties:
        TaskDefinition: "<TASK_DEFINITION>"
        LoadBalancerInfo:
          ContainerName: "php-sample-fargate"
          ContainerPort: "80"
version

appspec.ymlのバージョンを定義します。現在(2022/07時点)は、0.0のみ定義可能です。

TaskDefinition

デプロイする Amazon ECS サービスのタスク定義を定義します。
<TASK_DEFINITION>と定義しておくことでCodePipeline実行時に自動で更新されます。

ContainerName

Amazon ECS アプリケーションを含む Amazon ECS コンテナの名前です。Amazon ECS タスク定義で指定されたコンテナにする必要があります。

ContainerPort

トラフィックがルーティングされるコンテナ上のポートを定義します。

詳細

AppSpec の「resources」セクション (Amazon ECS と)AWS Lambdaのデプロイのみ) - AWS CodeDeploy

4. taskdef.json: タスク定義を作成する定義書

taskdef.jsonは、ECSのタスク定義のJSONをコピーし、imageの箇所だけ、以下の通り変更します。

      "image": "<IMAGE1_NAME>",

引用: https://pages.awscloud.com/rs/112-TZM-766/images/AWS_CICD_ECS_Handson.pdf#page=87

5. imageDetail.json: Amazon ECS Blue/Green デプロイ時に必要な定義書

Codebuildのpost_build時に作成したファイルです。

imageDetail.jsonの例:

{
"ImageURI": "ACCOUNTID.dkr.ecr.us-west-2.amazonaws.com/dk-image-repo@sha256:example3"
}
  • 補足
    Codebuildに含めず、ソースにこのファイルを含めることも可能です。
    また、ソースがECRの場合、このファイルは自動で生成されます。

終わりに

Code系に触れる機会はほぼなかったのですが、ハンズオンと本ブログをまとめることで少しCode系を理解できました。

どなたかのお役に立てれば幸いです。

福島 和弥 (記事一覧)

2019/10 入社

AWS CLIが好きです。

AWS資格12冠。2023 Japan AWS Partner Ambassador/APN ALL AWS Certifications Engineer。