Amazon S3
最終更新日 2022-12-05
Fastly では、Amazon S3 のパブリックおよびプライベートバケットをオリジンとして使用することができます。
Amazon S3 をオリジンとして使用する
S3 のデータバケットを Fastly で利用できるようにするには、以下の手順に従います。
新規サービスを作成する
新規サービスを作成する手順に従ってください。
新しいドメインとホストを作成する場合、以下を行います:
- 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
となります。
- Create a domain ページの Domain Name フィールドに、URL として使用するホスト名を入力します (例 :
Edit this host ページで ホストの詳細を編集する場合、以下を行ってください。
- まだ入力されていない場合は、Name フィールドに分かりやすい任意のサービスの名前を入力します。
- Address フィールドに、お客様の地域の適切なアドレスが入力されていることを確認してください (例 :
fastlytestbucket.s3.us-east-2.amazonaws.com
)。この情報はホスト作成時に入力されたものです。
トランスポートレイヤーセキュリティ (TLS) のセクションでホストの情報を編集する場合、以下を行ってください。
- Enable TLS? を離れる デフォルトを Yes に設定し、Fastly とオリジン間の接続を保護します。
ヒント
静的 Web サイトをホストするのに Amazon S3 を使用している場合は、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
を入力します。
- Enable TLS? を離れる デフォルトを Yes に設定し、Fastly とオリジン間の接続を保護します。
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 エイリアスを作成します (例: に対する cdn.example.com
のglobal-nossl.fastly.net
CNAME)。
結果を検証する
Fastly は、明示的な Cache-Control
ヘッダーのないコンテンツを1時間にわたってキャッシュします。キャッシュヘッダーを送信しているかどうかは、curl コマンドを使用して確認することができます。例:
1$ curl -I opscode-full-stack.s3.amazonaws.com2
3HTTP/1.1 200 OK4x-amz-id-2: ZpzRp7IWc6MJ8NtDEFGH12QBdk2CM1+RzVOngQbhMp2f2ZyalkFsZd4qPaLMkSlh5x-amz-request-id: ABV50325832426186Date: Fri, 18 Mar 2012 17:15:38 GMT7Content-Type: application/xml8Transfer-Encoding: chunked9Server: 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 バケットに関連するものに変更するようにしてください)。
1declare local var.awsAccessKey STRING;2declare local var.awsSecretKey STRING;3declare local var.awsS3Bucket STRING;4declare local var.awsRegion STRING;5declare local var.canonicalHeaders STRING;6declare local var.signedHeaders STRING;7declare local var.canonicalRequest STRING;8declare local var.canonicalQuery STRING;9declare local var.stringToSign STRING;10declare local var.dateStamp STRING;11declare local var.signature STRING;12declare local var.scope STRING;13
14set var.awsAccessKey = "YOUR_AWS_ACCESS_KEY"; # Change this value to your own data15set var.awsSecretKey = "YOUR_AWS_SECRET_KEY"; # Change this value to your own data16set var.awsS3Bucket = "YOUR_AWS_BUCKET_NAME"; # Change this value to your own data17set var.awsRegion = "YOUR_AWS_BUCKET_REGION"; # Change this value to your own data18
19if (req.method == "GET" && !req.backend.is_shield) {20
21 set bereq.http.x-amz-content-sha256 = digest.hash_sha256("");22 set bereq.http.x-amz-date = strftime({"%Y%m%dT%H%M%SZ"}, now);23 set bereq.http.host = var.awsS3Bucket ".s3." var.awsRegion ".amazonaws.com";24 set bereq.url = querystring.remove(bereq.url);25 set bereq.url = regsuball(urlencode(urldecode(bereq.url.path)), {"%2F"}, "/");26 set var.dateStamp = strftime({"%Y%m%d"}, now);27 set var.canonicalHeaders = ""28 "host:" bereq.http.host LF29 "x-amz-content-sha256:" bereq.http.x-amz-content-sha256 LF30 "x-amz-date:" bereq.http.x-amz-date LF31 ;32 set var.canonicalQuery = "";33 set var.signedHeaders = "host;x-amz-content-sha256;x-amz-date";34 set var.canonicalRequest = ""35 "GET" LF36 bereq.url.path LF37 var.canonicalQuery LF38 var.canonicalHeaders LF39 var.signedHeaders LF40 digest.hash_sha256("")41 ;42
43 set var.scope = var.dateStamp "/" var.awsRegion "/s3/aws4_request";44
45 set var.stringToSign = ""46 "AWS4-HMAC-SHA256" LF47 bereq.http.x-amz-date LF48 var.scope LF49 regsub(digest.hash_sha256(var.canonicalRequest),"^0x", "")50 ;51
52 set var.signature = digest.awsv4_hmac(53 var.awsSecretKey,54 var.dateStamp,55 var.awsRegion,56 "s3",57 var.stringToSign58 );59
60 set bereq.http.Authorization = "AWS4-HMAC-SHA256 "61 "Credential=" var.awsAccessKey "/" var.scope ", "62 "SignedHeaders=" var.signedHeaders ", "63 "Signature=" + regsub(var.signature,"^0x", "")64 ;65 unset bereq.http.Accept;66 unset bereq.http.Accept-Language;67 unset bereq.http.User-Agent;68 unset bereq.http.Fastly-Client-IP;69}
また、AWS がレスポンスに追加するヘッダーを削除することもできます。そのためには、別の VCL スニペットを作成します。Strip AWS response headers
のような意味のある名前を付けます。スニペットを作成する際、within subroutine を選択して配置を指定し、サブルーチンタイプとして fetch を選択します。そして、VCL フィールドに以下のコードを入力します:
1unset beresp.http.x-amz-id-2;2unset beresp.http.x-amz-request-id;3unset beresp.http.x-amz-delete-marker;4unset beresp.http.x-amz-version-id;
S3 オブジェクトへのリダイレクトと S3 レスポンスのキャッシング
VCL スニペットを使用して、Fastly は、S3 オブジェクトへのリダイレクトをフォローし、レスポンスをキャッシュすることができます。
S3 オブジェクトへのリダイレクトをフォローするように Fastly を設定するには、以下の手順に従います:
- Fastly コントロールパネルにログインします。
- Home ページから、適切なサービスを選択します。検索ボックスで ID、名称、ドメインでの検索が行えます。
- Edit configuration ボタンをクリックし、アクティブなバージョンをクローンするオプションを選択します。ドメインページが表示されます。
- VCL Snippets リンクをクリックします。VCL スニペットのページが表示されます。
- Create Snippet ボタンをクリックします。Create a VCL スニペットページが表示されます。
Name フィールドに、適切な名前 (例:
S3 redirect - recv
) を入力します。Type (placement of the snippet) のセクションで、within subroutine を選択します。
Select subroutine メニューから、recv (
vcl_recv
) を選択します。VCL フィールドに、以下の条件を追加します:
1```vcl2if (req.http.redir != "true") {3 set req.backend = Main_Origin;4} else {5 set req.backend = s3_backend;6 set req.http.host = "s3.amazonaws.com";7}8```重要
上記の条件では、
Main_Origin
とs3_backend
プレースホルダをこれらのリダイレクトを適用するサービスのバックエンドの実際の名前に必ず置き換えてください。Deliver (配信) ページに移動し、そのサービスを表示している間にサービス名のすぐ下に表示される VCL を表示 リンクをクリックすることで、正確な名前を見つけることができます。Create をクリックしてスニペットを作成します。
Create snippet ボタンを再度クリックします。Create a VCL スニペットページが表示されます。
Name フィールドに、適切な名前 (例:
S3 redirect - deliver
) を入力します。Type (placement of the snippet) のセクションで、within subroutine を選択します。
Select subroutine メニューから、deliver (
vcl_deliver
) を選択します。VCL フィールドに、以下の条件を追加します:
1if (resp.status == 302 || resp.status == 301) {2 set req.http.redir = "true";3 set req.url = regsub(resp.http.Location, "http://s3.amazonaws.com/(.*)$", "/\1");4 set req.http.Fastly-Force-Shield = "yes";5 restart;6}Create をクリックしてスニペットを作成します。
- Activate ボタンをクリックして設定変更をデプロイします。
この記事では、サードパーティが提供するサービスとの統合について説明します。詳細については、統合に関する注意事項をご参照ください。