我有一些使用
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
。
我对过去如何公开存储桶有一个类似的问题,但我不想将所有 PublicAccessBlockConfiguration 设置和所有权配置设置添加到我的所有存储桶中。 我更愿意简化并恢复默认设置。
AWS 给出了有效的回复!
感谢您提供工作示例模板和堆栈 ARN。我能够重现错误消息,并且还能够成功删除 AccessControl 属性而不删除存储桶。
以下是我遵循的步骤:
问题的核心是存储桶所有权设置[1]强烈尝试使用ACL。默认情况下强制执行存储桶所有者,这会阻止修改 ACL。删除 ACL 是一种修改形式,它会导致我们遇到此问题。
前进的方向是推送堆栈更新,将存储桶所有权控制设置为 BucketOwnerPreferred(允许 ALC),然后禁用 ACL,然后设置 BucketOwnerEnforced(与之前相同)。