Wasabi Hot Cloud Storage

Fastly では Wasabi Hot Cloud Storage のパブリックバケットとプライベートバケットをオリジンとして使用することができます。

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

Wasabi Hot Cloud Storage バケットを Fastly で利用できるようにするには、以下の手順に従ってください。

新規サービスを作成する

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

  1. 新しいドメインとホストを作成する場合、以下を行ってください。
    • Create a domain ページの Domain Name フィールドに、URL として使用するホスト名を入力します (例: cdn.example.com)。
    • Origins ページの Hosts フィールドに、ご利用の Wasabi Hot Cloud Storage バケットのリージョンに適したアドレスを入力します。us-east-1 リージョンの場合は、<BUCKET>.s3.wasabisys.com と入力します。その他のリージョンの場合は <BUCKET>.s3.<REGION>.wasabisys.comと入力し、<REGION> を適切なものに置き換えます (例: <BUCKET>.s3.eu-central-1.wasabisys.com)。
  2. Edit this host ページで ホストの詳細を編集する場合、以下を行ってください。
    • まだ入力されていない場合は、Name フィールドに分かりやすい任意のサービスの名前を入力します。
    • Address フィールドにホストの適切なアドレスが入力されていることを確認します (例: <BUCKET>.s3.wasabisys.com)。この情報はホスト作成時に入力したものです。
  3. Transport Layer Security (TLS) のセクションでホストの情報を編集する場合、以下を行ってください。
    • Enable TLS? はデフォルト設定の Yes のままにし、Fastly とオリジン間の接続を保護します。
    • Certificate hostname フィールドに、Address フィールドに表示されるアドレスを入力します (例: <BUCKET>.s3.wasabisys.com)。
    • SNI hostname フィールドで、Match the SNI hostname to the Certificate hostname のチェックボックスを選択します。ホスト作成時に入力したアドレスが表示されます。
  4. Advanced optionsOverride host フィールドに、ホストの適切なアドレスを入力します (例: <BUCKET>.s3.wasabisys.com)。この情報はホスト作成時に入力したものです。
  5. TLS エリアの下にある Shielding メニューから、適切なオリジンシールドの場所を選択します。この設定や選択する場所に関する詳細については、オリジンシールドを有効にするのセクションをご参照ください。

オリジンシールドを有効にする

お客様のオリジンサーバーに対してオリジンシールドを有効にすることを強くお勧めします。Wasabi は無料転送にソフトキャップを課しています。オリジンシールドを有効にしないと、Fastly は単一の POP ではなく、すべての Fastly エッジ POP に同じオブジェクトのリクエストを送信するため、Wasabi の無料転送ガイドラインに従わない可能性があります。

Shielding メニューからオリジンシールドの場所を選択する際、以下のように Wasabi Hot Cloud Storage バケットに適した場所を選択します。

Wasabi バケットのリージョン シールドの場所
eu-central-1 オランダ、アムステルダム
us-east-1 バージニア州、アッシュバーン
us-west-1 ワシントン州、シアトル

結果をテストする

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

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

1
2
3
4
5
6
7
8
$ curl -I opscode-full-stack.s3.wasabisys.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 ファイルや画像など、異なるタイプのアセットがキャッシュされる方法をより詳細にコントロールする必要がある場合は、キャッシュの鮮度に関するドキュメントをご覧ください。

Wasabi Hot Cloud Storage のプライベートバケットを使用する

Wasabi Hot Cloud Storage のプライベートバケットを Fastly で使用するには、Amazon のヘッダーベース認証のバージョン4を実装する必要があります。これは、カスタム VCLを使用して以下の手順で行うことができます。

ご利用の前に

Wasabi Hot Cloud Storage バケットを Fastly で利用できるようにする必要があります。オリジンがポート443に設定されていることを確認してください。以下の手順でヘッダベース認証を行う前にこの設定を行う必要があります。

Wasabi の情報を収集する

まず、Wasabi から以下の情報を取得します。

項目 説明
バケット名 お客様の Wasabi Hot Cloud Storage バケット の固有の名前です。バケットから項目をダウンロードする際に、各オブジェクトの URL パスやホスト名に記載される文字列です (例: widget-project)。
リージョン バケットが存在する場所の Wasabi リージョンコード (例: us-east-1)。
アクセスキー ID バケットに対して少なくとも読み取り権限を持つ IAM アカウントの Wasabi アクセスキー ID の文字列。
シークレットアクセスキー 上記のアクセスキーとペアになっている Wasabi のシークレットアクセスキー。

ユーザーアクセスの分離に関するドキュメントを確認し、 例えば ListBucket の操作を許可するなど、誤って意図しないファイルへのアクセスを可能にすることがないようにします。あるいは、ドキュメントの下部にある VCL スニペットを使用して バケットの一覧表示をブロックすることもできます。

