ここでやること
- GitHub にプッシュした際に、CodeBuild を実行させて自動的にビルドする
- CodeBuild でビルドしたDockerイメージを ECR に保存する
ECRとは
AWS 上の Docker コンテナレジストリです。AWSの様々なサービスと連携が可能で、Dockerイメージの保存、管理、デプロイをする事が出来ます。
CodeBuildとは
ソースコードをコンパイルし、テストを実行し、デプロイ可能なソフトウェアパッケージを作成できるAWSのビルドサービスです。GitHubなどと連携してビルドの実行が可能です。
ECR リポジトリを作成する
AWS のECR管理コンソールから「リポジトリを作成」をクリックしてDockerイメージを保存するためのリポジトリを作成します。
CodeBuild でビルドする
GitHubにプッシュされたソースコードからDockerイメージを生成してECRに保存する為に必要な作業は以下になります。
- CodeBuild でビルドする為の手順を記載した設定ファイル( buildspec.yml) を用意する
- CodeBuild のビルドプロジェクトを作成する
buildspec.yml を用意する
version: 0.2
phases:
install:
runtime-versions:
docker: 18
pre_build:
commands:
- echo Logging in to Amazon ECR...
- $(aws ecr get-login --no-include-email --region ${AWS_DEFAULT_REGION})
build:
commands:
- echo Build started on `date`
- echo Building the Docker image...
- docker-compose -f ./docker/docker-compose.yml build --no-cache webapp
- docker tag ${IMAGE_REPO_NAME}:${IMAGE_TAG} ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${IMAGE_REPO_NAME}:${IMAGE_TAG}
post_build:
commands:
- echo Build completed on `date`
- echo Pushing the Docker image...
- docker push ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${IMAGE_REPO_NAME}:${IMAGE_TAG}
CodeBuild のビルドプロジェクトを作成する
AWS のCodeBuild 管理コンソールから「ビルドプロジェクトを作成する」をクリックして作成します。
プロジェクトの設定
プロジェクト名を設定します。ここでは、「aws-ecr-sample」としました。
送信元
ソースプロバイダを「GitHub」に変更して、リポジトリを「GitHubアカウントのリポジトリ」に変更します。
※ 「GitHubアカウントのリポジトリ」を選択しないとウェブフックイベントが利用できません。
また、ソースコードを取得する GitHub のリポジトリを選択してください。
プライマリソースのウェブフックイベント
「コードの変更がこのレポジトリにプッシュされるたびに再構築する」にチェックを付けます。イベントタイプに「プッシュ」を追加します。
※ この設定で GitHubにプッシュされた際にCodeBuildが呼ばれるようになります。
「これらの条件でビルドを開始する」の”HEAD_REF – オプショナル” に「refs/heads/master」を入力します。
※ この設定でmasterにプッシュした場合にだけ実行されるようになります。
環境
・オペレーティングシステムで「Ubuntu」を選択します。
・ランタイムで「Standard」を選択します。
・イメージで「aws/coudbuild/xxxxx」の中から先頭のものを選択します。
・特権付与で「Docker イメージを構築するか、ビルドで昇格されたアクセス権限を取得するには、このフラグを有効にします」にチェックを付けます。
環境変数
環境変数で以下の4つの変数を追加します。
IMAGE_REPO_NAME=aws-ecr-sample ← 作成したECRのリポジトリ名 IMAGE_TAG=latest ← 保存したイメージの識別タグ AWS_ACCOUNT_ID=XXXXXXXXXXXX ← AWSのアカウントID AWS_DEFAULT_REGION=ap-northeast-1 ← 利用するAWSのリージョンコード
IAM でECRの操作を許可するポリシーをアタッチする
これをやらないと権限がなくてエラーになってしまうようです。
IAMの管理コンソールから作成したビルドプロジェクトのロールに ECRの操作を許可するポリシーをアタッチします。
ビルドプロジェクトを実行しする。
ビルドが成功すると先ほど作成したECR リポジトリにCodeBuildで生成したDockerイメージが保存されます。
最後に
今回作成したサンプルコードはこちらです。
https://github.com/isystk/profile.isystk.com
ここでは扱いませんが、ECS というサービスを利用すると ECRのDockerイメージを利用してEC2やForgateにホスティングすることも可能です。 AWSは ひとつひとつ独立したサービスが沢山存在しますが、組み合わせることでユーザーのニーズに柔軟に対応できるようになっていると感じます。