こんにちは。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環境で利用できる環境変数となり、ビルドのソースコードのバージョンの識別子が定義されております。 その他、利用できる環境変数は以下のドキュメントを参照ください。
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系を理解できました。
どなたかのお役に立てれば幸いです。