我有一个 AWS Cloudformation 堆栈,使用 Troposphere 在 Python 中创建。我需要将 OriginAccessIdentity 添加到 S3 存储桶访问策略。
除其他外,我正在导入以下内容:
from awacs.aws import (
Allow,
Policy,
AWSPrincipal,
Statement
)
堆栈的一部分创建了一个 Cloudfront 分发,添加了一个仅具有一个关联缓存行为的 S3 Origin。这很好用,创建了一个行为,并且可以在 AWS Cloudfront 控制台中看到。
我使用以下代码创建了 OriginAccessIdentity:
cloudfrontOriginAccessIdentity = t.add_resource(CloudFrontOriginAccessIdentity(
"cloudfrontOriginAccessIdentity",
CloudFrontOriginAccessIdentityConfig=CloudFrontOriginAccessIdentityConfig(
Comment = "React-Pattern-Origin-Access-Identity"
)
))
同样,这可以正常工作,并且 OriginAccessIdentity 已创建并且可以在 AWS Cloudfront 控制台中看到,并且与 Origin 相关联。
我正在使用以下代码创建 S3BucketPolicy:
t.add_resource(s3.BucketPolicy(
"reactBucketPolicy",
Bucket=Ref("ParamS3BucketName"),
PolicyDocument=dict(
Statement=[dict(
Sid="reactBucketPolicyStatement01",
Effect="Allow",
Action=[
"s3:GetObject"
],
Principal=AWSPrincipal(["*"]),
Resource=[Join("", ["arn:aws:s3:::", Ref("ParamS3BucketName"), "/*"])],
)],
)
))
这也可以正常工作,生成策略并将其附加到存储桶 - 可以在 AWS S3 控制台中看到。我遇到的问题是试图
Principal=AWSPrincipal(["*"])
用
Principal=AWSPrincipal([<the_origin_access_identity>])
我已经尝试
Principal=AWSPrincipal([Join("", ["origin-access-identity/cloudfront/", "Ref(cloudfrontoriginaccessidentity)"])])
过
Principal=AWSPrincipal([Ref(cloudfrontoriginaccessidentity)])
但 Cloudformation 拒绝更新,称 Principal 无效。*
为了让 Cloudformation 将我OriginAccessIdentity
作为主体添加到策略中,我需要替换什么?