#amazon-s3 #s3 #aws #aws-cli

app s3du

显示 AWS S3 存储桶使用的空间命令行工具

7 个稳定版本

1.1.0 2021年6月8日
1.0.5 2020年7月25日
1.0.4 2020年6月4日
1.0.3 2020年5月6日
1.0.2 2020年4月17日

#16 in #aws-cli

MIT/Apache

87KB
2K SLoC

s3du

s3du 是一个工具,可让您根据 AWS S3AWS CloudWatch 了解您的 S3 存储桶使用多少空间。

CloudWatch 模式是最便宜的,但最不准确的方法来获取存储桶大小。它的准确性较低,因为与 CloudWatch 中存储桶大小相比,实际的存储桶大小最多有 24 小时的延迟,因为 CloudWatch 仅每天更新一次 S3 存储桶大小 一次

S3 模式是最准确但成本较高的操作模式。在此模式下,将列出每个发现的存储桶中的所有对象,并将它们的尺寸相加。

安装

s3du 可以通过运行 cargo install s3du 安装。

最低支持的 Rust 版本

此项目的 MSRV 目前为 1.40.0。

用法

s3du 使用默认的 AWS 凭证链。只要您的 AWS 凭证以某种形式可用,并且您的 IAM 用户/角色具有正确的权限,只需运行 s3du 就应该返回一些结果。

例如,如果您使用 aws-vault 管理凭证,则可以按如下方式运行 s3du

aws-vault exec s3du-role -- s3du

默认情况下,s3du 将在 us-east-1 区域中运行。这可以通过 AWS_REGION 环境变量或 --region 命令行参数来覆盖。

# Overriding the default AWS region with an environment variable
env AWS_REGION=eu-west-1 s3du

# Overriding the default AWS region with a CLI arg
s3du --region=eu-central-1

# Listing all buckets in S3 mode
s3du --mode=s3

# Listing a specific bucket's non-current object versions in S3 mode
s3du --mode=s3 --object-versions=non-current my-bucket

有关运行 s3du 的更多信息,请参阅手册页面或使用 s3du --help

功能包特性

功能包有两个特性,默认都启用。

功能 目的
cloudwatch 启用使用 CloudWatch API
s3 启用使用 S3 API

s3du 至少需要启用这些特性中的一个,尝试使用两个特性都禁用编译功能包将导致编译错误。

AWS CloudWatch 和 AWS S3 存储桶大小差异

CloudWatch 和 S3 模式将报告大小略有不同。CloudWatch 模式将始终显示总存储桶大小,即它将显示所有当前对象版本和非当前对象版本的尺寸。无法更改此行为。

S3模式默认情况下,只会显示当前对象版本的大小。可以通过命令行标志(或环境变量)来更改S3模式的工作方式。使用这些选项,您可以以以下三种方式之一来更改S3模式:

  • 全部:显示所有以下列出模式的桶大小之和。
  • 当前:显示所有当前对象版本的桶大小之和,这是默认值。
  • 分片:显示所有正在进行的多部分上传的桶大小之和。
  • 非当前:显示所有非当前对象版本的桶大小之和。

这些可以通过--object-versions CLI标志选择,前提是s3du编译时带有s3特性。

IAM策略

为了启用s3du的使用,您的IAM用户或角色需要附加以下一个或两个IAM策略,具体取决于您想使用哪些s3du模式。

这些策略的完整示例提供如下:

  • 一个CloudFormation模板
  • IAM策略JSON文件
  • 一个Terraform模块

位于源代码库的aws目录下。

CloudWatch IAM策略

此策略将强制使用HTTPS,并允许s3du访问它所需的AWS CloudWatch API。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "s3du-cloudwatch",
            "Effect": "Allow",
            "Action": [
                "cloudwatch:GetMetricStatistics",
                "cloudwatch:ListMetrics"
            ],
            "Resource": [
                "*"
            ],
            "Condition": {
                "Bool": {
                    "aws:SecureTransport": true
                }
            }
        }
    ]
}

S3 IAM策略

此策略将强制使用HTTPS,并允许s3du访问它所需的AWS S3 API。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "s3du-s3",
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:ListAllMyBuckets",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads",
                "s3:ListMultipartUploadParts"
            ],
            "Resource": [
                "*"
            ],
            "Condition": {
                "Bool": {
                    "aws:SecureTransport": true
                }
            }
        }
    ]
}

API使用

获取桶大小的方法各有不同的成本,因为它们会执行不同数量的API调用,并且每个API都有自己的定价模型,这可能会因地区而异。

