Google Cloud Storage

Google Cloud Storage (GCS) アカウントを作成・設定し、Fastly サービスにリンクさせると、Fastly サービスのオリジンサーバーとして使用することができます。また、プライベートコンテンツを使用するように設定することもできます。これにより、Google と Fastly の POP 間の専用リンクによりコンテンツ配信が高速化され、オリジンの作業負荷と応答時間が軽減されます。

オリジンサーバーとしての GCS の使用

GCS データを Fastly で利用可能にするには、以下のステップに従ってください。

GCS アカウントの登録と設定

  1. Google Cloud Storageに登録します。
  2. オリジンのデータを保存するためのバケットを作成します。Create a bucket ウィンドウが表示されます。

    Google Cloud Storage New Bucket ウィンドウ

  3. 以下のように Create a bucket フィールドに記入します。
    • Name フィールドに、バケットの名前を入力します (mybucket など)。ドメイン名を持つバケット (images.example.com など) を作成することもできますが、Google の Search Console を使用してドメインの所有権を確認する必要があります。Google のウェブサイトに掲載されている説明をご覧ください。入力した名前は忘れないようにしてください。入力した名前は、GCS バケットを Fastly サービスに接続するために必要となります。
    • Default storage class のエリアで、Regional を選択します。
    • Regional location メニューから、コンテンツを保存する場所を選択します。ほとんどの場合、オリジンシールドに指定する相互接続する場所に近い地域が選択されます。
  4. Create ボタンをクリックします。

次に、バケツにオブジェクトを追加し、各オブジェクトの横にある Public link チェックボックスを選択して、外部からアクセスできるようにします。

オリジンサーバーとしての GCS バケットの追加

GCS バケットをオリジンサーバーとして追加するには、オリジンに接続する手順に従ってください。オリジンサーバーについての具体的な情報を追加します。

  1. Origins ページの Host フィールドに、ホストの適切なアドレスを <BUCKET>.storage.googleapis.com の形式に沿って入力します。例えば、バケット名が test123 の場合、ホスト名は test123.storage.googleapis.com です。

初回は、Edit this host フィールドに以下のように入力します。

  • Name フィールドには、サービスの内容が分かるような名前を入力します (Google Cloud Storage など)。
  • Address フィールドには、<BUCKET>.storage.googleapis.comの形式でホストの適切なアドレスを入力してください。例えば、バケット名が mybucket の場合、ホスト名は mybucket.storage.googleapis.com です。
    1. ホストのトランスポート・レイヤー・セキュリティ (TLS) エリア情報を編集する場合:
    • Enable TLS? はデフォルト設定の Yes のままにし、Fastly とオリジン間の接続を保護します。
    • Certificate hostname のフィールドに、storage.googleapis.comを入力します。
    • SNI hostname のフィールドでは、Match the SNI hostname to the Certificate hostname のチェックボックスを選択します。ホスト作成時に入力したホスト名のアドレスが表示されます。
      1. TLS エリアの下にある Shielding メニューから、オリジンシールドの場所のリストから相互接続を選択します。
      2. Advanced options エリアの Override host フィールドに、ホストに適切なアドレスを入力します (test123.storage.googleapis.com など)。この情報はホスト作成時に入力したものです。

相互接続する場所

相互接続する場所では、オリジンシールドの場所を選択すると、Google のネットワークエッジとの直接リンクを確立することができます。以下のいずれかの場所を選択することで、トラフィックは Google との相互接続により伝送され、Google の CDN パートナー価格の割引) を受けることができます。ほとんどの場合、GCS バケットの地域に最も近い相互接続が選択されます。

北米では以下の場所に相互接続があります。

  • アッシュバーン (BWI)
  • アッシュバーン (DCA)
  • アトランタ (FTY)
  • シカゴ (MDW)
  • シカゴ (PWK)
  • ダラス (DFW)
  • ロサンゼルス (LAX)
  • ロサンゼルス (BUR)
  • ニューヨーク (LGA)
  • パロアルト (PAO)
  • サンノゼ (SJC)
  • シアトル (SEA)
  • トロント (YYZ)

北米以外の相互接続は、以下の通りです。

  • アムステルダム (AMS)
  • フランクフルト (FRA)
  • フランクフルト (HHN)
  • 香港 (HKG)
  • ロンドン (LCY)
  • ロンドン (LHR)
  • マドリード (MAD)
  • パリ (CDG)
  • シンガポール (QPG)
  • ストックホルム (BMA)
  • 東京 (TYO)
  • 東京 (HND)
  • シドニー (SYD)

