使用wasabi作为s3兼容服务

S3 作为 AWS 的第一个云服务,且作为部分 aws 服务的基石,能与众多 aws 服务有着良好的整合。

除此之外,并且在众多的开源项目中也有着许多良好的支持如:

  • Gitlab artifacts/upload 的存储
  • Mastodon 的媒体文件存储
  • Discourse 的用户上传内容的存储

个人用 s3 比较多的地方,就是各种备份啦,如 gitlab 的备份,数据库备份等.

然而 aws 的 s3 并不便宜,由于按量计费,基本就是用多少付多少。以 us-east 为例,前 50TB 存储成本为: $0.023 per GB. 在加上$0.023 per GB出站流量费用,如果数据量比较大,对于个人,可能是用不起的…

好在 s3 基本作为事实标准的对象存储 api,大部分云厂商都有良好的支持。同时,一些不像 Azure/GCP 那么大的云服务厂商,也均有提供物美价廉的 s3 兼容服务。而这其中,最便宜的可能莫过于 Wasabi 了。

完整价格参见: https://aws.amazon.com/s3/pricing/

Wasabi 价格

wasabi 也是按量收费,其中只计算存储费用,但是至少存储 1TB,不满 1TB 也会按照 1TB 收取 5.99usd 的费用。出入站流量均不另外计费,API 请求也不另外收费。可以认为,wasabi 基本就是按照存储大小计费。而 5.99usd/1TB 的价格,相比于 s3,可谓很便宜了~

具体价格说明见: https://wasabi.com/cloud-storage-pricing/

在 aws cli 中使用 Wasabi

wasabi 兼容 s3 api,因此我们可以在 aws cli 中直接使用。

首先,我们按照 awscli 以及 endpoint plugin:

pip3 install awscli
pip3 install awscli-plugin-endpoint

修改~/.aws/config创建内容:

[plugins]
endpoint = awscli_plugin_endpoint

[wasabi]
region = us-east-1
s3 =
  endpoint_url = https://s3.wasabisys.com
  signature_version = s3v4
  max_concurrent_requests = 100
  max_queue_size = 1000
  multipart_threshold = 50MB
  multipart_chunksize = 10MB
s3api =
  endpoint_url = https://s3.wasabisys.com

PS: wasabi 不同地区的 endpoint 可以再此查看.

如使用欧洲区域,那么则需要将s3.wasabisys.com 替换为 s3.eu-central-1.wasabisys.com.

接下来,需要在~/.aws/credentials里配置 access key:

[wasabi]
aws_access_key_id=<ACCESS_KEY>
aws_secret_access_key=<SECRET_KEY>

配置完成后,我们可以通过命令来验证是否配置成功:

aws s3 ls --profile wasabi

除了 aws cli 之外,我们也可以通过 rclone 是用 wasabi,具体可以查阅官方文档.

使用 Terraform 管理 Wasabi 的子账号

Wasabi 支持 AWS IAM,因此,我们可以通过子账号进行权限划分,通过不同的 User 来操作不同 Bucket。同时,由于 Wasabi 也支援 IAM 的 API,因此,我们能通过 Terraform 来管理 Wasabi 的 IAM User 以及权限。

首先,我们在 main.tf 使用 Aws Provider 并自定义 endpoint:

provider aws {
  region = "us-east-1"
  profile = "wasabi"
  endpoints {
    sts = "https://sts.wasabisys.com"
    iam = "https://iam.wasabisys.com"
    s3  = "https://s3.us-east-2.wasabisys.com"
  }

  s3_force_path_style    = true
  skip_get_ec2_platforms = true
}

创建 Policy 并授权给 User:

resource "aws_iam_policy" "bucket" {
  name = "bucket"
  path = "/"

  policy = file("bucket.json")
}

resource "aws_iam_user" "user" {
  name = "user"
}

resource "aws_iam_user_policy_attachment" "user-bucket-attach" {
  user       = aws_iam_user.user.name
  policy_arn = aws_iam_policy.bucket.arn
}

PS: 由于 wasabi 对 s3 的部分 api 支援不完整,因此,不能通过 Terraform 来管理 Bucket.

Wasabi 的问题

Delete Storage

wasabi 对于删除不满 90 天的文件,会收取 Delete Storage 的费用,因此如果频繁删除文件,也会造成不少额外费用。对应的,我们可以将备份等文件尽量保持 90 天来规避此问题。

稳定性

我在 18 年就开始使用 Wasabi,其中用途比较多,除了各种备份之外,还用于了 Go Mod Proxy/Docker Registry 等。其中就发现,wasabi 在稳定性跟速度上,相比于 digitalocean 的 Spaces,稳定性以及速度并不那么好。2 年过去了,由于 Go Mod Proxy/Docker Registry 已经不放在 wasabi 了,这里不太好做过多评价。但是如果作为备份存储,wasabi 是个不错的选择。

其他选择

除了 Wasabi 之外,也有一些不错的选择。

DigitalOcean Spaces

DigitalOcean 的 Spaces 是按照存储+流量计费,但也有最低消费 $5/m,这其中包含了 250GiB 的存储,以及 1T 的出站流量。超出的费用为存储: $0.02/GB, 出站流量费用: $0.01/GB. 如果阁下的服务已经在使用 DigitalOcean,那么 spaces 也是个不错的选择。

完整价格说明见: https://www.digitalocean.com/pricing/#spaces-object-storage

Object Storage

Scaleway 也提供有 s3 兼容服务,也是按照存储+出站流量计费。价格为: €0.015/GB,出站流量费用为: €0.01/GB. 不过值得注意的是,Scaleway 有 75GiB 的免费存储额度,以及每个月有 75GiB 的免费出站流量额度。同时,如果有 Scaleway 的机器,那么通过机器不会产生额外的流量费用, 如通过 scaleway 的机器进行出站流量中转,那么将会只有存储费用。

更多关于 Scaleway Ojbect Storage 的说明见: https://www.scaleway.com/en/pricing/#object-storage

自建 MinIO

个人是不太建议自建 MinIO 的,特别是用于存储重要数据,还不如直接用便宜的 s3 兼容服务。但是如果阁下有 Online/Kimsufi 等便宜的大容量硬盘的杜甫/VPS 等,用于做一个备份也是一个不错的选择。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!