删除存储桶 - Amazon Simple Storage Service

删除存储桶

您可以删除空的 Amazon S3 存储桶。在删除存储桶之前,请注意以下事项:

  • 存储桶名称是唯一的。如果删除存储桶,则另一个 AWS 用户可以使用该名称。

  • 如果存储桶托管静态网站,并且您如 教程:使用注册到 Route 53 的自定义域配置静态网站 中所述创建并配置了 Amazon Route 53 托管区域,则必须清理与该存储桶相关的 Route 53 托管区域设置。有关更多信息,请参阅 步骤 2:删除 Route 53 托管区域

  • 如果该存储桶收到来自 Elastic Load Balancing(ELB)的日志数据:建议先停止将 ELB 日志传输到该存储桶,然后再删除该存储桶。删除该存储桶后,如果其他用户创建使用相同名称的存储桶,则日志数据可能会传输到此同名存储桶。有关 ELB 访问日志的信息,请参阅《经典负载均衡器用户指南》中的访问日志和《应用程序负载均衡器用户指南》中的访问日志

问题排查

如果您无法删除 Amazon S3 存储桶,请考虑以下事项:

  • Make sure the bucket is empty(确保存储桶为空)— 您只能删除其中没有任何对象的存储桶。确保存储桶为空。

  • 确保没有附加任何接入点 — 您只能删除其中没有任何接入点的存储桶。在删除存储桶之前,请删除附加到该存储桶的所有接入点。

  • AWS Organizations 服务控制策略(SCP)– 服务控制策略可以拒绝对存储桶的删除权限。有关 SCP 的信息,请参阅《AWS Organizations 用户指南》中的服务控制策略

  • s3:DeleteBucket 权限 – 如果您无法删除存储桶,请与 IAM 管理员合作,确认您具有 s3:DeleteBucket 权限。有关如何查看或更新 IAM 权限的信息,请参阅《IAM 用户指南》中的更改 IAM 用户的权限

  • s3:DeleteBucket 拒绝语句 — 如果您在 IAM 策略中拥有 s3:DeleteBucket 权限且无法删除存储桶,则存储桶策略可能包含 s3:DeleteBucket 的拒绝语句。默认情况下,由 ElasticBeanstalk 创建的存储桶具有包含此语句的策略。您必须先删除此语句或存储桶策略,然后才能删除存储桶。

重要

存储桶名称是唯一的。如果删除存储桶,则另一个 AWS 用户可以使用该名称。如果您希望继续使用相同的存储桶名称,请不要删除该存储桶。我们建议您,清空并保留存储桶。

删除 S3 存储桶
  1. 登录到 AWS Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. Buckets(存储桶)列表中,请选择要删除的存储桶名称旁边的选项,然后选择页面顶部的 Delete(删除)

  3. Delete bucket(删除存储桶)页面上,通过在文本字段中输入存储桶名称来确认要删除存储桶,然后选择 Delete bucket(删除存储桶)

    注意

    如果存储桶包含任何对象,请在删除存储桶之前清空存储桶,具体操作如下:在 This bucket is not empty(此存储桶不为空)错误提醒中选择 empty bucket configuration(清空存储桶配置)链接,然后按照 Empty bucket(清空存储桶)页面上的说明操作。然后,返回到 Delete bucket(删除存储桶)页面并删除存储桶。

  4. 要验证您是否已删除存储桶,请打开 Buckets(存储桶)列表并输入您删除的存储桶的名称。如果无法找到此存储桶,则表示删除成功。

以下示例展示了如何使用适用于 Java 的 AWS SDK 删除存储桶。首先,该代码将删除存储桶中的对象,然后删除存储桶。有关其他 AWS SDK 的信息,请参阅用于 Amazon Web Services 的工具

Java

以下 Java 示例删除包含对象的存储桶。该示例将删除所有对象,然后删除存储桶。该示例适用于已启用版本控制或未启用版本控制的存储桶。

注意

对于未启用版本控制的存储桶,您可以直接删除所有对象,然后删除存储桶。对于启用了版本控制的存储桶,您必须先删除所有对象版本,然后再删除存储桶。

有关创建和测试有效示例的说明,请参阅《AWS SDK for Java 开发人员指南》中的入门

import com.amazonaws.AmazonServiceException; import com.amazonaws.SdkClientException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.*; import java.util.Iterator; public class DeleteBucket2 { public static void main(String[] args) { Regions clientRegion = Regions.DEFAULT_REGION; String bucketName = "*** Bucket name ***"; try { AmazonS3 s3Client = AmazonS3ClientBuilder.standard() .withCredentials(new ProfileCredentialsProvider()) .withRegion(clientRegion) .build(); // Delete all objects from the bucket. This is sufficient // for unversioned buckets. For versioned buckets, when you attempt to delete // objects, Amazon S3 inserts // delete markers for all objects, but doesn't delete the object versions. // To delete objects from versioned buckets, delete all of the object versions // before deleting // the bucket (see below for an example). ObjectListing objectListing = s3Client.listObjects(bucketName); while (true) { Iterator<S3ObjectSummary> objIter = objectListing.getObjectSummaries().iterator(); while (objIter.hasNext()) { s3Client.deleteObject(bucketName, objIter.next().getKey()); } // If the bucket contains many objects, the listObjects() call // might not return all of the objects in the first listing. Check to // see whether the listing was truncated. If so, retrieve the next page of // objects // and delete them. if (objectListing.isTruncated()) { objectListing = s3Client.listNextBatchOfObjects(objectListing); } else { break; } } // Delete all object versions (required for versioned buckets). VersionListing versionList = s3Client.listVersions(new ListVersionsRequest().withBucketName(bucketName)); while (true) { Iterator<S3VersionSummary> versionIter = versionList.getVersionSummaries().iterator(); while (versionIter.hasNext()) { S3VersionSummary vs = versionIter.next(); s3Client.deleteVersion(bucketName, vs.getKey(), vs.getVersionId()); } if (versionList.isTruncated()) { versionList = s3Client.listNextBatchOfVersions(versionList); } else { break; } } // After all objects and object versions are deleted, delete the bucket. s3Client.deleteBucket(bucketName); } catch (AmazonServiceException e) { // The call was transmitted successfully, but Amazon S3 couldn't process // it, so it returned an error response. e.printStackTrace(); } catch (SdkClientException e) { // Amazon S3 couldn't be contacted for a response, or the client couldn't // parse the response from Amazon S3. e.printStackTrace(); } } }

如果存储桶没有启用版本控制,则可以使用 AWS CLI 删除包含对象的存储桶。当您删除一个包含对象的存储桶时,该存储桶中的所有对象都将被永久删除,包括已转换为 S3 Glacier 存储类的对象。

如果存储桶未启用版本控制,则可将 rb(删除存储桶)AWS CLI命令和 --force 参数结合使用来删除存储桶及其中的所有对象。此命令将先删除所有对象,然后再删除存储桶。

如果启用了版本控制,则不会在此过程中删除版本控制对象,这将导致存储桶删除失败,因为存储桶不能为空。有关删除受版本控制的对象的更多信息,请参阅删除对象版本

$ aws s3 rb s3://bucket-name --force

有关更多信息,请参阅《AWS Command Line Interface 用户指南》中的将 AWS Command Line Interface 与高级别 S3 命令结合使用