‏‎‎‎‎‏‏‏‏‏‏オリジンシールドの注意点を確認し、それに沿って相互接続を選択してください。

GCS バケットの Cache-Control ヘッダーの設定

デフォルトでは、GCS は公開されている読み取り可能なオブジェクトに対して独自のキャッシングを行うように設定されていますが、これはキャッシュのパージ作業を複雑化する可能性があります。問題を回避するために、以下のように gsutilコマンドラインユーティリティを使用し、GCS バケット内の1つまたは複数のオブジェクトに Cache-Control ヘッダーを設定することをお勧めします。

1
gsutil setmeta -h "Cache-Control: no-store, max-age=86400" gs://<bucket>/*.html

上記の をご自分の GCS バケットの名前に置き換えてください。 no-storeは GCS にコンテンツをキャッシュしないように指示し、max-age=86400 は Fastly に1日だけコンテンツをキャッシュするように指示しています。詳細は、Google のsetmetaコマンドに関するドキュメントをご参照ください。

GCS バケットのデフォルト TTL の変更

GCS バケットのデフォルト TTL を変更したい場合は、以下の点に注意してください。

  • お客様の GCS アカウントは、GCS コンテンツのデフォルト TTL を制御します。GCS では現在、デフォルトの TTL を3600秒に設定しています。デフォルトの TTL を変更しても、GCS アカウントのデフォルト設定は上書きされません。
  • Fastly コントロールパネルから GCS によって設定されたデフォルトの TTL を上書きするには、新しいキャッシュ設定を作成し、そこに TTL を入力します。
  • GCS にてデフォルトの TTL を上書きするには、gsutil ツールをダウンロードし、Cache-Control ヘッダーを変更し、デフォルトのTTLを削除するか、適切な設定に変更します。

X-Http-Method-Override ヘッダーの動作

GCS は、HTTP メッセージで送信されるリクエストメソッドをオーバーライドするため、クライアントが X-Http-Method-Overrideリクエストヘッダーを追加できるユニークな機能を提供しています。例えば、X-Http-Method-Override: HEADリクエストヘッダー付きの GET リクエストは、GCS では HEAD リクエストとして扱われ、 HEAD レスポンス (200 ステータスコード、空のボディ) が返されます。

これは、意図しないキャッシュ動作を引き起こす可能性があり、セキュリティ上のリスクとなります。例えば X-Http-Method-Overrideリクエストヘッダーを受信した場合、予想外のレスポンスがキャッシュされる恐れがあります。このリスクを最小限に抑えるために、以下のように X-Http-Method-Override ヘッダーの設定を vcl_recv サブルーティン内で解除することを強くお勧めします。

unset req.http.X-Http-Method-Override;

プライベートオブジェクトでの GCS の使用

GCS のプライベートオブジェクトで Fastly を使用するには、正しい GCS バケットをオリジンとして指定することで、GCS データがすでに Fastly で利用可能になっていることを確認してから、以下の手順に従ってください。

相互運用性のあるアクセスの設定

デフォルト設定では、GCS は OAuth2 を使用してリクエストを認証しますが、Fastly ではこれはサポートされていません。GCS 上のプライベートオブジェクトにアクセスするためには、プロジェクトでHMAC 認証を有効にし、相互運用可能なストレージアクセスキー (Access key と Secret のペア) を作成する必要があります。以下の手順で行ってください。

  1. Google Cloud Platform のコンソールを開き、適切なプロジェクトを選択します。
  2. Settings をクリックします。Project Access コントロールがハイライトされた状態で Settings ページが表示されます。
  3. Interoperability タブをクリックします。Interoperability API access コントロールが表示されます。
  4. 初めて相互運用性を設定する場合は、Enable interoperability access をクリックします。
  5. Make <PROJECT-ID> your default project をクリックし、プロジェクトを相互運用性のあるアクセスのデフォルトプロジェクトにします。そのプロジェクトがすでにデフォルトのプロジェクトとして機能している場合は、その情報が代わりに表示されます。

    interoperability タブ

  6. Create a new key をクリックします。 アクセスキーとシークレットコードが表示されます。

    Google クラウドストレージのアクセスキー

  7. 表示されたアクセスキーとシークレットコードを保存します。これらは、後に認証ヘッダーを作成する際に必要となります。

GCS プライベートコンテンツを使用するための Fastly の設定

GCS プライベートコンテンツを Fastly で使用するには、Date ヘッダー (必須の認証シグネチャ) と Authorization ヘッダーの2 つのヘッダーを作成します。

