はじめに
CodeBuildではbuildspec.ymlを利用してビルドを行う。
本記事では、buildspec.ymlにアカウントIDを変数として利用する方法を説明する。
対象者
- buildspec.yml内にアカウントIDをハードコードしてしまっている方
- マルチプロジェクトで同じbuildspec.ymlを利用したい人
問題点
CodeBuildにはビルド環境の環境変数として予約されているものがある。
ビルド環境の環境変数 - AWS CodeBuild (amazon.com)
しかし、アカウントID(AWSマネジメントコンソール右上から確認)は環境変数として定義されていない。
私の所属チームでは、プロジェクト毎にアカウントIDを確認し、buildspec.yml内にハードコードしていた。
ハードコードしてしまうと同じbuildspec.ymlを使い回す事ができずに、アカウントが異なる環境上で作業を行う際に都度修正を行う必要が生じてしまう。
解決策
アカウントIDを環境変数としてbuildspec.yml内に定義する。定義の際は手動で入力するのではなく、AWS側で予約されている環境変数を利用する。
コマンド
buildspec.yml内の「pre_build」フェーズで以下のコマンドを記述する。
- export ACCOUNT_ID=$CODEBUILD_BUILD_ARN && IFS=':' && set -- ${ACCOUNT_ID} && ACCOUNT_ID=$5
フェーズ詳細については下記で確認していただきたい。
ビルド使用(buildspec)に関するリファレンス
説明
CodeBuildで定義済みの「CODEBUILD_BUILD_ARN」という環境変数を「:」で分割して配列にいれ、配列の5番目の値をACCOUNT_IDに代入している。
「CODEBUILD_BUILD_ARN」はビルドのARNを表しており、以下のような構成となっている。
arn:aws:codebuild:region-ID:account-ID:build/build-ID
この設定により、以降のbuildspec.yml内ではACOUNT_IDを環境変数として利用することができる。
- aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin ${ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com
おわりに
本記事ではbuildspec.yml内でアカウントIDを環境変数として設定する方法を説明した。
この方法ではアカウントが異なる環境で同じbuildspec.ymlファイルを利用した場合でも修正を加えることなく利用することができる。
別の方法としては、Cloudformationのymlテンプレートで環境変数として渡すこともできるので、別の記事で紹介したいと思う。