ローカル環境でGCSをエミュレートしよう
はじめに
自己紹介
はじめまして。sueken5です。
この記事ではGCPサービスの一つであるGCSをローカルでエミュレートしgolangからそれを利用する方法を紹介します。
fake-gcs-server
gcsのエミュレーターはgcp公式が提供しているものがないのでfake-gcs-serverを利用します。
dockerイメージが提供されているので次のコマンドで実際に動かすことができます。
docker run -d --name fake-gcs-server -p 4443:4443 fsouza/fake-gcs-server
ローカルで利用するにあたり重要なフラグを紹介します。
--scheme
はhttpsかhttpかを決めることできるフラグです。ローカルで使う分にはhttpでいいので--schema http
と指定します。
次に--public-host
です。このフラグはGCSのオブジェクトのPublicURLの働きをするものになっています。今回はlocalhost
で参照したいので--public-host localhost
と指定します。
次にバケットの設定です。
/data
にオブジェクトが保存されるようになっており、バケット名をディレクトリ名にし/data/bucket-name
となるようにボリュームをマウントします。これをしないと保存はできるのですが、参照処理ができません。注意してください。
実際に動かす
実際に動かしてみます。今回はgolangを利用します。実際のコードはこちらを参考にしてください。
実際に動かす前にSTORAGE_EMULATOR_HOST
という環境変数を設定します。
storage.NewClientは初期化時にSTORAGE_EMULATOR_HOST
という環境変数が存在していたらその値をホストに使うようにします。
func NewClient(ctx context.Context, opts ...option.ClientOption) (*Client, error) {
var host, readHost, scheme string
if host = os.Getenv("STORAGE_EMULATOR_HOST"); host == "" {
scheme = "https"
readHost = "storage.googleapis.com"
// Prepend default options to avoid overriding options passed by the user.
opts = append([]option.ClientOption{option.WithScopes(ScopeFullControl), option.WithUserAgent(userAgent)}, opts...)
実際に動かして見るとhttp://localhost:4443/bucket-name/onjnameでアクセスできることが確認できます。
まとめ
gcsのローカルエミュレートを紹介しました。簡単に利用できるのでテストやローカル環境の構築に使っていきたいです。
GCP/Golang系の情報を発信していますのでぜひsueken5をフォローお願いします!
Discussion