Date ヘッダーの作成

  1. Fastly コントロールパネルにログインします。
  2. All services ページから、該当するサービスを選択します。検索ボックスを使用して ID、名前、またはドメインで検索することができます。
  3. Edit configuration ボタンをクリックし、アクティブなバージョンをクローンするオプションを選択します。ドメインページが表示されます。
  4. Content をクリックします。Content ページが表示されます。
  5. Create header ボタンをクリックします。Create a new header 画面が表示されます。

    New header ページによる Date ヘッダーの作成

  6. Create a new header フィールドには、以下のように記入します。

    • Name フィールドに Date と入力します。
    • Type メニューから Request を選択し、Action メニューから Set を選択します。
    • Destination フィールドに http.Date と入力します。
    • Source フィールドに now と入力します。
    • Ignore if set メニューから No‎‎‎‎ を選択します。
    • Priority フィールドに 10 と入力します。
  7. Create ボタンをクリックします。Content ページに新しい Date ヘッダーが表示されます。これは後で Authorization ヘッダーのシグネチャで使用します。

Authorization ヘッダーの作成

  1. Create header ボタンを再度クリックし、新しいヘッダーを作成します。Create a header ページが表示されます。

    Header ページによる Authorization ヘッダーの作成

  2. 以下のように Create a header ウィンドウの各フィールドに入力します。
    • Name フィールドに Authorization と入力します。
    • Type メニューから Request を選択し、Action メニューから Set を選択します。
    • Destination フィールドに http.Authorization と入力します。
    • Ignore if set メニューから No‎‎‎‎ を選択します。
    • Priority フィールドに 20 と入力します。
  3. Source フィールドには、以下の形式でヘッダー認証情報を入力します。

    1
    
    "AWS <access key>:" digest.hmac_sha1_base64("<GCS secret>", if(req.method == "HEAD", "GET", req.method) LF LF LF req.http.Date LF "/<GCS bucket name>" req.url.path)
    

    上記の <access key><GCS secret><GCS bucket name> は、先ほど集めた情報に置き換えます。例:

    1
    
    "AWS GOOGQORE5WOJJHLXH6OD:" digest.hmac_sha1_base64("oQb0hdmaxFOc5UmC6F833Cde0+ghRSgsr7CCnX62", if(req.method == "HEAD", "GET", req.method) LF LF LF req.http.Date LF "/test123" req.url.path)
    
  4. Create ボタンをクリックします。Content ページに新しい Date ヘッダーが表示されます。
  5. Activate ボタンをクリックして設定変更をデプロイします。

Source フィールドの詳細

Authorization ヘッダーの Source フィールドを詳しく見てみましょう。基本的な形式は以下の通りです。

AWS<access key><signature function><key><message>

フィールドには以下の情報が含まれています。

要素 説明
AWS アクセスキーの前に配置された定数です。この値は常に AWS です。
access key GCS 開発者向けアカウントのアクセスキー ID です。この例では GOOGQORE5WOJJHLXH6OD を使っています。
signature function シグネチャのキーとメッセージを検証するためのアルゴリズムです。この例では digest.hmac_sha1_base64(<key>, <message>) を使っています。
key GCS 開発者向けアカウントのシークレットキー ID です。この例では oQb0hdmaxFOc5UmC6F833Cde0+ghRSgsr7CCnX62 を使っています。
message StringToSign の UTF-8 エンコーディングです。メッセージの各部分の内訳は以下の表をご覧ください。

Authorization ヘッダーの Source フィールドに含まれるメッセージは、次のような基本的な形式です。

<HTTP-verb><\n><Content-MD5>\n<Content-Type><\n><Date><\n><CanonicalExtensionHeaders><\n><CanonicalizedResource>

フィールドには以下の情報が含まれています。

要素 説明
HTTP-verb REST の動詞です。この例では req.method を使用しています。
\n 改行表示の定数です。常に \n です。
Content-MD5 メッセージの整合性チェックとして使用される content-md5 ヘッダー値。空欄になっていることが多いです。この例では、LF (ラインフィード) を使用しています。
Content-Type MIME-type を指定するための Content-type ヘッダーの値です。空欄になっていることが多いです。この例では LF を使用しています。
Date 日付と時間のタイムスタンプです。req.http.Date を使用しています (上記の手順で最初に別のヘッダーとして作成しました)。
CanonicalExtensionHeaders GCS の実装をカスタマイズするための x-amz- または x-goog- ヘッダーです。空欄になっていることが多いです。この例では LF を使用しています。
CanonicalizedResource お客様の GCS リソースのパス名です。この例では、GCS バケット名の "/test123" とオブジェクトパスの req.url.path を連結しています。
This article describes an integration with a service provided by a third party. See our note on integrations for details.
Back to Top