Firebase StorageでCORSの設定をする必要があったのでそのメモ。AWSのS3のCORS設定は何度もやったことがあるけどFirebase Storageは初めて。
CORSが何かってのは割愛。
まず、gsutilってのをインストールする。どうやらこれ経由じゃないと設定できない模様。
gsutilってのは
ということでFirebase Storage (ここではCloud Storageになってるが) にコマンドでアクセスするためのツールだそうだ。
このページから自分の環境にあわせてダウンロードする。M1 Mac用も用意されていた。
なお、gsutilの実行にはPython3が必要だそうだが最近のMacなら問題なさそう。
なお、このファイルはインストーラってわけではなくて単にtar.gzでアーカイブされたファイルなので、任意の場所に展開する必要がある。自分の場合はホームディレクトリ直下に解凍した。
そして、展開したディレクトリに移動してinstall.sh
を実行。パスを通してくれるらしい。
$ cd ~/google-cloud-sdk $ ./install.sh
その後は任意の場所にcors.json
というファイルを以下のような内容で作成する。originはこの例のようにワイルドカードでもいいけど、ちゃんとやるならFirebase StorageにアクセスするWebアプリケーションをホストしているサイトのURLを入れる。忘れちゃいけないのが開発中のローカルサーバからのアクセス。もちろん複数を設定可能でカンマ区切りで記述していく。
[ { "origin": ["*"], "method": ["GET"], "maxAgeSeconds": 3600 } ]
GETとかはどのHTTPメソッドを通すかっていうCORSのよくあるやつ。
ファイルが用意できたら先ほどのgsutilを使って実行する。
$ gsutil cors set cors.json gs://<バケットURL>
バケットのURLはFirebaseのコンソール上に書かれているのでそれを参考にする。
さて、実行と思ったら認証エラー。
ServiceException: 401 Anonymous caller does not have storage.buckets.update access to the Google Cloud Storage bucket.
そりゃそうか。ということでgsutilを使う場合にどうやって認証すればいいのか。ちょっと調べたらサービスアカウントで認証するらしい。
とりあえずFirebaseのコンソール上でサービスアカウントを作って、そのキーファイルをダウンロードして以下を実行する。
gcloud auth activate-service-account --key-file KEY_FILE
これが終わったらあとはCORS設定を反映するだけ。というわけでもう一度さっきのコマンドを実行する。
$ gsutil cors set cors.json gs://<バケットURL>
以上