• 作成:

AWS CDKのECSとBucketのスタック間でのwould create a cyclic referenceを解決する

問題

// バケットをアプリケーションから無制限にアクセスできるようにします
bucket.addToResourcePolicy(
  new iam.PolicyStatement({
    actions: ["*"],
    resources: [bucket.bucketArn, bucket.arnForObjects("*")],
    principals: [
      applicationLoadBalancedFargateService.taskDefinition.taskRole,
    ],
  })
);

みたいに特定のバケットに特定のECSタスクだけアクセスさせたいみたいなことがあると思います。

この時、 S3バケットはスタックを消去したときも残したいなと思い、しかし残す場合は再作成のインポート作業が大変なので、 S3だけ常に削除しない別のスタックに置いていたりする場合循環参照の問題が解決します。

'BucketStack' depends on 'MainStack' (BucketStack -> MainStack/deve-ALBEc2/TaskDef/TaskRole/Resource.Arn). Adding this dependency (MainStack -> BucketStack/deve-bucket-foo/Resource.RegionalDomainName) would create a cyclic reference.

のような循環参照エラーですね。

解決法

本当に権限を渡すのに必要なのはスタックまるごとではなくtaskRoleなので、 taskRoleだけ作る共通の親スタックを作り、双方で使うことで解決しました。