DigitalOcean Spaces

DigitalOcean Spaces のパブリックおよびプライベートバケットをオリジンとして使用できます。

DigitalOcean Spaces をオリジンとして使用する

Fastly で DigitalOcean Spaces を使用するには、以下の手順に従ってください。

新規サービスを作成する

新規サービスを作成する手順に従ってください。

  1. 新しいドメインとホストを作成する場合、以下を行います:
    • Create a domain ページの Domain Name フィールドに、URL として使用するホスト名を入力します (例 : cdn.example.com)。
    • Origins ページの Host フィールドに、ホストの適切なアドレスを <SPACE>.<REGION>.digitaloceanspaces.com の形式に沿って入力します。例えば、お客様のスペース名が test123で、リージョンが nyc3 の場合、お客様のホスト名は test123.nyc3.digitaloceanspaces.com となります。
  2. Edit this host ページで ホストの詳細を編集する場合、以下を行ってください。
    • まだ入力されていない場合は、Name フィールドに分かりやすい任意のサービスの名前を入力します。
    • Address フィールドにホストの適切なアドレスが入力されていることを確認します (例: test123.nyc3.digitaloceanspaces.com)。この情報はホスト作成時に入力されたものです。
  3. トランスポートレイヤーセキュリティ (TLS) のセクションでホストの情報を編集する場合、以下を行ってください。
    • Enable TLS? をデフォルト設定の Yes のままにし、Fastly とオリジン間の接続を保護します。
    • Certificate hostname フィールドに、Address フィールドに表示されるアドレスを入力します (例: test123.nyc3.digitaloceanspaces.com)。
    • SNI hostname フィールドで、Match the SNI hostname to the Certificate hostname のチェックボックスを選択します。ホスト作成時に入力したアドレスが表示されます。
  4. Advanced options の Override host フィールドに、ホストの適切なアドレスを入力します (例: test123.nyc3.digitaloceanspaces.com)。この情報はホスト作成時に入力されたものです。

結果をテストする

デフォルトでは、yourdomain.global.prod.fastly.net という DNS マッピングが作成されます。上記の例では、cdn.example.com.global.prod.fastly.net となります。指定したドメイン名の DNS エイリアスを作成します (例: cdn.example.com に対する global-nossl.fastly.net の CNAME)。

Fastly は、明示的な Cache-Control ヘッダーのないコンテンツを1時間にわたってキャッシュします。キャッシュヘッダーを送信しているかどうかは、curl コマンドを使用して確認することができます。例:

1
2
3
4
5
6
7
8
$ curl -I opscode-full-stack.nyc3.digitaloceanspaces.com

HTTP/1.1 200 OK
x-amz-id-2: ZpzRp7IWc6MJ8NtDEFGH12QBdk2CM1+RzVOngQbhMp2f2ZyalkFsZd4qPaLMkSlh
x-amz-request-id: ABV5032583242618
Date: Fri, 18 Mar 2012 17:15:38 GMT
Content-Type: application/xml
Transfer-Encoding: chunked

この例では、Cache-Control ヘッダーが設定されていないため、デフォルトの TTL が適用されます。

より詳細なキャッシュ制御

Javascript ファイルや画像など、異なるタイプのアセットがキャッシュされる方法をより詳細にコントロールする必要がある場合はキャッシュの鮮度のドキュメントをご覧ください。

プライベート DigitalOcean Spaces の使用

Fastly でプライベート DigitalOcean Space を使うためには、以下の手順に従ってください。

設定前の注意点

正しい Space が指定され、オリジンがポート443に設定され、Spaces のデータが Fastly で利用可能であることを確認してください。これは、認証前に行う必要があります。

設定にはアクセスキー、シークレットキー、Space 名が必要になります。DigitalOcean Spaces 認証ヘッダーは、以下の形式を利用します。

1
  Authorization: AWS `AWSAccessKeyId`:`Signature`

DigitalOcean のウェブサイトから、以下の情報が必要です。

  1. アクセスキーシークレットキー
  2. お客様の Space

プライベート DigitalOcean Space 使用のための Fastly の設定

Fastly でプライベート DigitalOcean Space を使用するために、Date ヘッダー (認証署名で使用するため) と Authorization ヘッダーの、2つのヘッダーを作成します

Date ヘッダーの作成

  1. Fastly コントロールパネルにログインします。
  2. Home ページから、適切なサービスを選択します。検索ボックスで ID、名称、ドメインでの検索が行えます。
  3. Edit configuration ボタンをクリックし、アクティブなバージョンをクローンするオプションを選択します。ドメインページが表示されます。
  4. Content をクリックします。Content ページが表示されます。
  5. Create header ボタンをクリックします。Create a header ページが表示されます。

    ヘッダーページによる日付ヘッダーの作成

  6. 以下の要領では、Create a header ページの各フィールドに入力します。
    • Name フィールドに Date と入力します。
    • Type メニューから Request を選択し、Action メニューから Set を選択します。
    • Destination フィールドに http.Date と入力します。
    • Source フィールドに now と入力します。
    • Ignore if set メニューから No を選択します。
    • Priority フィールドに 10 を入力します。
  7. Create ボタンをクリックします。コンテンツページに新しい Date ヘッダーが表示されます。これは後で Authorization ヘッダーの署名で使用します。

