🌏
Amazon CloudFront
Amazon CloudFront とは
エッジロケーションからキャッシュしたコンテンツを、グローバルに低いレイテンシーで配信できるAWSサービス
Webコンテンツの配信
- ディストリビューションのオリジン:S3、Webサーバーのドメイン
- ビヘイビア(Behavior)設定:複数のオリジンを設定して、パスパターンに応じてオリジンへのルーティングをコントロールできる
- CloudFrontが提供する
cloudfront.net
サブドメインのDNSに対して、独自のドメインから名前解決- Route53
A
レコードエイリアス - 独自のDNSサービスで
CNAME
レコード
- Route53
- エンドユーザーからのアクセス
- 最寄りのPOP(Point Of Presence)エッジロケーションにルーティングされる
- POPに対象のコンテンツがない場合
- ビヘイビアに設定されたパスパターンに応じてオリジンへリクエスト
- オリジンからPOPへファイルが転送されて保存される
- POPからユーザーにファイルが返される
オリジンへのアクセス制限
OAC (Origin Access Control)
- オリジン:S3バケット
- OACを作成して、オリジン設定に関連付ける。S3のバケットポリシーでCloudFrontサービスからの
GetObject
のみを許可する
例)CloudFront OAC への読み取り専用アクセスを許可する S3 バケットポリシー
{
"Version": "2012-10-17",
"Statement": {
"Sid": "AllowCloudFrontServicePrincipalReadOnly",
"Effect": "Allow",
"Principal": {
"Service": "cloudfront.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::<S3 bucket name>/*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudfront::<AWS アカウント ID>:distribution/<CloudFront distribution ID>"
}
}
}
}
- OACのSSE-KMS
- OACで保護されているS3 バケットオリジン内のオブジェクトがSSE-KMSで暗号化されている場合は、KMSキーポリシーにステートメントを追加してCloudFrontサービスからの複合リクエストを許可して対応する
例)CloudFront OAC による SSE-KMS の KMS キーへのアクセスを許可する KMS キーポリシーステートメント
{
"Sid": "AllowCloudFrontServicePrincipalSSE-KMS",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<AWS アカウント ID>:root",
"Service": "cloudfront.amazonaws.com"
},
"Action": [
"kms:Decrypt",
"kms:Encrypt",
"kms:GenerateDataKey*"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudfront::<AWS アカウント ID>:distribution/<CloudFront distribution ID>"
}
}
}
カスタムヘッダー
- オリジン:Application Load Balancerなど
- ディストリビューションのオリジン設定に任意のキーと値でカスタムヘッダーを追加
- 指定したHTTPヘッダーがリクエストに含まれる場合:正常なターゲットへルーティング
- 指定したHTTPヘッダーが含まれない場合:403(Access Denied)エラーを返す
IPアドレス制限
Application Load Balancerのセキュリティグループで保護する方法
セキュリティグループのソースにマネージドプレフィックスリストを指定すれば、CloudFront以外からのネットワークトラフィックを拒否する
- セキュリティグループのルール数制限 (デフォルト):60
- CloudFrontのマネージドプレフィックスリストを利用すると55でカウントされる
- 複数のルールと組み合わせる場合は、上限の引き上げ申請が必要
オンデマンドビデオの配信
- アプリケーションからS3バケットに動画ファイルをアップロード
- AWS Elemental MediaConvert によってHLSなどに変換
- 配信用のS3バケットに保存
- CloudFront ディストリビューションから再生アプリケーションやデバイスへ配信
ライブストリーミングビデオの配信
- AWS Elemental MediaLive で、リアルタイムにエンコードしたコンテンツをAWS Elemental MediaStore に保存
- CloudFrontを使用して配信
フィールドレベルの暗号化
- フィールドレベルの暗号化が可能
- 公開鍵と秘密鍵を使用して非対称暗号化で、指定したフィールドを暗号化する
署名付きURLと署名付きCookieを使用したプライベートコンテンツの配信
-
公開鍵・秘密鍵のキーペアをローカルで作成
-
CloudFrontへアップロードしてキーグループに追加
(推奨) IAMユーザーによるキーグループへの追加
-
キーグループは、署名者としてディストリビューションへビヘイビア設定で選択
-
CloudFrontビヘイビア設定
- 特定のパスパターンにキーグループのパブリックキーを設定
- 署名付きURL (または、Cookie)でないとアクセスできないように制御(署名はプライベートキーによって生成)
エッジ関数
CloudFrontディストリビューションへのHTTPリクエスト、レスポンスの処理をエッジ関数でカスタマイズできる
CloudFront Functions | Lambda@Edge | |
---|---|---|
機能 | CloudFrontの機能 | Lambdaの拡張機能 |
サポート | JavaScript | Node.js、Python |
使用ケース | Lambda@Edgeよりも軽量な実行時間の短い関数 - キャッシュキーの正規化によってキャッシュヒット率を向上 - ヘッダー操作 - リクエストのトークン検証 |
CloudFront Functionsではできない処理 - メモリサイズが必要 - オリジンへのリクエスト、レスポンス処理 - 他のAWSサービスとの統合や外部サービスの利用 |
制約 | - ビューワーのリクエスト、レスポンス処理のみサポート - 最大2MBのメモリしか使用可能 |
Discussion