【问题标题】:How to add OriginAccessIdentity to AWS S3 Bucket Policy using troposphere如何使用对流层将 OriginAccessIdentity 添加到 AWS S3 存储桶策略
【发布时间】: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


    【解决方案1】:

    替换这个:

    Principal=AWSPrincipal(["*"]),
    

    用这个:

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

    替换这个:

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

    用这个:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-13
      • 2019-05-15
      • 2022-11-08
      • 2019-04-24
      • 2012-11-23
      相关资源
      最近更新 更多