インフラ

別アカウントから使用できるECRをCDKで書いてみた

ECR

こんにちは、ちゃりおです。

AWSアカウントを分けているのですが、共通のDockerイメージを使いたいため
別アカウントで同じECRを使いたいことがありました。

以下をCDKでやってみました。(Typescript)

  • アカウントA: ECRの作成、アカウントBからのアクセスを許可(ポリシーの追加)
  • アカウントB: アカウントAのECRを取得

別アカウントから使用できるECRをCDKで書いてみた

アカウントA: ECRを作成、アカウントBからのアクセスを許可(ポリシーの追加)

初期状態だと、アカウントAのECRにアカウントBからはアクセスすることができません。
そこで、ECRのポリシーでアカウントBからのアクセスを許可します。

必要なポリシーについては、AWS公式のQAにありました。

CDKで書く場合の例です。

const policyStatement = new iam.PolicyStatement({
  effect: iam.Effect.ALLOW,
  principals: [new iam.AccountPrincipal("AWSアカウントID")],
  actions: [
    "ecr:BatchCheckLayerAvailability",
    "ecr:GetDownloadUrlForLayer",
    "ecr:BatchGetImage",
    "ecr:PutImage",
    "ecr:InitiateLayerUpload",
    "ecr:UploadLayerPart",
    "ecr:CompleteLayerUpload"
  ]
})
const repo = new ecr.Repository(this, "sample-repo", {
  repositoryName: "sample-repo",
  removalPolicy: RemovalPolicy.DESTROY
})
repo.addToResourcePolicy(policyStatement)

ECRを作って、必要なポリシーをアタッチしています。

アカウントB: アカウントAのECRを取得

アカウントB側のCDKでは、アカウントAからECRを取得する必要があります。

リポジトリを取得するには、「fromRepositoryName」も使用できますがアカウントB内のECRから探してしまうため
「fromRepositoryArn」を使用しました。

const repo = ecr.Repository.fromRepositoryArn(
  this,
  "sample-repo",
  "arn:aws:ecr:<リージョン>:<アカウントID>:repository/sample-repo"
)

ECRのレポジトリを取得できたので、アカウントB側でもアカウントAのECRのリポジトリを使用できるようになりました。
(CodebuildやECSなどで使用)

まとめ

アカウントBで「fromRepositoryName」使っていて、少しハマりました。
アカウントBには、ECR作成していないので当然ですよね。

「fromRepositoryArn」でARNべた書きしていますが、cdk.jsonに書いておくとかがいいかもしれません。
(アカウントB側のCDKでアカウントAのECR ARN取得をできればいいのですが、思いつかず。。)

Amzonで「AWS」の本を見てみる

楽天で「AWS」の本をみてみる!!

sap
AWSソリューションアーキテクトプロフェッショナル(SAP)のシンプルな勉強法こんにちは、ちゃりおです。 AWS SAPを取得したので、勉強法を書きます。 いろいろな方法があると思いますが、なるべくシンプルにまと...
実践AWS CDK
CDKの基礎を「実践 AWS CDK – TypeScript でインフラもアプリも!」で学ぼうこんにちは、ちゃりおです。 以前から気になっていた「実践 AWS CDK – TypeScript でインフラもアプリも!」を読みまし...
CDK Codepipline
CDK + CodepipelineでEC2へのシンプルなデプロイフローを作るこんにちは、ちゃりおです。 最近、CDKでEC2にデプロイするCodepipeline作りました。 初めてCDKでCodeシリーズを...