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