🌏

Amazon CloudFront

2023/07/30に公開

Amazon CloudFront とは

エッジロケーションからキャッシュしたコンテンツを、グローバルに低いレイテンシーで配信できるAWSサービス

Webコンテンツの配信

  • ディストリビューションのオリジン:S3、Webサーバーのドメイン
  • ビヘイビア(Behavior)設定:複数のオリジンを設定して、パスパターンに応じてオリジンへのルーティングをコントロールできる
  • CloudFrontが提供するcloudfront.netサブドメインのDNSに対して、独自のドメインから名前解決
    • Route53 Aレコードエイリアス
    • 独自のDNSサービスでCNAMEレコード
  • エンドユーザーからのアクセス
    • 最寄りのPOP(Point Of Presence)エッジロケーションにルーティングされる
    • POPに対象のコンテンツがない場合
      1. ビヘイビアに設定されたパスパターンに応じてオリジンへリクエスト
      2. オリジンからPOPへファイルが転送されて保存される
      3. 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でカウントされる
    • 複数のルールと組み合わせる場合は、上限の引き上げ申請が必要

オンデマンドビデオの配信

  1. アプリケーションからS3バケットに動画ファイルをアップロード
  2. AWS Elemental MediaConvert によってHLSなどに変換
  3. 配信用のS3バケットに保存
  4. CloudFront ディストリビューションから再生アプリケーションやデバイスへ配信

ライブストリーミングビデオの配信

  1. AWS Elemental MediaLive で、リアルタイムにエンコードしたコンテンツをAWS Elemental MediaStore に保存
  2. CloudFrontを使用して配信

フィールドレベルの暗号化

  • フィールドレベルの暗号化が可能
  • 公開鍵と秘密鍵を使用して非対称暗号化で、指定したフィールドを暗号化する

署名付きURLと署名付きCookieを使用したプライベートコンテンツの配信

  1. 公開鍵・秘密鍵のキーペアをローカルで作成

  2. CloudFrontへアップロードしてキーグループに追加

    (推奨) IAMユーザーによるキーグループへの追加

  3. キーグループは、署名者としてディストリビューションへビヘイビア設定で選択

  4. CloudFrontビヘイビア設定

    • 特定のパスパターンにキーグループのパブリックキーを設定
    • 署名付きURL (または、Cookie)でないとアクセスできないように制御(署名はプライベートキーによって生成)

エッジ関数

CloudFrontディストリビューションへのHTTPリクエスト、レスポンスの処理をエッジ関数でカスタマイズできる

CloudFront Functions Lambda@Edge
機能 CloudFrontの機能 Lambdaの拡張機能
サポート JavaScript Node.js、Python
使用ケース Lambda@Edgeよりも軽量な実行時間の短い関数

- キャッシュキーの正規化によってキャッシュヒット率を向上
- ヘッダー操作
- リクエストのトークン検証
CloudFront Functionsではできない処理

- メモリサイズが必要
- オリジンへのリクエスト、レスポンス処理
- 他のAWSサービスとの統合や外部サービスの利用
制約 - ビューワーのリクエスト、レスポンス処理のみサポート
- 最大2MBのメモリしか使用可能

Discussion