Amazon S3

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

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

S3 のデータバケットを Fastly で利用できるようにするには、以下の手順に従います。

新しいサービスの作成

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

  1. 新しいドメインとホストを作成する場合、以下を行います。
    • Create a domain ページの Domain Name フィールドに、URL として使用するホスト名を入力します (例 : cdn.example.com)。
    • Origins ページの Hosts フィールドに、ホストの適切なアドレスを <BUCKET>.<REGION>.amazonaws.com 形式で入力します。Amazon S3 のリージョンとエンドポイントに関するドキュメントの S3 のセクションにある表を参考にしてください。例えば、お客様のバケット名が fastlytestbucket で、リージョンが s3 の場合、お客様のホスト名は fastlytestbucket.s3.amazonaws.com となります。
  2. Edit this host ページでホストの詳細を編集する場合。
    • まだ入力していない場合は、Name フィールドに分かりやすいサービスの名前を入力します。
    • Address フィールドに、お客様のリージョンの適切なアドレスが入力されていることを確認してください (例 : fastlytestbucket.s3.amazonaws.com)。この情報はホスト作成時に入力されたものです。
  3. ホストのトランスポート・レイヤー・セキュリティ (TLS) に関する情報を編集する場合 。
    • SNI hostname フィールドで、Match the SNI hostname to the Certificate hostname のチェックボックスを選択します。ホスト作成時に入力したアドレスが表示されます。
    • Certificate hostname のフィールドに、fastlytestbucket.s3.amazonaws.com を入力します。
  4. Advanced optionsOverride host フィールドに、ホストの適切なアドレスを入力します (例 : fastlytestbucket.s3.amazonaws.com)。この情報はホスト作成時に入力されたものです。Amazon S3 のプライベートバケットを使用している場合、このフィールドを空白にします。

DNS マッピングの検証

デフォルトでは、yourdomain.global.prod.fastly.net という DNS マッピングが作成されます。上記の例では、cdn.example.com.global.prod.fastly.net となります。この URL をブラウザで入力し、動作を確認します。

DNS のエイリアスを作成する

指定したドメイン名の DNS エイリアスを作成します (例 : global-nossl.fastly.net に対する cdn.example.com の CNAME)。

結果を検証する

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

1
2
3
4
5
6
7
8
9
$ curl -I opscode-full-stack.s3.amazonaws.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
Server: AmazonS3

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

キャッシュのコントロール強化

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

Amazon S3 のプライベートバケットを使用する

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

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

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

まず、通常の VCL スニペットを作成します。AWS protected origin のように、意味のある名前をつけてください。スニペットを作成する際に、within subroutine を選択して配置を指定し、サブルーチンタイプとして miss を選択します。次に、VCL フィールドに以下のコードを入力します (特定の値は、お客様自身の AWS バケットに関連するものに変更するようにしてください)。

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
declare local var.awsAccessKey STRING;
declare local var.awsSecretKey STRING;
declare local var.awsS3Bucket STRING;
declare local var.awsRegion 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;

set var.awsAccessKey = "YOUR_AWS_ACCESS_KEY";   # Change this value to your own data
set var.awsSecretKey = "YOUR_AWS_SECRET_KEY";   # Change this value to your own data
set var.awsS3Bucket = "YOUR_AWS_BUCKET_NAME";   # Change this value to your own data
set var.awsRegion = "YOUR_AWS_BUCKET_REGION";   # Change this value to your own data

if (req.method == "GET" && !req.backend.is_shield) {

  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.awsS3Bucket ".s3." var.awsRegion ".amazonaws.com";
  set bereq.url = querystring.remove(bereq.url);
  set bereq.url = regsuball(urlencode(urldecode(bereq.url.path)), {"%2F"}, "/");
  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.awsRegion "/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.awsSecretKey,
    var.dateStamp,
    var.awsRegion,
    "s3",
    var.stringToSign
  );

  set bereq.http.Authorization = "AWS4-HMAC-SHA256 "
    "Credential=" var.awsAccessKey "/" 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;
}

また、AWS がレスポンスに追加するヘッダーを削除することもできます。そのためには、別の VCL スニペットを作成します。Strip AWS response headers のように、意味のある名前をつけてください。スニペットを作成する際、within subroutine を選択して配置を指定し、サブルーチンタイプとして fetch を選択します。そして、VCL フィールドに以下のコードを入力します。

1
2
3
4
unset beresp.http.x-amz-id-2;
unset beresp.http.x-amz-request-id;
unset beresp.http.x-amz-delete-marker;
unset beresp.http.x-amz-version-id;

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

VCL スニペットを使用すると、Fastly は S3 オブジェクトへのリダイレクトに従い、レスポンスをキャッシュすることができます。

S3 オブジェクトへのリダイレクトに従うよう Fastly を設定するには、以下の手順に従います。

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

    Redirect to S3 redirect via a receive VCL Snippet

  6. Name フィールドに適切な名前を入力します (例 : S3 redirect - recv)。
  7. Type (placement of the snippet) のセクションで、within subroutine を選択します。
  8. Select subroutine メニューから、recv (vcl_recv) を選択します。
  9. VCL フィールドに、以下の条件を追加します。

    1
    2
    3
    4
    5
    6
    
    if (req.http.redir != "true") {
      set req.backend = Main_Origin;
    } else {
      set req.backend = s3_backend;
      set req.http.host = "s3.amazonaws.com";
    }
    
  10. Create をクリックしてスニペットを作成します。
  11. Create snippet ボタンを再度クリックします。Create a VCL snippet ページが表示されます。

    Redirect to S3 redirect via a receive VCL Snippet

  12. Name フィールドに適切な名前を入力します (例 : S3 redirect - deliver)。
  13. Type (placement of the snippet) のセクションで、within subroutine を選択します。
  14. Select subroutine メニューから、deliver (vcl_deliver) を選択します。
  15. VCL フィールドに、以下の条件を追加します。

    1
    2
    3
    4
    5
    6
    
    if (resp.status == 302 || resp.status == 301) {
      set req.http.redir = "true";
      set req.url = regsub(resp.http.Location, "http://s3.amazonaws.com/(.*)$", "/\1");
      set req.http.Fastly-Force-Shield = "yes";
      restart;
    }
    
  16. Create をクリックしてスニペットを作成します。
  17. Activate ボタンをクリックして設定変更をデプロイします。

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

This article describes an integration with a service provided by a third party. See our note on integrations for details.
Back to Top