AWS:如何通过CloudFormation更新现有的S3存储桶策略?

时间:2020-07-15 02:24:32

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

我有一个现有的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

2 个答案:

答案 0 :(得分:3)

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

您唯一可以做的就是通过重新创建CloudFormation在存储桶中替换策略

此外,现有存储段策略无法导入到CloudFormation中。原因是importing不支持Server Sudo PPP Sambacry Specter_Meltdown ajhn001 yes yes no yes ajhg002 yes yes no no 的资源。

编辑:基于@JeremyThompson

我已验证使用AWS::S3::BucketPolicy

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

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

UpdateReplacePolicy: Retain

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

答案 1 :(得分:1)

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

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