AWS CodeBuildのビルド環境に使うDockerイメージをビルドする
はじめに
AWS CodeBuildというCI/CDを行えるサービスがあります。CI/CDをAWS環境で完結できるため、すでにAWSを使っていればすぐに使えるのが魅力的です。
任意の言語のバージョンを使うのにあたり少し時間がかかりそうな点があったのでまとめました。
CodeBuildでのビルド環境
CodeBuildでは、DockerImageをもとにDockerを起動した環境でビルド等が行われます。DockerImageにはAWSが提供するDockerImageやDockerHubのimageを選択することが可能です。
AWSがホスティングしているDockerImageに使いたい言語やバージョンがあればそのまま使えばよいのですが、ない場合は自前でビルドする必要があります。
例えば、aws/codebuild/amazonlinux-aarch64-standard:3.0
で内包されている環境はこちらのDockerfile
で確認ができます。
実際にDockerfile
を確認するとRubyでは以下のバージョンが内包されていることがわかります。
ENV RUBY_31_VERSION="3.1.6"
ENV RUBY_32_VERSION="3.2.4"
ENV RUBY_33_VERSION="3.3.2"
上記を踏まえ、今回はruby3.4.0-rc1
とruby3.3.6
が使えるようにimageを作成してみることにします。
CodeBuildで使うimageをビルドする
そもそもCodeBuildで使うImageってなんでもいいんじゃないの?と思っていたのですが、公式ドキュメントには、optimizedされているので推奨だよ(意訳)とあるため今回は公式のDockerfileをベースに作成します。
We recommend that you use Docker images stored in the CodeBuild Docker image repository, because they are optimized for use with the service. For more information, see Docker images provided by CodeBuild.
CodeBuildのDockerImageのDockerfileはGitHub上にあります。今回はaws/codebuild/amazonlinux-aarch64-standard:3.0
を参考にしました。
なおビルド環境を用意する都合上、EC2インスタンス(c7g.large)上で作業を行いました(もちろんローカルでもできるはず)。
$ uname -m
aarch64
$ git clone git@github.com:aws/aws-codebuild-docker-images.git
$ cd aws-codebuild-docker-images/al/aarch64/standard/3.0/
主な変更箇所
主に編集するのはDockerfile
とruntimes.yml
の2ファイルです。
-
Dockerfile
のRubyのインストールセクションでRuby3.4.0-rc1
を追加。ruby3.3.2
からruby3.3.6
に変更
#**************** RUBY *********************************************************
ENV RUBY_31_VERSION="3.1.6"
ENV RUBY_32_VERSION="3.2.4"
ENV RUBY_33_VERSION="3.3.6"
ENV RUBY_34_VERSION="3.4.0-rc1"
RUN rbenv install $RUBY_34_VERSION \
&& rbenv install $RUBY_33_VERSION \
&& rbenv install $RUBY_32_VERSION \
&& rbenv install $RUBY_31_VERSION \
&& rbenv global $RUBY_32_VERSION \
&& ruby -v \
&& rm -rf /tmp/*
#**************** END RUBY *****************************************************
-
runtimes.yml
にランタイムバージョンを反映
runtimes:
ruby:
versions:
3.4:
commands:
- echo "Installing Ruby version 3.4 ..."
- rbenv global $RUBY_34_VERSION
3.3:
commands:
- echo "Installing Ruby version 3.3 ..."
- rbenv global $RUBY_33_VERSION
3.2:
commands:
- echo "Installing Ruby version 3.2 ..."
- rbenv global $RUBY_32_VERSION
3.1:
commands:
- echo "Installing Ruby version 3.1 ..."
- rbenv global $RUBY_31_VERSION
default:
commands:
- echo "Installing custom Ruby version $VERSION ..."
- rbenv install $VERSION && rm -rf /tmp/*
- rbenv global $VERSION
ビルド
- 通常のDockerImageと同様にビルド
$ docker build -t aws/codebuild/standard:3.0 .
ビルドするマシンとimageのアーキテクチャが異なる場合は--platform linux/arm64
のような指定をすることでビルド可能です。そのまま持ってくるとRuby以外もビルドしてimageを作成しているのでかなり時間がかかります(EC2/c7g.largeで1時間ほどかかりました)。
- 実際に起動して確認
$ docker run -it --rm --entrypoint sh aws/codebuild/standard:3.0 -c bash
bash-5.2# rbenv global 3.3.6
bash-5.2# ruby --version
ruby 3.3.6 (2024-11-05 revision 75015d4c1f) [aarch64-linux]
bash-5.2# rbenv global 3.4.0-rc1
bash-5.2# ruby --version
ruby 3.4.0rc1 (2024-12-12 master 29caae9991) +PRISM [aarch64-linux]
選択したバージョンがインストールされていることが確認できました。
ECRへpushする
ECRのリポジトリ作成、CodeBuildからのアクセスを許可するように設定しておきます。(参考)今回は、ruby-test/al/aarch64/standard/3.0
というリポジトリ名で進めます。
- ECRの認証
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com
- ビルドしたイメージに、tagをつけてECRにpush
$ docker tag aws/codebuild/standard:3.0 <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/ruby-test/al/aarch64/standard/3.0
$ docker push <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/ruby-test/al/aarch64/standard/3.0
The push refers to repository [<アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/ruby-test/al/aarch64/standard/3.0]
CodeBuildで確認する
- CodeBuildでカスタムイメージを選択する
CodeBuildでECRのイメージを選択
実際にCodeBuildを使用し、今回追加したRubyが動くことを確認できればOKです
まとめ
CodeBuildで使うimageは任意のimage、自分でビルドしたimageを使用することが可能です。実環境とバージョンがそろわない、必要なライブラリがない等、CI/CDで使う上で懸念となる場合は自前でビルドするのも一つの手かなと思います。
宣伝
Supershipではプロダクト開発やサービス開発に関わる人を絶賛募集しております。
興味のある方は以下リンクよりご確認ください。
是非ともよろしくお願いします。
Discussion