如何使用对流层将 OriginAccessIdentity 添加到 AWS S3 存储桶策略
How to add OriginAccessIdentity to AWS S3 Bucket Policy using troposphere
我有一个 AWS Cloudformation 堆栈,使用 Troposphere 在 Python 中创建。我需要将 OriginAccessIdentity 添加到 S3 存储桶访问策略。
除其他外,我正在导入以下内容:
from awacs.aws import (
Allow,
Policy,
AWSPrincipal,
Statement
)
堆栈的一部分创建了一个 Cloudfront 分布,添加了一个仅具有一个关联的 cacheBehavior 的 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
作为委托人添加到策略中?
替换为:
Principal=AWSPrincipal(["*"]),
有了这个:
Principal=Principal(
"CanonicalUser",
GetAtt(cloudfrontOriginAccessIdentity, "S3CanonicalUserId"),
),
替换为:
from awacs.aws import (
Allow,
Policy,
AWSPrincipal,
Statement
)
有了这个:
from awacs.aws import (
Allow,
Policy,
Principal,
Statement
)
我有一个 AWS Cloudformation 堆栈,使用 Troposphere 在 Python 中创建。我需要将 OriginAccessIdentity 添加到 S3 存储桶访问策略。
除其他外,我正在导入以下内容:
from awacs.aws import (
Allow,
Policy,
AWSPrincipal,
Statement
)
堆栈的一部分创建了一个 Cloudfront 分布,添加了一个仅具有一个关联的 cacheBehavior 的 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
作为委托人添加到策略中?
替换为:
Principal=AWSPrincipal(["*"]),
有了这个:
Principal=Principal(
"CanonicalUser",
GetAtt(cloudfrontOriginAccessIdentity, "S3CanonicalUserId"),
),
替换为:
from awacs.aws import (
Allow,
Policy,
AWSPrincipal,
Statement
)
有了这个:
from awacs.aws import (
Allow,
Policy,
Principal,
Statement
)