Amazon S3

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

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

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

新しいサービスの作成

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

  1. 新しいドメインとホストを作成する場合、以下を行ってください。

    • Create a domain ページの Domain Name フィールドに、URL として使用するホスト名を入力します (例: cdn.example.com)。
    • Origins ページの Host フィールドに、ホストの適切なアドレスを <BUCKET>.s3.<REGION>.amazonaws.com の形式に沿って入力します。ガイドとして、AWS 一般参照ドキュメントの Amazon S3 エンドポイントにあるテーブルを使用してください。例えば、お客様のバケット名が fastlytestbucket で、リージョンが us-east-2 の場合、お客様のホスト名は fastlytestbucket.s3.us-east-2.amazonaws.com となります。
    ヒント

    ほとんどのお客様は、オリジンシールドに指定する相互接続場所に近いリージョンを選択します。

  2. Edit this host ページでホストの詳細を編集する場合、以下を行ってください。

    • まだ入力されていない場合は、Name フィールドに分かりやすい任意のサービスの名前を入力します。
    • Address フィールドに、お客様の地域の適切なアドレスが入力されていることを確認してください (例: fastlytestbucket.s3.us-east-2.amazonaws.com)。この情報はホスト作成時に入力されたものです。
  3. トランスポートレイヤーセキュリティ (TLS) のセクションでホストの情報を編集する場合、以下を行ってください。

    • Enable TLS? をデフォルト設定である Yes のままにし、Fastly とオリジン間の接続を保護します。

      ヒント

      Amazon S3 を使用して静的 Web サイトをホストしている場合、Enable TLS? はデフォルト設定ではなく、No に設定する必要があります。Amazon は、静的 Web サイトのホスト機能が有効になった S3 バケットへの TLS 接続をサポートしていません。Fastly の TLS サービスオプションを通じて、Fastly とクライアント間の接続を保護することができます。

    • SNI hostname フィールドで、Match the SNI hostname to the Certificate hostname のチェックボックスを選択します。ホスト作成時に入力したアドレスが表示されます。

    • Certificate hostname のフィールドに、fastlytestbucket.s3.us-east-2.amazonaws.com を入力します。

  4. Advanced options の Override host フィールドに、ホストの適切なアドレスを入力します (例: fastlytestbucket.s3.us-east-2.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 に対する CNAME cdn.example.com)。

結果を検証する

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

$ 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 ヘッダーが設定されていないため、デフォルトの Time to Live (TTL) が適用されます。

より詳細なキャッシュコントロール

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

Amazon S3 のプライベートバケットの使用方法

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

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

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

重要

サービスの設定で、オリジンの Override host フィールドを空白にすることを検討してください。この設定を行うと、ここで示したスニペットのホストヘッダーが上書きされ、送信される情報を認証する署名が無効になる可能性があります。

まず、レギュラー 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
70
71
declare local var.awsAccessKey STRING;
declare local var.awsSecretKey STRING;
declare local var.awsS3Bucket STRING;
declare local var.awsRegion STRING;
declare local var.awsS3Host 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
set var.awsS3Host = var.awsS3Bucket ".s3." var.awsRegion ".amazonaws.com";
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.awsS3Host;
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. Home ページから、適切なサービスを選択します。検索ボックスで ID、名称、ドメインによる検索が行えます。
  3. Edit configuration をクリックし、アクティブなバージョンをクローンするオプションを選択します。
  4. VCL Snippets をクリックします。

  5. Create Snippet をクリックします。

    VCL スニペットを受け取ることで、S3 リダイレクトにリダイレクトする

  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";
    }
    重要

    上記の条件では、これらのリダイレクトを適用するサービスのバックエンドの実際の名前に Main_Origin および s3_backend プレースホルダを置き換えていることを確認してください。正確な名前を確認するには、Deliver ページに移動し、サービスを表示しているときに、サービス名のすぐ下に表示される Show VCL をクリックします。

  10. Create をクリックしてスニペットを作成します。

  11. Create Snippet を再度クリックします。

    VCL スニペットを配信することで、S3 リダイレクトをリダイレクトする

  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 をクリックして設定への変更をデプロイします。
注意

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


翻訳についての注意事項
このガイドは役に立ちましたか?

このフォームを使用して機密性の高い情報を送信しないでください。サポートが必要な場合は、サポートチームまでご連絡ください。このフォームは reCAPTCHA によって保護されており、Google のプライバシーポリシー利用規約が適用されます。