はじめに
AWS CI/CDパイプラインにおいて、buildspec.ymlとAppSpec.yml(あるいはAppSpec.json)という2つのファイルが登場します。
この記事では、それぞれの概要とサンプルについて提示します。
buildspec.ymlとAppSpec.ymlの概要と役割の違い
buildspec.yml
buildspec(通常は buildspec.yml)は、AWS CodeBuild で実行されるビルド処理の手順や環境設定を定義するファイルです。
主な役割:
- ソースコードのコンパイル
- ユニットテストの実行
- Dockerイメージの作成(ビルド)
- Amazon ECR へのイメージのプッシュ
- 成果物(アーティファクト)のパッケージング
appspec.yml
appspec.ymlは、AWS CodeDeploy がアプリケーションのリビジョンをターゲット環境にデプロイする際の手順を制御するファイルです。
主な役割
- 環境(EC2, lambda, ECSなど)へのアプリケーションの配置
- 切り替え
- 検証
buildspec.ymlとappspec.ymlのサンプル
buildspec.yml
主なセクションの書式
| セクション名 | 内容 |
|---|---|
version | buildspec の構文バージョンを指定します。 ※ 機能拡張がなされている 0.2 の利用が推奨されています |
env | ビルド環境で利用する環境変数を定義します。 ※ プレーンテキストの変数は variablesParameter Store や Secrets Manager の値はそれぞれの専用サブキーで取得します |
phases | CodeBuild が実行するビルドフェーズを定義する最重要セクションです。 ※ 詳細なフェーズについては別表に記載します。 |
artifacts | ビルド後に生成され、S3 や後続のデプロイステージへ引き渡す成果物ファイルの格納パス(files)を指定します。 |
phasesセクションの書式
| サブセクション名 | 説明 |
|---|---|
install | ツールのインストール |
pre_build | ビルド前処理・ログイン等 |
build | メインビルド・コンパイル |
post_build | ビルド後処理・イメージプッシュ等 |
サンプル
Amazon ECR への Docker イメージのビルド&プッシュ、および Amazon ECS デプロイに必要な imagedefinitions.json を生成するサンプルコードです
# versionセクション
version: 0.2
# envセクション
env:
variables:
# プレーンテキストの環境変数を指定
AWS_DEFAULT_REGION: "ap-northeast-1"
IMAGE_REPO_NAME: "my-web-app"
# phasesセクション
phases:
# 1. install フェーズ: 依存パッケージやビルドツールのセットアップ install:
commands:
- echo "インフラ・ビルドツールの初期化処理を開始します..."
# 2. pre_build フェーズ: ビルド実行前の準備作業(例: ECRへのログインなど)
pre_build:
commands:
- echo "Amazon ECR 認証トークンの取得とログインを実行中..."
# AWS CLI を使用して ECR ログイン用パスワードを取得し docker login を実行
- aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $ECR_REGISTRY
# 3. build フェーズ: アプリケーションのコンパイルや Docker イメージのビルド
build:
commands:
- echo "Docker イメージのビルドを開始..."
# カレントディレクトリの Dockerfile からイメージをビルドし、タグを付与
- docker build -t $ECR_REGISTRY/$IMAGE_REPO_NAME:$IMAGE_TAG .
# 4. post_build フェーズ: ビルド後の処理(ECRへのプッシュや成果物ファイルの生成)
post_build:
commands:
- echo "ビルドした Docker イメージを ECR にプッシュ中..."
- docker push $ECR_REGISTRY/$IMAGE_REPO_NAME:$IMAGE_TAG
- echo "ECS デプロイに必要な imagedefinitions.json を作成中..."
# CodePipeline/CodeDeploy へ引き渡すイメージ定義 JSON ファイルを出力
- printf '[{"name":"web-container","imageUri":"%s"}]' $ECR_REGISTRY/$IMAGE_REPO_NAME:$IMAGE_TAG > imagedefinitions.json
# 後続のデプロイステージへ引き渡すビルド成果物(アーティファクト)の定義
artifacts:
files:
# 生成された imagedefinitions.json を成果物として指定
- imagedefinitions.json
appspec.yml
主なセクションの書式
| セクション名 | 内容 |
|---|---|
version | ECS および Lambda デプロイの場合、バージョン番号には 0.0 を指定します。 |
Resorce | デプロイ対象となる ECS サービスやタスク定義に関する情報を定義するセクションです。 ※サブセクションについてへ別表に記載します。 |
Hook | 各ライフサイクルイベントにおいて呼び出す検証処理を定義するセクションです。 |
Resorceセクションの書式
| サブセクション名 | 説明 |
|---|---|
TargetService | デプロイ対象のリソース種別(AWS::ECS::Service)を指定します。 |
Properties | 使用する ECS タスク定義の ARN(TaskDefinition)や、ロードバランサーとコンテナポートのマッピング情報を指定します。 |
Resorceセクションの書式
| サブセクション名 | 説明 |
|---|---|
TargetService | デプロイ対象のリソース種別(AWS::ECS::Service)を指定します。 |
Properties | 使用する ECS タスク定義の ARN(TaskDefinition)や、ロードバランサーとコンテナポートのマッピング情報を指定します。 |
サンプル
Amazon ECR への Docker イメージのビルド&プッシュ、および Amazon ECS デプロイに必要な imagedefinitions.json を生成するサンプルコードです
# versionセクション
version: 0.0
# Resourcesセクション
Resources:
# ECSが対象サービス
- TargetService:
Type: AWS::ECS::Service
Properties:
# デプロイで使用する ECS タスク定義の ARN を指定
TaskDefinition: "arn:aws:ecs:ap-northeast-1:123456789012:task-definition/my-app:1"
# ロードバランサーがトラフィックを転送するコンテナ情報
LoadBalancerInfo:
# タスク定義内で設定されているコンテナ名を指定
ContainerName: "web-container"
# コンテナ側で解放されているポート番号を指定
ContainerPort: 80
# Hooksセクション
Hooks:
# 本番トラフィック切り替え完了後 (AfterAllowTraffic) に呼び出す Lambda 関数の ARN を指定
- AfterAllowTraffic: "arn:aws:lambda:ap-northeast-1:123456789012:function:AfterAllowTrafficValidation"