Open4
ローカルテスト用のminioの代わりにversitygwを使う
minioがビルド済みバイナリとDocker imageの提供を停止してしまったのでローカル(CI)でテストするためにminioを使っていたところもどうにかしたい。
要件
- CI で S3 にアクセスするコードのテストをする
- S3 API で基本的な操作ができればよい
- bucketやobjectの読み書きぐらい
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 互換サーバーなど) に投げるというプロダクト。
認証はシングルユーザー(アクセスキー決め打ち)、バックエンドは普通のファイルシステムで 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-1AWS_ACCESS_KEY_ID=testuserAWS_SECRET_ACCESS_KEY=secretAWS_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
注意点
リージョンは versitygw 起動時に環境変数 VGW_REGION または --region 引数で与える
リージョン名は文字列ならなんでもよい、省略すると us-east-1 になるのでクライアントはそれを使うのでもよい
S3 の Virtual Host 形式には対応していない(?)
S3 API の path 形式 (/{bucketname}/{keyname}) に対応しているが、VirtualHost形式 (Host名にbucketが含まれれる形式、本家S3ではこちらが推奨)は対応していないぽい
- 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 に切り替えるのがよさそう。
拙作 tfstate-lookup で乗り換えた実例