0

我有一个 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作为主体添加到策略中,我需要替换什么?

4

1 回答 1

0

替换这个:

Principal=AWSPrincipal(["*"]),

有了这个:

Principal=Principal(
    "CanonicalUser", 
    GetAtt(cloudfrontOriginAccessIdentity, "S3CanonicalUserId"),
),

替换这个:

from awacs.aws import (
    Allow,
    Policy,
    AWSPrincipal,
    Statement
)

有了这个:

from awacs.aws import (
    Allow,
    Policy,
    Principal,
    Statement
)
于 2019-12-19T08:04:00.013 回答