AWS CI/CD勉強メモ②:CodeBuildでDockerイメージをビルド


やること

Cloud9でデータを用意して
CodeCommitのリポジトリにpushして
CodeBuildのビルドプロジェクトでビルドしてDockerイメージを作成して
ECR(Amazon Elastic Container Registry)のリポジトリにDockerイメージをpushする。
動作確認は、Cloud9でDockerコンテナを実行する

構成

今回つくる構成

参考

では、やっていく

1.ECRの作成

ECR リポジトリを作成します。

リポジトリmultistage-ecrを作成する

2.CodeCommitの作成

CodeCommit リポジトリを作成する

リポジトリmultistage-ecrを作成する

3.ビルド用リソースの作成

githubからサンプルを取得し、
Cloud9上でデータを更新し、
CodeCommitリポジトリにpushする

Cloud9を作る(作り方は省略)

ここからサンプル取得

Cloud9-Terminal
$ https://github.com/cloudfish7/multi-stage-build-for-codebuild.git

CodeCommitリポジトリをクローン

Cloud9-Terminal
$ git clone https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/multistage-test
$ cp ../multi-stage-build-for-codebuild/* ./ -r

ファイル構造

Cloud9-Terminal
$ pwd;find . | sort | sed '1d;s/^\.//;s/\/\([^/]*\)$/|--\1/;s/\/[^/|]*/|  /g'
/home/ec2-user/environment/multistage-test
|--buildspec.yml
|--Dockerfile
|--pom.xml
|--src
|  |--buildspec.yml
|  |--Dockerfile
|  |--hoge
|  |  |--Main.java
|  |--pom.xml

取得したサンプルデータの buildspec.yml を編集

  • 更新箇所
    • {REPO_NAME}, {tag}, {account_id} を実際の値に更新する
    • 1行目を version: 0.1 -> version: 0.2 にする
buildspec.yml
version: 0.1

phases:
  pre_build:
    commands:
      - $(aws ecr get-login --region ap-northeast-1 --no-include-email)
  build:
    commands:
      - docker build -t {REPO_NAME}:{tag} .
      - docker tag {REPO_NAME}:{tag} {account_id}.dkr.ecr.ap-northeast-1.amazonaws.com/{REPO_NAME}:{tag}
      - docker push {account_id}.dkr.ecr.ap-northeast-1.amazonaws.com/{REPO_NAME}:{tag}
  post_build:
    commands:

codecommit のリポジトリにpushする

Cloud9-Terminal
$ git add .
$ git commit -m "update"
$ git push origin master

4.CodeBuildの作成

ビルドプロジェクト multistage-build を作成し、実行する
→ ECR リポジトリにDockerイメージが格納される

4-1.ビルドプロジェクト作成

項目 備考
プロジェクト名 multistage-build
ソースプロパイダ AWS CodeCommit
リポジトリ multistage-test
リファレンスタイプ ブランチ
ブランチ master
環境イメージ マネージド型イメージ
オペレーティングシステム Ubuntu
ランタイム Standard
イメージ aws/codebuild/standard:4.0
環境タイプ Linux
サービスロール 新しいサービスロール
ロール名 codebuild-nultistage-build-service-role 自動作成
ビルド仕様 buildspecファイルを使用する

4-2.ECRアクセス権を追加

IAMロールにECRアクセスのポリシー追加
AmazonEC2ContainerRegistryPowerUse を追加

4-3.ビルド実行

CodeBuildを実行
成功すると、ECRにイメージがプッシュされてる

ここまでできれば一応成功

動作確認

ビルドしたDockerイメージをCloud9上に持ってきて、Dockerコンテナ実行できることを確認する

Dockerコンテナを実行

Cloud9-Terminal
$ aws ecr get-login --no-include-email --region ap-northeast-1
# -> 出力された長いコマンドをコピーして実行 -> Login Succeeded とでれば成功

ECR リポジトリからDockerイメージ取得

Cloud9-Terminal
$ docker pull xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/multistage-ecr:latest

Dockerイメージがある

Cloud9-Terminal
$ docker images
REPOSITORY                                                         TAG                 IMAGE ID            CREATED             SIZE
xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/multistage-ecr   latest              5bf8c20529d6        14 minutes ago      81.4MB
Cloud9-Terminal
$ docker run xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/multistage-ecr:latest
# Dockerコンテナ実行できたか確認
$ docker ps -ls
CONTAINER ID        IMAGE                                                                     COMMAND             CREATED             STATUS                      PORTS               NAMES               SIZE
c53e6c6ef9e6        xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/multistage-ecr:latest   "/bin/sh"           11 seconds ago      Exited (0) 11 seconds ago                       hopeful_mendel      0B (virtual 81.4MB)