【发布时间】:2020-04-07 12:45:29
【问题描述】:
我有一个 AWS Cloudformation 堆栈,它是使用 Troposphere 在 Python 中创建的。我需要将 OriginAccessIdentity 添加到 S3 存储桶访问策略。
除其他外,我正在导入以下内容:
from awacs.aws import (
Allow,
Policy,
AWSPrincipal,
Statement
)
堆栈的一部分创建了一个 Cloudfront 发行版,添加了一个仅具有一个关联缓存行为的 S3 Origin。这很好用,创建了 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 作为主体添加到策略中,我需要用什么替换 *?
【问题讨论】:
标签: amazon-web-services amazon-s3 amazon-cloudformation amazon-cloudfront troposphere