y-ohgi's blog

TODO: ここになにかかく

GCS をローカルのdocker-composeでエミュレートする

TL;DR

  • fsouza/fake-gcs-server を使用し、ローカルでGCS をエミュレートする
  • docker-compose 上で他のサービスと協調して動作させる
  • golang で実装されているため動作が速い

概要

クラウド選定時にGCP を使用する際、GCS が必要なサービスでした。
そのため、ローカル環境でもGCS をエミュレートしたいモチベーションが有ったためエミュレーターを探し、 fsouza/fake-gcs-server に行き着きました。

一瞬、ローカルからクラウド上のDB とGCS でも良いかなと思ったものの、さすがに手軽ではないことと小規模な少人数でのサービスのため間違えて本番に繋がってしまうケースを考えてローカルで完結させることにしました。
恐らく1人での開発であればIAM のポリシーを書き換えるなどして全てクラウド上で完結させたかなと思います。

version

手順

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

動作確認し、 itemsimages バケットが作成されていることを確認

$ 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 がエミュレーターの対応をしてくれているのは意外かつありがたいですね。