如何使用对流层将 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
)