GCSのCORS設定を初期化する

Taiga Murakami
google-cloud-jp
Published in
4 min readAug 13, 2018

--

TL;DR CORS設定を初期化する時はデータ無しのJSONファイル([]のみ)を用意してgsutil cors setしよう

背景

Google Cloud Storage(GCS)でファイルをHTTP経由で公開し、異なるドメインからそのファイルを利用する時、Cross-Origin Resource Sharing(CORS)の設定が必要になります。CORS設定はgsutilコマンドで行うことが出来るが、set/getのみ対応しているため、どうすればdelete相当の事ができるかを調査してみました。

Cross-Origin Resource Sharing(CORS)とは

CORSとは複数のオリジンに対してリクエストを投げるための仕様です。詳しい仕様についてはこちらをご覧ください。例えば、App Engine上(example.appspot.com)にホストされているスクリプト(JSなど)がGCS上(example.storage.googleapis.com)のリソースが必要になった場合、クライアントのブラウザからすると2つのオリジン(App Engine, GCS)にリクエストを送信するという形になるためデフォルトの状態ではこの処理は成功しません。CORSはこの問題を解決するための仕様になります。以前はこの仕様が無く、複数のオリジンに対してリクエストが投げられましたが、セキュリティリスク(クロスサイトスクリプティング(XSS)などによるクラッキング)が発見されたため、こちらの仕様が制定されました。

GCSでCORSを設定する

GCSではCORSをバケット単位で設定します。設定はコマンドラインユーティリティ(gsutil)、XML API、JSON APIで行うことが出来ます。今回はgsutilを使う方法を紹介します。

まずJSON形式でCORSの定義を記述したファイルを作成します。より詳細な設定値に関してはこちらをご参照ください。またexample.appspot.comや<bucket name>に関しては適宜使用中の環境に応じて読み替えてください。

[
{
"origin": ["http://example.appspot.com"],
"responseHeader": ["Content-Type", "Access-Control-Allow-Origin"],
"method": ["GET", "POST", "PUT", "DELETE"],
"maxAgeSeconds": 3600
}
]

つぎに、定義内容を反映します。反映にはgsutil corsコマンドを用います。こちらのコマンドの詳細についてはこちらをご参照ください。

$ gsutil cors set xxx.json gs://<bucket name> #設定Setting CORS on gs://<bucket name>/...$ gsutil cors get gs://<bucket name> #確認[{"maxAgeSeconds": 3600, "method": ["GET", "POST", "PUT", "DELETE"], "origin": ["http://api.akari.app"], "responseHeader": ["Content-Type"]}]

GCSのCORS設定を初期化する

誤ったバケットにCORS設定をしてしまった時など、CORS設定を初期化(削除)したい場合のやり方をご紹介します。gsutilを利用する場合、corsの設定にたいしてはset/getのみ利用可能でありdeleteというオプションがありません。そういう場合は以下内容のjsonファイルを用意して、定義内容の反映を行ってください。そうすることにより、設定内容の初期化されます。

[]

設定反映および確認

$ gsutil cors set xxx.json gs://<bucket name> #設定Setting CORS on gs://<bucket name>/...$ gsutil cors get gs://<bucket name> #確認gs://<bucket name>/ has no CORS configuration.

--

--

Taiga Murakami
google-cloud-jp

Google Cloud Customer Engineer. All views and opinions are my own(すべての見解や意見は私見です).