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
87KB
2K SLoC
s3du
s3du
是一个工具,可让您根据 AWS S3 或 AWS 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调用。
您将注意到,在 all
和 non-current
对象版本请求中,对 bucket-b
的 ListObjectVersions
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