🍏

ローカル環境でGCSをエミュレートしよう

2020/10/03に公開

はじめに

自己紹介

はじめまして。sueken5です。

この記事ではGCPサービスの一つであるGCSをローカルでエミュレートしgolangからそれを利用する方法を紹介します。

fake-gcs-server

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