Authorization ヘッダーの作成

次に、以下の仕様で認証ヘッダーを作成します。

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

    ヘッダーページで Authorization ヘッダーを作成する

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

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

    <DigitalOcean access key><DigitalOcean secret key ID>、および <Space name> は、先ほど収集した情報に置き換えます。例:

    1
    
     "AWS JKCAUEFV2ONFFOFMSSLA:" digest.hmac_sha1_base64("P2WPSu68Bfl89j72vT+bXYZB7SjlOwhT4whqt27", if(req.method == "HEAD", "GET", req.method) LF LF LF req.http.Date LF "/test123" req.url.path)
    
  4. Create ボタンをクリックします。新しい Authorization ヘッダーが Content ページに表示されます。

Source フィールドのパラメーターの詳細

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

AWS<Access Key><Signature Function><key><message>

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

要素 説明
AWS アクセスキーの前に配置された定数です。この値は常に AWS です。
access key DigitalOcean アカウントからのアクセスキー。この例では JKCAUEFV2ONFFOFMSSLA を使用しています。
signature function 署名のキーとメッセージを検証するためのアルゴリズム。この例では digest.hmac_sha1_base64(<key>, <message>) を使用しています。
key DigitalOcean アカウント からのシークレットキー。この例では P2WPSu68BfI89j72vT+bXYZB7SjIOwhT4whqt27 を使用しています。
message StringToSign の UTF-8 エンコーディングです。メッセージの各部分の内訳は以下の表をご覧ください。

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

<HTTP-verb></n><Content-MD5>/n<Content-Type></n><Date></n><CanonicalizedAmzHeader></n><CanonicalizedResource>

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

要素 説明
HTTP-verb REST 動詞。この例では req.method を使用しています。HEAD を GET に書き換えるのは、オリジンにリクエストを送る前に Varnish が内部的に行っているからです。
/n 改行表示の定数。この値は常に /n です。
Content-MD5 メッセージの整合性チェックとして使用される content-md5 ヘッダー値。空欄であることが多いです。この例では、LF (ラインフィード) を使用しています。
Content-Type MIME-type を指定するための Content-type ヘッダーの値。空欄であることが多いです。この例では LF を使用しています。
Date 日付と時間のタイムスタンプ。上記の手順で最初に別のヘッダーとして作成した req.http.Date を使用しています。
CanonicalizedAmzHeader Spaces の実装をカスタマイズする x-amz ヘッダー。空欄であることが多いです。この例では LF を使用しています。
CanonicalizedResource DigitalOcean Space 名。この例では "/test123" を使用しています。

S3 Spaces オブジェクトへのリダイレクトと S3 Spaces レスポンスのキャッシング

カスタム VCL を使用することで、Fastly は Spaces オブジェクトへのリダイレクトに従い Spaces レスポンスと301または302 レスポンスを別々にキャッシュすることができます。

Fastly VCL とカスタム VCL の組み合わせに関する手順を必ずお読みください。Fastly のデフォルト設定を上書きしない場合は、VCL ボイラープレート全体を含めることが重要です。

Fastly を Spaces オブジェクトへのリダイレクトに従うように設定するには、カスタム VCL に以下の VCL を挿入します。

内部vcl_recv

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sub vcl_recv {

  if (req.http.redir != "true") {
    set req.backend = Main_Origin;
  } else {
    set req.backend = spaces_backend;
    set req.http.host = "nyc3.digitaloceanspaces.com";
  }

#FASTLY recv

  if (req.method != "HEAD" && req.method != "GET" && req.method != "FASTLYPURGE") {
    return(pass);
  }

  return(lookup);

}

内部vcl_deliver

1
2
3
4
5
6
7
8
9
10
11
12
13
sub vcl_deliver {

  if (resp.status == 302 || resp.status == 301) {
    set req.http.redir = "true";
    set req.url = regsub(resp.http.Location, "http://nyc3.digitaloceanspaces.com/(.*)$", "/\1");
    set req.http.Fastly-Force-Shield = "yes";
    restart;
  }

#FASTLY deliver

  return(deliver);
}

Main_Originspaces_backend は、リダイレクトを適用するサービスのバックエンドの名を必ず設定してください。正確な名前は、VCL にて確認できます。サービス表示中に、ページ上部の VCL ボタンをクリックします。

カスタム VCL にこれらの VCL スニペットを追加したら、VCL ファイルをアップロードし、新しいサービスージョンをアクティブにして変更を適用します。

この記事では、サードパーティが提供するサービスとの統合について説明します。詳細については、統合に関する注意事項をご参照ください。
Back to Top