尝试添加到资源策略时解决循环依赖关系

Roy*_* Ca 5 aws-cloudformation aws-cdk

我正在使用 CDK,但我认为纯 CloudFormation 也会发生相同的问题(并且希望可以解决)

我正在创建一个带有 KMS 密钥的 S3 存储桶,如下所示:

key = aws_kms.Key(self, id="MasterKey"...)
bucket = aws_s3.Bucket(..., encryption_key=key, ...)
Run Code Online (Sandbox Code Playgroud)

然后,我尝试通过对不使用存储桶策略的任何内容添加拒绝来收紧策略,如下所示,正如此aws 博客所建议的那样(这不是针对 KMS,而是针对 S3 存储桶,但是想法是一样的)就像这样:

key_policy = iam.PolicyStatement(
    actions=["kms:Encrypt"],
    effect=iam.Effect.DENY,
    resources=['*'],  # In a key policy, "*" means "this CMK"
    principals=[iam.ServicePrincipal(service="*")],
    conditions={
        "StringNotLike": {
            "aws:userId": f"{bucket_role_id}:*",
        },
    }
)

key.add_to_resource_policy(key_policy)
Run Code Online (Sandbox Code Playgroud)

当我尝试部署时,出现循环依赖错误,这是有道理的,因为 S3 创建需要 KMS,而 KMS 创建使用使用 S3 角色 ID 的策略。

有没有办法解决这个问题(事后不诉诸使用 boto3 或类似的东西)?这是 CDK 的问题还是 CloudFormation 的问题?我想如果我们可以在部署期间更新资源,但在部署资源之后,那么这就可以工作。

感谢您的帮助。