# 2. 必要な CloudFront の設定
「S3 の Presigned リクエストを CloudFront 経由で利用する」といういうテーマの中で必要な CloudFront の設定。
要件によって対応要否は変わるので注意。
# PUT などのメソッドを許可する
CloudFront はデフォルトで PUT や DELETE などのメソッドを受け付けないように設定されているため、アップロードを想定しているユースケースではディストリビューションの Behavior の設定の Allowed HTTP Methods
で PUT を許可するように設定する必要がある。
# オリジンサーバは S3 バケットのリージョンをエンドポイントにする
us-east-1 リージョン以外のリージョンの S3 バケットを利用しているとき、CLI や一部の SDK が作成する Presigned URL はエンドポイントがリージョン名を含むエンドポイントになる場合がある。
例えば東京リージョンであれば以下のようなエンドポイントになる。
<バケット名>.s3.ap-northeast-1.amazonaws.com
その場合、デフォルトである us-east-1 以外のリージョンのバケットを利用する場合は、CloudFront のオリジンサーバをリージョンを含むエンドポイントにする必要がある。
生成される Presigned URL のエンドポイントがリージョンを含んでなければ対応不要。
WARNING
バケット名がドメインライクや POST の場合は作成される Presigned リクエストのエンドポイントがパスベースエンドポイントになる可能性がある。パスベースのエンドポイントの場合、パスにバケット名が含まれるためエンドポイントとしては以下のように S3 自体のエンドポイントとなる。
s3.<リージョン名>.amazonaws.com
また JavaScript の SDK では s3BucketEndpoint
オプションを true
することでパス形式のエンドポイントを回避できる。
TIP
リージョン名を含まないエンドポイントを利用したいときは SDK でカスタムエンドポイントの機能を利用すると回避できる。例えば JavaScript の SDK ではデフォルトでリージョン名がエンドポイントに含まれるが s3.amazonaws.com
をカスタムエンドポイントで指定することでデフォルトエンドポイントを利用できる。
# パスパターンを用途によって分ける
もし同じ CloudFront ディストリビューションで静的ページなどの配信も行う場合にはオリジンサーバや Behavior の設定を複数用意することになる。ディストリビューションに複数のオリジンサーバを設定するときは、パスパターンを分ける必要がある。
例えば /
で静的コンテンツを配信し、/presigned/
配下で Presigned リクエストによるアップロード/ダウンロードを行うと言ったように分ける。
このとき、/presigned/
というパスのプレフィックスは S3 へのリクエストにもそのまま転送されるため、S3 バケットの /presigned/
配下にオブジェクトが保存されることになる点が注意点となる。
前述のオリジンサーバのエンドポイントにも関連して、パスベースのエンドポイントを利用する場合は別途バケット名をパスパターンに設定する必要がある。
上記の例をまとめると以下のようになる。
パスパターン | 用途 | オリジンサーバ |
---|---|---|
/ | 静的コンテンツ配信 | コンテンツ配信用の S3 バケット(例) |
/presigned/* | Presigned リクエスト | Presigned リクエスト用の S3 バケットのエンドポイント |
/<バケット名>/* | Presigned リクエスト(パスベース) | S3 のエンドポイント |
# オリジンアクセスアイデンティティを無効にする
CloudFront からのアクセスを S3 で許可するための機能としてオリジンアクセスアイデンティティ(OAI)という機能が提供されている。しかし、この機能では CloudFront が独自に S3 へのリクエストに署名を含めることで実現されている機能なので、クライアントから送られる Presigned URL の署名と干渉してしまう。そのため Presigned URL を利用するときは OAI を無効にする必要がある。
# クエリ文字を転送するように設定する
Presigned URL を利用したリクエストではクエリ文字として署名がサーバに伝わるので CloudFront でクエリ文字をオリジンサーバ(S3)に転送するように設定する必要があります。ディストリビューションの Behavior の設定の Query String Forwarding and Caching
で Forward all, cache based on whitelist
あるいは Forward all, cache based on all
にする。