CloudWatch

AWS CloudWatch是运行s3du成本最低的方法,但会牺牲一些准确性。

s3du的CloudWatch模式至少会使用1次API调用执行ListMetrics调用,并至少为每个S3桶使用1次API调用执行GetMetricStatistics调用。

之所以列出为“至少1”,是因为如果结果列表足够长,API调用结果可能会分页。《ListMetrics》会在500个结果后分页,而《GetMetricStatistics》会在1,440个统计信息后分页。

作为一个基本示例,获取包含4个S3桶的AWS账户的桶大小应该总共使用5次API调用。1次《ListMetrics》调用用于发现桶,4次《GetMetricStatistics》调用(每个桶一次)。

S3

AWS S3是一种成本更高但更精确的列出桶大小的方法。

s3du的S3模式将使用1次API调用执行《ListBuckets》API调用,为每个列出的桶使用1次API调用执行《GetBucketLocation》以发现其区域,为每个列出的桶使用1次API调用执行《HeadBucket》以确保我们可以列出对象,并且

  • 至少1次《ListMultipartUploads》调用,至少1次《ListObjectVersions》调用,以及至少1次《ListParts》调用(如果在《全部》对象模式下发现正在进行的多部分上传)
  • 在《当前》对象(默认)模式下,每个桶至少1次《ListObjectsV2》调用
  • 在《非当前》对象模式下,每个桶至少1次《ListObjectVersions》调用
  • 在每个桶的 Multipart 模式下,至少调用一次 ListMultipartUploads,如果找到任何正在进行的分片上传,则至少调用一次 ListParts

上述每个 API 调用最多返回 1,000 个对象,如果您的桶中的对象多于这个数量,则需要分页。

例如,假设我们在 S3 模式下运行,获取 current 对象版本的大小,并且我们的 AWS 账户有 2 个桶。 bucket-a(未启用版本控制)有 10,000 个对象,而 bucket-b(启用版本控制)有 32,768 个对象版本,其中 13,720 个是当前版本,19,048 个是非当前版本。在 bucket-a 中还有一个包含 2 个分片已上传的正在进行的分片上传。这意味着

  • 1 次调用 ListBuckets 用于桶发现
  • 2 次调用 GetBucketLocation 用于区域发现,每个桶 1 次
  • 2 次调用 HeadBucket 以检查我们是否有访问权限,每个桶 1 次
  • 10 次调用 ListObjectsV2 用于 bucket-a
  • 14 次调用 ListObjectsV2 用于 bucket-b

总共 29 次API调用。

如果我们对同一账户再次运行 s3du,但要求所有对象版本的求和,我们将得到以下结果

  • 1 次调用 ListBuckets 用于桶发现
  • 2 次调用 GetBucketLocation 用于区域发现,每个桶 1 次
  • 2 次调用 HeadBucket 以检查我们是否有访问权限,每个桶 1 次
  • 10 次调用 ListObjectVersions 用于 bucket-a
  • 33 次调用 ListObjectVersions 用于 bucket-b
  • 1 次调用 ListMultipartUploads 用于 bucket-a
  • 1 次调用 ListMultipartUploads 用于 bucket-b
  • 1 次调用 ListParts 用于 bucket-a

总共 51 次API调用。

对同一账户进行第三次 s3du 运行,但要求非当前对象版本的求和,将得到以下结果

  • 1 次调用 ListBuckets 用于桶发现
  • 2 次调用 GetBucketLocation 用于区域发现,每个桶 1 次
  • 2 次调用 HeadBucket 以检查我们是否有访问权限,每个桶 1 次
  • 1 次调用 ListObjectVersions 用于 bucket-a
  • 33 次调用 ListObjectVersions 用于 bucket-b

总共 39 次API调用。

您将注意到,在 allnon-current 对象版本请求中,对 bucket-bListObjectVersions API 调用次数相同,这是因为在这些场景中,对当前与非当前对象进行的任何筛选都必须由 s3du 完成。 ListObjectVersions API 不允许我们指定我们希望检索哪些对象版本。

S3 兼容存储

在 S3 模式下运行时,s3du 允许指定自定义端点。这允许在 S3 兼容存储(如 MinIO)上使用。

此用例目前仅在 MinIO 上进行了测试,并且非常基本。

示例

env AWS_ACCESS_KEY_ID=minio \
    AWS_SECRET_ACCESS_KEY=miniosecret \
    s3du --mode=s3 --endpoint=https://minio.example.org/

依赖项

~20–34MB
~609K SLoC