TL;DR
- fsouza/fake-gcs-server を使用し、ローカルでGCS をエミュレートする
- docker-compose 上で他のサービスと協調して動作させる
- golang で実装されているため動作が速い
概要
クラウド選定時にGCP を使用する際、GCS が必要なサービスでした。
そのため、ローカル環境でもGCS をエミュレートしたいモチベーションが有ったためエミュレーターを探し、 fsouza/fake-gcs-server
に行き着きました。
一瞬、ローカルからクラウド上のDB とGCS でも良いかなと思ったものの、さすがに手軽ではないことと小規模な少人数でのサービスのため間違えて本番に繋がってしまうケースを考えてローカルで完結させることにしました。
恐らく1人での開発であればIAM のポリシーを書き換えるなどして全てクラウド上で完結させたかなと思います。
version
- fsouza/fake-gcs-server
- v1.44.0
- docker-compose
- v2.10.2
手順
docker-compose を書く
シンプルなため、早速 docker-compose.yaml
を書く。
version: '3.8' services: gcs: image: fsouza/fake-gcs-server ports: - 4443:4443 volumes: - ${PWD}/tmp/gcs-data:/data command: -scheme http
curl で動作確認。
バケットを作成していないので空が帰ってくる。
$ curl http://0.0.0.0:4443/storage/v1/b {"kind":"storage#buckets","items":[]}
パラメータの説明
https からhttp へ変更
fake-gcs-server はhttps を使用しますが、Not Secure になってしまうので引数でhttp に変更します。
-scheme http
データの永続化
コンテナ上の /data
に格納されるため、ローカルのディレクトリへ共有し保存
volumes: - ${PWD}/tmp/gcs-data:/data
バケットを作成
例えば images
バケットを作成したい場合、以下のように /data/images
のようにコンテナ上にディレクトリを作ることで可能になります。
volumes: - ${PWD}/tmp/gcs-data:/data/images
動作確認し、 items
に images
バケットが作成されていることを確認
$ curl http://0.0.0.0:4443/storage/v1/b | jq { "kind": "storage#buckets", "items": [ { "kind": "storage#bucket", "id": "images", "name": "images", "versioning": {}, "location": "US-CENTRAL1" } ] }
package の向き先をエミュレーターに向ける
公式package がありがたいことにエミュレーターへの対応をしてくれています。
やることは簡単で、 STORAGE_EMULATOR_HOST
を環境変数へ設定していると、その環境変数を参照してくれます。
Cloud Storage (GCS) - Package cloud.google.com/go/storage (v1.29.0) | Go client library | Google Cloud
まとめ
fsouza/fake-gcs-server
は必要十分な機能を持っており、非常にありがたいエミュレーターだなと思った次第です。
gsutil コマンドでエミュレーターへ向き先を変更する方法を見つけることができず、curl で動作確認とう言う形になってしまったのが心残りです。ただ、公式package がエミュレーターの対応をしてくれているのは意外かつありがたいですね。