GCSのCORS設定を初期化する
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.