Skip to Content

AWS CodeCommitから自動でECRへDockerイメージをビルド

概要

AWS CodeCommitにpushしたDockerfileをCodeBuildで、
docker buildして、ECRにDockerImageを保存するまでのハンズオン

目的

AWSの機能でDockerビルドのCI環境を作る

CodeCommit編

CodeCommit リポジトリ作成

SSH設定

Terraformで AWS CodeCommitを作成のSSH設定を参考

git clone

git clone ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/test-codecommit

SSHの設定の細かいところ以外はリポジトリ作成画面に手順が書いてある

Dockerfileを配置

cloneしたディレクトリにalpineのimageにGoのhttpサーバのバイナリをテスト用に置く

> tree
.
├── Dockerfile
└── server

Dockerfileアップロード

> git add --all
> git commit -m "Dockerfile作成"
> git push -u origin master

CodeCommitのリポジトリにファイルが追加された

ECR編

ECRリポジトリ作成

リポジトリ名がビルドされるDocker Imageの名前になる

CodeBuild編

ビルドプロジェクトを作成するボタンから各種設定を行う

プロジェクト名を入力

“test-dockerbuild”とした

送信元

リポジトリはCodeCommit編で作成したリポジトリを選択

環境
  • aws/codebuild/standard:2.0
  • 特権付与にチェック!(チェックいれないとdocker buildに失敗する)

Buildspec, アーティファクト

ECRにプッシュしたいので、アーティファクトなし

ログ

保存日数をここでは選択できないので、CloudWatchオプションを外した

buildspec.yml作成

Dockerfileの並びにbuildspec.ymlを作成

.
├── Dockerfile
├── buildspec.yml
└── server

環境変数はあえて使わず、テストために分かりやすく

  • runtime-versionsで、dockerを指定する
  • docker build -t [ECRのリポジトリ名]:[tag] .
  • docker tag [ECRのリポジトリ名]:[tag] [ECRのリポジトリのURIを指定]:[tag]
  • docker push [ECRのリポジトリのURIを指定]:[tag]
version: 0.2
phases:
  install:
    runtime-versions:
      docker: 18
    commands:
      - echo install step...
  pre_build:
    commands:
      - echo logging in to AWS ECR...
      - $(aws ecr get-login --no-include-email --region ap-northeast-1)
  build:
    commands:
      - echo build Docker image on `date`
      - echo Building the Docker image...
      - docker build -t my_httpserver:latest .
      - docker tag my_httpserver:latest 000000000.dkr.ecr.ap-northeast-1.amazonaws.com/my_httpserver:latest
  post_build:
    commands:
      - echo build Docker image complete `date`
      - echo push latest Docker images to ECR...
      - docker push 000000000.dkr.ecr.ap-northeast-1.amazonaws.com/my_httpserver:latest

buildspec.ymlのアップロード

> git add buildspec.yml 
> git commit -m "buildspec作成"
> git push -u origin master

補足

この状態でビルドを実行すると、ECRへの権限がなくて失敗する

COMMAND_EXECUTION_ERROR: Error while executing command: $(aws ecr get-login --no-include-email --region ap-northeast-1). Reason: exit status 255

特権付与にチェックを入れ忘れた場合

COMMAND_EXECUTION_ERROR: Error while executing command: docker build -t my_httpserver:latest .. Reason: exit status 1


IAM ポリシーの編集

自動作成されたポリシーを探す
codebuildで検索すれば、先程名付けたプロジェクト名のポリシーが見つかる

ここのスペースに下記を追加する
ドキュメントを読んだ方がわかりやすい

        {
            "Action": [
                "ecr:BatchCheckLayerAvailability",
                "ecr:CompleteLayerUpload",
                "ecr:GetAuthorizationToken",
                "ecr:InitiateLayerUpload",
                "ecr:PutImage",
                "ecr:UploadLayerPart"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },

追加するとECRへの権限を得られる

ビルドの開始

CodeBuildに戻り、動作テストのため手動でビルドを行う
フェーズ詳細から進行を確認できる

ECRからリポジトリを確認すると、ビルドされたイメージが追加されている

CodePipeline

デプロイの設定をスキップする以外は悩むところがない

パイプラインの作成

導入段階をスキップ! 初回は自動実行されるようだ リポジトリに追加されている

最終確認

git pushしたら自動的にECRにビルド済みのイメージが保存されることを確認する
試しにDockerfileを編集してからpush

> vi Dockerfile 
> git add Dockerfile 
> git commit -m "portを修正"
> git push -u origin master

CodePipelineを確認すると自動的に処理が走っている

最終的にECRに新しいイメージが追加された

まとめ

これで簡単なCI環境を構築できた
IaCを頑張りたいので次はTerraformで構築を目指す

参考

https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/sample-docker.html