2014-05-19

静的ファイルの配信を Google Cloud Storage に移行しました

ブログの静的ファイルの配信を Amazon S3 + CloudFront の構成から、Google Cloud Storage へ移行してみました。Google Cloud Storage の方は単体で CDN 付なのでオブジェクトの ACL を一般公開設定にするだけで CDN 部分の設定が不要なのが便利です。

具体的には、Cloud Storage のコンソールで配信したいドメイン名でバケットを作成し、CNAME を c.storage.googleapis.com に向ければよいです。ドットを含む名前でバケットを作成する際は、それがドメインの所有権の確認が済んでいるドメイン以下である必要があるみたいです。
Bucket and Object Naming Guidelines - Google Cloud Storage

準備
Web UI はありますが細かい設定をしようとすると現時点では1ファイルずつしか設定できないので、速やかにCLIツールをインストールすることをお勧めします。

使用するコマンドは gsutil (Google Storage Util?) で、これのみインストールする方法もありますが gcloud コマンドからインストールすると自動更新対象になって良いと思います。gcloud コマンドのインストールは、Google Cloud SDK Quick Start で、インストール中にお勧めされるがままに進めると自動で gsutil も使用可能になると思います。

コマンド集

# バケット一覧
gsutil ls

# ヘルプ
gsutil help cp

# ファイルをアップロード
gsutil cp SRC DEST

# ディレクトリをアップロード
gsutil cp -r SRC_DIR DEST

# 今回アップロード時に使ったコマンド
gsutil -h "Cache-Control: public,max-age=31536000" cp -a public-read -z js,css,txt,html -r SRC_DIR gs://static.hidekiy.com/1/

setmeta が遅い
オブジェクトの新規作成 cp に比べてメタデータ (HTTP ヘッダー) の設定 setmeta は2倍~3倍ほど遅いように思ったので、配信を中断してよいのであればいったん削除してアップロードすると良いと思います。

遅い理由は、現在の ACL を読み取り、書き込みの2操作が余計に必要だからのようで、あらかじめバケットのデフォルト ACL を defacl で設定しておき、その設定のままで良いのであれば -n オプションを使って高速にメタデータを設定できるみたいです。

# gsutil help setmeta

-n          Causes the operations for reading and writing the ACL to be
             skipped. This halves the number of operations performed per
             request, improving the speed and reducing the cost of performing
             the operations. This option makes sense for cases where you want
             all objects to have the same ACL, for which you have set a default
             ACL on the bucket(s) containing the objects. See "help gsutil
             defacl".

gzip 済みで配信する方法
gsutil cp -z <ext,...> を使うと良いです。

デフォルト1時間になっている max-age を長くしたい
gsutil -h "Cache-Control: public,max-age=31536000" cp
で OK でした。cp の前に書くのがポイント。

全エッジサーバーからキャッシュを削除したい
オブジェクトを削除するとエッジサーバーにも伝搬するような挙動があるみたいです。これが公式仕様なのかは良く分かりません。

S3 との相違点
S3 では存在したアップロード先リージョンの指定がないので、その辺は Google が責任をもってデータを配置してくれるのだろうと思います。

追記 (2014/12/10)
データの保管されるリージョンはバケットの作成時に CLI で指定することが出来て、作成時に指定しなかった場合のデフォルトは US でした。+Shingo Ishimura さんご指摘ありがとうございます。
mb - Make buckets - Google Cloud Storage — Google Cloud Platform

また、S3 には存在したデータ喪失の可能性が上がるのを認めることでコストを下げるストレージタイプ (Reduced Redundancy Storage) の代わりに、耐久性ではなく可用性 (Availability) を下げるストレージタイプが Google Cloud Storage にはあるみたいです (Durable Reduced Availability Storage)。

QUIC 対応
とくに頼んでないですが Alternate-Protocol:80:quic になっているので可能な場合は QUIC で配信してくれるみたいです。


リンク
Concepts and Techniques - Google Cloud Storage — Google Cloud Platform
GoogleAppEngine - GCP エッジキャッシュ - Qiita