【问题标题】:AWS: How to update an existing S3 bucket-policy via CloudFormation?AWS:如何通过 CloudFormation 更新现有的 S3 存储桶策略?
【发布时间】:2020-11-04 11:14:05
【问题描述】:

我有一个现有的 S3 存储桶my-bucket

我正在编写一个新的 CloudFormation 模板文件,该文件创建了一些与 my-bucket 交互的新 AWS 资源。现在,我的业务用例要求我在 CloudFormation 模板文件中为 my-bucket 的存储桶策略添加新的权限声明。

SourceBucketBucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: my-bucket
      PolicyDocument:
        Statement:
          - Effect: "Allow"
            Action:
              - 's3:PutBucketNotificationConfiguration'
            Resource: "arn:aws:s3:::my-bucket"
            Principal:
              AWS: !GetAtt MyLambdaExecutionRole.Arn

问题是存储桶已经具有以下存储桶策略,该策略是其他人在过去某个时间通过 AWS 控制台手动添加的。从业务角度来看,这是一个重要的存储桶策略,所以我无法摆脱它:

{
    "Version": "2012-10-17",
    "Id": "S3-Policy",
    "Statement": [
        {
            "Sid": "DataCraft-012345678901-S3-datacraft",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::012345678901:user/datacraft"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::my-bucket/*"
        }
    ]
}

所以我想我唯一的选择是更新现有的存储桶策略以另外适应我的新策略声明。问题是:如何通过 CloudFormation 模板文件做到这一点?

编辑:对于那些感兴趣的人,我最终通过写AWS::IAM::Policy而不是AWS::S3::BucketPolicy来解决问题:

SourceBucketNotificationConfigurationPolicy:
    Type: AWS::IAM::Policy
    Properties:
      PolicyDocument:
        Statement:
          - Action: s3:PutBucketNotification
            Effect: Allow
            Resource: "arn:aws:s3:::my-bucket"
        Version: '2012-10-17'
      PolicyName: BucketNotificationsRolePolicy
      Roles:
        - Ref: MyLambdaExecutionRole.Arn

【问题讨论】:

    标签: amazon-web-services amazon-s3 amazon-cloudformation


    【解决方案1】:

    很遗憾,您无法更新不受 CloudFormation 管理的现有策略。

    您唯一能做的就是通过重新创建使用 CloudFormation 来替换存储桶中的策略

    此外,现有的存储桶策略无法导入到 CloudFormation。原因是AWS::S3::BucketPolicy 不是importing 支持的资源。

    编辑:基于@JeremyThompsonComment

    我验证了UpdateReplacePolicy: Retain的使用。

    为此,我使用了自己的存储桶和策略。两者都是在 CloudFormation 之外使用 AWS 控制台创建的。

    然后,我用AWS::S3::BucketPolicy 创建了一个CFN 模板。模板的部署失败,有或没有UpdateReplacePolicy: Retain 有错误消息:

    The bucket policy already exists on bucket <bucket-name>.
    

    这意味着您无法替换现有的存储桶策略。必须在 CloudFormation 中重新创建该策略。

    【讨论】:

    • 真的吗?如果您设置了UpdateReplacePolicy: Retain,您不能安全地替换 S3 存储桶策略吗? docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/…
    • @JeremyThompson 我的理解是 OP 希望添加或修改不受 CloudFormation 控制的现有策略。我误解了这个问题吗?
    • 我在看这个并认为可以做到:stackoverflow.com/questions/47931342/…
    • @JeremyThompson 我将使用我自己的存储桶和策略仔细检查它。现在我可以删除答案,直到那时。感谢您告诉我:_)
    【解决方案2】:

    您还可以创建CustomResource,在其中实施更新现有存储桶策略的逻辑。确保实现对所有资源事件的处理:创建、更新、删除。

    例如,下面是在 S3 中创建文件夹的实现: https://aws.amazon.com/premiumsupport/knowledge-center/cloudformation-s3-custom-resources/

    【讨论】:

      猜你喜欢
      • 2021-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-30
      • 2017-10-14
      • 1970-01-01
      • 2019-01-23
      相关资源
      最近更新 更多