アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

Codebuild のランタイムのアップデートでハマった

morishitaです。

先日、別のことでハマっていたときに「ビルド環境が古いせいではないか?」と思ってしまい焦ってCodebuild のランタイムを変更したら余計にハマったという話です。

当社でのCodeBuildの利用状況

本題に入る前にアクトインディでのCodeBuildの利用状況を紹介します。

主な用途は次のとおりです。

  • Dockerイメージのビルド
    • 本番サービス用イメージ
    • 開発環境用DBイメージ
  • 自動テスト(RSpec、Prontoなど)の実行

本番サービス用DockerイメージのビルドはCodePipelineに組み込まれています。
開発環境用DBイメージというのは、毎日本番DBのバックアップをリストアして作っているものです。 各エンジニア、デザイナーがローカル開発環境で使うもので、プルすればほぼ最新の本番データをローカル環境で動かせます1

自動テストについては次のエントリで紹介しています。

tech.actindi.net

tech.actindi.net

ランタイムを最新にしたら動かなくなった!

さて、本題です。

Webpacker+Workboxの設定変更をしていてローカル環境での実行ではうまく設定どおりに動作するのですが、本番適用するためDockerイメージをビルドするとうまく動作しないという事象を調べていました。

設定の仕方やコマンドの実行順序、実行タイミングなどいろいろ試してみましたがうまくいかず困っていました。
Dockerイメージのビルド中の処理なのでCodeBuildのランタイムが原因であることは冷静に考えれば少ないはずです。
でも、うまくいかない原因を見つけられず焦ってしまい実行環境を疑ってしまいました。

ビルドに使っている CodeBuild の設定を確認すると利用しているイメージがaws/codebuild/docker:17.09.0となっていました。

f:id:HeRo:20190731085509p:plain
CodeBuildの環境設定(変更前)

Dockerのバージョンが 17.09.0 とやや古い。「まさかこれが原因?」と思って変更しようとしました。
で、イメージの上書きをクリックして見ると…。

f:id:HeRo:20190731085703p:plain
仕様が変わっていたCodeBuildの環境設定

あれ、しばらく触ってなかったら設定項目が変わっている。
なにより、イメージのバージョニング体系が変わっている。

でもまあ、些細な仕様変更だろう。
最新を選択すればいいだろうと次の様に設定を変更してしまいました。

項目 設定値
ランタイム Standard
イメージ aws/codebuild/standard:2.0
イメージのバージョン aws/codebuild/standard:2.0-1.11.0

で、再度CodeBuildを実行すると、エラーで止まってしまいました。

f:id:HeRo:20190731085840p:plain
ビルド失敗
11秒で止まっているとは実質起動すらしてない様子。

しかも、設定変更前のイメージaws/codebuild/docker:17.09.0 はもう選択できません。
もとに戻すという退路も絶たれていました。

うわー、余計にハマった!
もともとサクッと終わる瞬殺タスクだと思っていたのに…。

buildspec.ymlに変更が必要だった

ログを見てみると次のエラーメッセージが出ていました。

Phase context status code: YAML_FILE_ERROR Message: This build image requires selecting at least one runtime version.

ふむふむ、ランタイムバージョンを少なくとも1つしてする必要があるらしい。

ドキュメントを確認してみると次の様に変わったようです。

以前は、Ruby、Node.js、Dockerなど使いたい言語やツールごとにイメージが用意されていたと思います。
それが、イメージが整理されたらしく、バージョンを選択してどの言語を使うのかは buildspec.yml で指定するように変わったようです。

ドキュメントには次の様に書かれています2

Ubuntu Standard イメージ 2.0 を使用する場合、buildspec ファイルの runtime-versions セクションでランタイムを指定できます。

「指定できます」と書かれていますが、先のエラーメッセージを見ると1つは「指定しなければならない」ようです。

選択できるランタイムのバージョンは次のとおりです。

プログラム言語 ランタイムのバージョン
Ruby 2.x
Python 3.x
PHP 7.x
Node.js 8.x、10.x
Java 8、11
Golang 1.x
.NET Core 2.x
Docker 18.x
Android 28.x

今回は Dockerが使えればいいので、buildspec.yml に次のように設定を追加しました。

version: 0.2

env:
  variables:
    〜 省略 〜
 phases:
  install:
    runtime-versions:
      docker: 18
  pre_build:
    〜 以下、省略 〜

あと、もう1つ。
Dockerイメージ作る場合にはCodeBuildの環境設定の特権付与にチェックを入れるのも重要です。これにチェックを入れないとDockerが動きません。

これで元通り動くようになりました。
やれやれ。

まとめ

新しいCodebuildのランタイムイメージのDockerファイルはGithubで公開されています。

それによると次のようにアクティブにメンテするのは standard 2.0 だとと書いているので、今後は standard 2.0を選択したほうがいいと思います。

The following images are actively maintained by AWS CodeBuild, and are listed in the CodeBuild console.

  • standard 2.0

standard 2.0 にアップデートする際には buildspec.yml の変更も必要なのでご注意を。

参考

最後に

アクトインディではエンジニアを募集しています。 actindi.net


  1. “ほぼ"というのは1日1回ビルドなので若干タイムラグがあるのと、メアドなどのセンシティブなデータはマスクされているという意味です。

  2. https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-env-ref-available.html