以前CodeCommit / CodeBuildで ECR / EKS向けのCI/CDパイプラインを作った際、CodeBuild中でECRへのアクセス情報を設定する方法がよくわかっていなかったので、備忘録として書き残しておきます。
各値の取得方法
Amazon ECRへコンテナイメージを格納するには、AWSアカウントID / リージョン / リポジトリ名の3つの値が必要となります。前提として、CodeBuildプロジェクトが作成されたのと同じ環境の情報を取得する場合を書きます。
アカウントID
アカウントを取得する場合は、例えばAWS CLIのコマンド出力をクエリするか、Arnの値から抜き出すことで取得できます。
$ aws sts get-caller-identity --query 'Account' --output text $ echo ${CODEBUILD_BUILD_ARN} | cut -f 5 -d :
※参考:
リージョン
リージョンを利用する場合は、CodeBuildの環境変数である AWS_DEFAULT_REGION
を指定することでリージョン名を取得できます。
※参考
ECRリポジトリ
リポジトリが1つしかない場合は、 aws ecr describe-repositories
コマンドの出力からクエリするのが簡単そうです。またこの方法だとリポジトリURIを取得できるので、上記2つの値を取得する必要もなくなります。
$ aws ecr describe-repositories --query 'repositories[0].repositoryName' --output text test-ecr $ aws ecr describe-repositories --query 'repositories[0].repositoryUri' --output text 000000000000.dkr.ecr.ap-northeast-1.amazonaws.com/test-ecr
リポジトリが複数ある場合、上記コマンドのリストの指定を変更するか、パラメータで直接指定する方法になりそうです。
また、ECRをCloudFormationで作成している場合は、ECR作成時にRepositoryUri
を出力することで、CodeBuildから指定することができます。
※参考
別アカウントの場合
別アカウントの情報を簡単に取得することは基本的にできなさそうなので、パラメータで直接指定することになりそうです。
StackSetsを使ってのクロスアカウントなリソース作成後にリソースを参照できたりするんでしょうか。
パラメータでの指定方法
CodeBuildではいくつかパラメータの指定方法があるので、そちらも書いておきます。
buildspec.yaml 中で指定
buildspec.yaml
では env
にて変数を指定することができます。また指定方法は3種類あり、それぞれ variables
parameter-store
secrets-manager
になります。
variables
はkey: value形式で変数を指定するシンプルな形式である一方、 parameter-store
はSystems Manager Parameter Storeに格納した情報を、 secrets-manager
はSecrets Managerに格納した情報を利用することができます。
※参考:
- [CodeBuild]buildspec.ymlでの環境変数指定方法あれこれまとめ
- AWS Doc - AWS CodeBuild: Build specification reference for CodeBuild
CodeBuildの EnvironmentVariables
CodeBuildの設定でパラメータを指定することもできます。 EnvironmentVariables
にkey: value形式で指定することで、 buildspec.yaml
に変数を渡すことができます。
またCloudFormationの Parameter
の値を EnvironmentVariables
に渡して利用することもできます。
AWSTemplateFormatVersion: "2010-09-09" Description: CodeBuild Parameters: ecrRepo: Type: String Default: "test-ecr" Resources: CodeBuildProject: Type: AWS::CodeBuild::Project Properties: Name: codebuild-test Description: Test project for AWS CI/CD ServiceRole: !GetAtt BuildRole.Arn Artifacts: Type: NO_ARTIFACTS Environment: Type: LINUX_CONTAINER ComputeType: BUILD_GENERAL1_SMALL Image: aws/codebuild/docker:18.09.0 EnvironmentVariables: - Name: "ECR_REPO" Value: !Ref ecrRepo