AWS CodePipelineでgoアプリのDockerイメージをECRに格納する


実現したいこと

  1. CodeCommitのリポジトリ(hoge-repo)のmasterブランチの更新をトリガーに
    masterブランチのリソースからDockerイメージを作成しECRの対象リポジトリに格納したい
  2. hoge-repoはgolangのアプリを持っているので,イメージ作成時にアプリのビルドも行う

環境

  • Golang 1.13.5
  • Docker 18
  • AWS 東京リージョン

やったこと

CodeBuild構築

  • プロジェクト名は任意の名前

  • 送信元

    送信元はCodeCommitの対象リポジトリを選択

今回はmasterマージをトリガーにするのでリファレンスタイプはブランチ
対象ブランチはmasterを指定

  • 環境

    Build環境は特に制限がなかったのでaws/codebuild/amazonlinux2-x86_64-standard:2.0
    を選択

    残りの環境設定はデフォルト

  • Buildspec
    Buildspecファイルを使用するを選択
    buildspec.yamlは後ほど

  • アーティファクト
    今回はDockerイメージのpushまでで,実際にEKSでコンテナの立ち上げまで行わないので
    アーティファクトはなしを選択

  • ログ
    ログの監視も今回は行わない

CodeBuildの権限追加

今回はCodeCommitからソースをダウンロードし,ECRにイメージプッシュするため
CodeBuildのサービスロールに以下ポリシーを付与
AWSCodeCommitReadOnlyAccess
AmazonEC2ContainerRegistryFullAccess

buildspec.yml作成

codebuildでデフォルト設定にしたので hoge-repoのルートディレクトリにbuildspec.ymlを配置

hoge-repo
|
|-- buildspec.yml
|-- Makefile
|-- Dockerfile
|-- main.go
...

buildspec.yaml


version: 0.2

phases:
  install:
    runtime-versions:
      docker: 18
    commands:
    # ECRにイメージプッシュするためにログインする
    - $(aws ecr get-login --no-include-email --region ap-northeast-1)

  pre_build:
    commands:
    # go test -v -cover ./...
    - make test

  build:
    commands:
    # go build -v .
    - make build

  post_build:
    commands:
    # docker tag \code-commit-repo-name\:latest \erc-repo-name\:latest
    # docker push \erc-repo-name\:latest
    - make push-image

CodePipeline構築

CodePipelineの新規作成

  • パイプラインの設定
    パイプライン名は任意の値を入力し,残りはデフォルト

  • ソースステージ
    ソースプロバイダにAWS CodeCommitのhoge-repo masterブランチを選択
    検索はAmazon CloudWatch Eventsを選択

  • ビルドステージ
    AWS CodeBuildの先ほど作成したプロジェクトを選択
    今回環境変数は使用しないので残りはそのまま

  • デプロイステージ
    実際にコンテナを立ち上げないのでデプロイステージはスキップする

完成

ここまでの設定でCodeCommitのmasterブランチの更新をトリガーに
GoアプリがビルドされたDockerイメージを作成し,ECRにプッシュする構成ができた.

この後

Pipeline実行する毎に goモジュール(外部ライブラリ)をダウンロードするのはイケてない(5分ぐらいかかる)
一度ダウンロードしたモジュールはキャッシュしておきたい(この後盛大にハマる)
ハマった記事