CodeBuildを利用してGitHubとECRを連携する方法

aws

ここでやること

  • 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は ひとつひとつ独立したサービスが沢山存在しますが、組み合わせることでユーザーのニーズに柔軟に対応できるようになっていると感じます。

コメントを残す

入力エリアすべてが必須項目です。メールアドレスが公開されることはありません。

内容をご確認の上、送信してください。