これらの情報が得られれば、VCL で適切なヘッダー値を計算することで、ヘッダー認証を使用して Wasabi バケットに対して認証を行うよう Fastly サービスを設定することができます。

認証用 VCL スニペットの作成

レギュラー VCL スニペットを作成します。

  • Name フィールドに Wasabi protected origin と入力します。
  • Type (placement of the snippet) フィールドで、within subroutine を選択してから miss (vcl_miss) を選択します。
  • VCL フィールドに以下のコードを入力します (特定の値は、お客様ご自身の Wasabi バケットに関連するものに変更してください)。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    
     if ( req.request == "GET" && req.backend.is_origin) {
    
       declare local var.wasabiAccessKey STRING;
       declare local var.wasabiSecretKey STRING;
       declare local var.wasabiBucket STRING;
       declare local var.wasabiRegion STRING;
       declare local var.canonicalHeaders STRING;
       declare local var.signedHeaders STRING;
       declare local var.canonicalRequest STRING;
       declare local var.canonicalQuery STRING;
       declare local var.stringToSign STRING;
       declare local var.dateStamp STRING;
       declare local var.signature STRING;
       declare local var.scope STRING;
    
       # Supply your own credentials
       set var.wasabiAccessKey = "YOUR_BUCKET_ACCESS_KEY";   # Change this value to your own data
       set var.wasabiSecretKey = "YOUR_BUCKET_SECRET";       # Change this value to your own data
       set var.wasabiBucket = "YOUR_BUCKET_NAME";            # Change this value to your own data
       set var.wasabiRegion = "YOUR_BUCKET_REGION";          # Change this value to your own data
    
       set bereq.http.x-amz-content-sha256 = digest.hash_sha256("");
       set bereq.http.x-amz-date = strftime({"%Y%m%dT%H%M%SZ"}, now);
       set bereq.http.host = var.wasabiBucket ".s3." var.wasabiRegion ".wasabisys.com";
       set bereq.url = querystring.remove(bereq.url);
       set var.dateStamp = strftime({"%Y%m%d"}, now);
       set var.canonicalHeaders = ""
         "host:" bereq.http.host LF
         "x-amz-content-sha256:" bereq.http.x-amz-content-sha256 LF
         "x-amz-date:" bereq.http.x-amz-date LF
       ;
       set var.canonicalQuery = "";
       set var.signedHeaders = "host;x-amz-content-sha256;x-amz-date";
       set var.canonicalRequest = ""
         "GET" LF
         bereq.url.path LF
         var.canonicalQuery LF
         var.canonicalHeaders LF
         var.signedHeaders LF
         digest.hash_sha256("")
       ;
    
       set var.scope = var.dateStamp "/" var.wasabiRegion "/s3/aws4_request";
    
       set var.stringToSign = ""
         "AWS4-HMAC-SHA256" LF
         bereq.http.x-amz-date LF
         var.scope LF
         regsub(digest.hash_sha256(var.canonicalRequest),"^0x", "")
       ;
    
       set var.signature = digest.awsv4_hmac(
         var.wasabiSecretKey,
         var.dateStamp,
         var.wasabiRegion,
         "s3",
         var.stringToSign
       );
    
       set bereq.http.Authorization = "AWS4-HMAC-SHA256 "
         "Credential=" var.wasabiAccessKey "/" var.scope ", "
       "SignedHeaders=" var.signedHeaders ", "
         "Signature=" + regsub(var.signature,"^0x", "")
       ;
       unset bereq.http.Accept;
       unset bereq.http.Accept-Language;
       unset bereq.http.User-Agent;
       unset bereq.http.Fastly-Client-IP;
      }
    

追加されたレスポンスヘッダーを削除する VCL スニペットの作成

Wasabi がレスポンスに追加するヘッダーを削除することもできます。そのために別の VCL スニペットを作成します。

  • Name フィールドに Strip Wasabi response headers と入力します。
  • Type (placement of the snippet) フィールドで、within subroutine を選択してから deliver (vcl_deliver) を選択します。
  • VCL フィールドに以下のコードを配置します。
1
2
3
4
5
if ( !req.http.Fastly-Debug ) {
  unset resp.http.x-amz-id-2;
  unset resp.http.x-amz-request-id;
  unset resp.http.server;
}

ディレクトリの一覧表示をブロックする

IAM 権限を正しく設定しないと、ユーザーがバケットフォルダの内容を一覧表示できる可能があります。Fastly で それを許可しないようにしたい場合は、以下のスニペットを作成します。

  • Name フィールドに Disallow bucket listing と入力します。
  • Type (placement of the snippet) フィールドで、within subroutine を選択してから recv (vcl_recv) を選択します。
  • VCL フィールドに以下のコードを配置します。
1
2
3
if ( req.url.path ~ "/$" ) {
  error 403;
}
This article describes an integration with a service provided by a third party. See our note on integrations for details.
Back to Top