TECHSTEP

ITインフラ関連の記事を公開してます。

【メモ】AWS CodeBuildでECRへのアクセス情報を設定するときの選択肢

以前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の 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