AWS SAM /云形成S3存储桶访问控制私有删除

问题描述 投票:0回答:1

问题

我有一些使用

AccessControl: Private
通过 AWS SAM/CloudFormation 设置的旧存储桶。 此属性已被弃用,我假设将来会删除它,但我不知道如何删除该属性并成功部署。

使用该房产进行建筑时,我现在收到以下警告:

W3045 Consider using AWS::S3::BucketPolicy instead of AccessControl

现在这是 100% 可以理解和预期的,因为这已在 AWS 文档中正式标记为遗留属性。

如果我删除该属性并尝试重新部署,则会收到以下错误:

Resource handler returned message: "The bucket does not allow ACLs (Service: S3, Status Code: 400..."

存储桶设置为默认值,这意味着

Block all public access
On
并且 ACL 管理已关闭。我不知道 CloudFormation 正在做什么来尝试在存储桶上配置 ACL,但我假设如果存储桶设置为“私有”,现在您删除该设置,它应该恢复为默认值...即“私有”。

来自文档

S3 buckets are created with ACLs disabled by default. Therefore, unless you explicitly set the AWS::S3::OwnershipControls property to enable ACLs, your resource will fail to deploy with any value other than Private. Use cases requiring ACLs are uncommon.

所以,我真正的问题是,如何删除 AccessControl 属性,该属性设置为默认值,如果删除,应该不会对存储桶产生影响。

简单测试

T001_test/template.yaml

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Test for AccessControl Removal

#################################
# Parameters
#################################

Parameters:
  BucketName:
    Description: S3 Bucket Name
    Type: String
    Default: so-test-access-control-bucket

#################################
# Resources
#################################
Resources:
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Ref BucketName
      AccessControl: Private
      # A few extra settings just for fun...
      LifecycleConfiguration:
        Rules:
          - Id: "Delete old versions"
            Status: Enabled
            NoncurrentVersionExpirationInDays: 7
          - Id: "Delete all objects older than 120 days"
            Status: Enabled
            ExpirationInDays: 120
      NotificationConfiguration:
        EventBridgeConfiguration:
          EventBridgeEnabled: true

T001_test/samconfig.toml

# More information about the configuration file can be found here:
# https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-config.html
version = 0.1

[default]
[default.global.parameters]
stack_name = "T001-TEST"

[default.build.parameters]
cached = true
parallel = true

[default.validate.parameters]
lint = true

[default.deploy.parameters]
confirm_changeset = true
image_repositories = []
s3_prefix = "T001-TEST"
region = "us-east-1"
resolve_s3 = true
tags = "AppManagerCFNStackKey=T001-TEST"


[default.package.parameters]
region = "us-east-1"
resolve_s3 = true

[default.sync.parameters]
watch = true

[default.local_start_api.parameters]
warm_containers = "EAGER"

[default.local_start_lambda.parameters]
warm_containers = "EAGER"

运行以下命令:

sam build

您将收到有关 AccessControl 属性的警告,但您可以忽略它们。

部署:

sam deploy

模板将成功部署(您可能需要更改存储桶名称)。

删除 AccessControl 属性 接下来,删除访问控制属性,然后再次

build
deploy

您应该会收到如下错误: SAM Error

我对过去如何公开存储桶有一个类似的问题,但我不想将所有 PublicAccessBlockConfiguration 设置和所有权配置设置添加到我的所有存储桶中。 我更愿意简化并恢复默认设置。

amazon-web-services amazon-s3 aws-cloudformation sam
1个回答
0
投票

AWS 给出了有效的回复!


感谢您提供工作示例模板和堆栈 ARN。我能够重现错误消息,并且还能够成功删除 AccessControl 属性而不删除存储桶。

以下是我遵循的步骤:

  1. 使用 AccessControl: Private 成功部署存储桶
  2. 注释掉AccessControl并部署,这样更新失败并回滚
  3. 添加OwnershipControls、BucketOwnerPreferred,部署成功
  4. 注释掉AccessControl并部署,部署成功
  5. 将ObjectOwnership设置为BucketOwnerEnforced,部署成功

问题的核心是存储桶所有权设置[1]强烈尝试使用ACL。默认情况下强制执行存储桶所有者,这会阻止修改 ACL。删除 ACL 是一种修改形式,它会导致我们遇到此问题。

前进的方向是推送堆栈更新,将存储桶所有权控制设置为 BucketOwnerPreferred(允许 ALC),然后禁用 ACL,然后设置 BucketOwnerEnforced(与之前相同)。

© www.soinside.com 2019 - 2024. All rights reserved.