Open4

ローカルテスト用のminioの代わりにversitygwを使う

fujiwarafujiwara

minioがビルド済みバイナリとDocker imageの提供を停止してしまったのでローカル(CI)でテストするためにminioを使っていたところもどうにかしたい。
https://linuxiac.com/minio-with-yet-another-controversial-move/

要件

  • CI で S3 にアクセスするコードのテストをする
  • S3 API で基本的な操作ができればよい
    • bucketやobjectの読み書きぐらい

versitygw というのを見つけたのでそれで試す。

https://github.com/versity/versitygw

Use Cases

  • Turn your local filesystem into an S3 server with a single command!
  • Proxy S3 requests to S3 storage
  • Simple to deploy S3 server with a single command
  • Protocol compatibility in posix allows common access to files via posix or S3
  • Simplified interface for adding new storage system support

名前の通り S3 API のゲートウェイで、認証や実際のデータ保存部分は外部 (認証は LDAP, FreeIPA, Hashicorp Vault など、ストレージは POSIX filesystem, ScoutFS, Azure Blob Storage, 他の S3 互換サーバーなど) に投げるというプロダクト。

fujiwarafujiwara

認証はシングルユーザー(アクセスキー決め打ち)、バックエンドは普通のファイルシステムで port 10000 で起動する例。

$ ROOT_ACCESS_KEY="testuser" ROOT_SECRET_KEY="secret" ./versitygw --port :10000 posix /tmp/gw

No IAM service configured, enabling single account mode
┌────────────────────────────────────────────────────────────────────┐
│                             VersityGW                              │
│                   Version 1.0.18, Build Homebrew                   │
│               (bound on host 0.0.0.0 and port 10000)               │
│                                                                    │
│Admin/S3 service listening on:                                      │
│  http://127.0.0.1:10000                                            │
(略)

アクセスする側は以下の設定で aws cli などでアクセスすればよい

  • AWS_REGION=us-east-1
  • AWS_ACCESS_KEY_ID=testuser
  • AWS_SECRET_ACCESS_KEY=secret
  • AWS_ENDPOINT_URL_S3=http://127.0.0.1:10000
$ aws s3api create-bucket --bucket testbucket
$ aws s3 cp foo.txt s3://testbucket/
$ aws s3 cp s3://testbucket/foo.txt -
foo

普通にファイルシステム上にputしたオブジェクトが作成されている。

$ find /tmp/gw
/tmp/gw
/tmp/gw/testbucket
/tmp/gw/testbucket/foo.txt
/tmp/gw/testbucket/.sgwtmp
fujiwarafujiwara

注意点

リージョンは versitygw 起動時に環境変数 VGW_REGION または --region 引数で与える

リージョン名は文字列ならなんでもよい、省略すると us-east-1 になるのでクライアントはそれを使うのでもよい

S3 の Virtual Host 形式には対応していない(?)

S3 API の path 形式 (/{bucketname}/{keyname}) に対応しているが、VirtualHost形式 (Host名にbucketが含まれれる形式、本家S3ではこちらが推奨)は対応していないぽい

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/VirtualHosting.html

  • aws cli では問題ない
  • aws-sdk-go-v2 ではデフォルトで VirtualHost 形式を使うので、クライアント作成時に UsePathStyle = true の指定が必要
client := s3.NewFromConfig(cfg, func(o *s3.Options) {
    o.UsePathStyle = true
})

本物のS3にアクセスするときに path style を使うのはよくないので、endpoint が指定されたときだけ path style に切り替えるのがよさそう。