AWSに戻る

Amazon CloudFront

Amazon CloudFrontとは

Amazon CloudFrontは、AWSが提供するグローバルなコンテンツ配信ネットワーク(CDN)サービスです。ウェブサイト、API、動画コンテンツ、その他のウェブアセットを世界中のユーザーに低レイテンシーで高速に配信することができます。CloudFrontは、世界中の複数のエッジロケーション(PoP: Points of Presence)を通じてコンテンツを配信し、ユーザーに最も近いエッジロケーションからコンテンツを提供することで、パフォーマンスを向上させます。

Amazon CloudFrontの主な特徴

Amazon CloudFrontの仕組み

CloudFrontの基本的な仕組みは以下の通りです:

  1. コンテンツのオリジン設定: S3バケット、EC2インスタンス、ELB、カスタムオリジンなど、コンテンツの元となるオリジンを設定します。
  2. CloudFrontディストリビューションの作成: オリジン、キャッシュ動作、セキュリティ設定などを含むディストリビューションを作成します。
  3. コンテンツの配信: ユーザーがCloudFrontのドメイン名(例:d1234.cloudfront.net)またはカスタムドメインを通じてコンテンツをリクエストします。
  4. エッジロケーションでの処理: リクエストは最も近いエッジロケーションにルーティングされます。
  5. キャッシュチェック: エッジロケーションはキャッシュをチェックし、コンテンツがキャッシュされている場合はそれを直接提供します。
  6. オリジンからのフェッチ: コンテンツがキャッシュされていない場合、エッジロケーションはオリジンからコンテンツを取得し、設定に基づいてキャッシュした後、ユーザーに提供します。

CloudFrontの処理フロー

ユーザー → DNS解決 → 最寄りのCloudFrontエッジロケーション → キャッシュチェック
                                                        ↓
                                        [キャッシュヒット] → コンテンツ配信 → ユーザー
                                        [キャッシュミス] → オリジンからフェッチ → キャッシュ → コンテンツ配信 → ユーザー
        

Amazon CloudFrontのオリジン

CloudFrontは、以下のようなさまざまなタイプのオリジンをサポートしています:

オリジンタイプ 説明 ユースケース
Amazon S3バケット 静的コンテンツを保存するAWSのオブジェクトストレージ 静的ウェブサイト、画像、動画、ドキュメントの配信
Amazon EC2インスタンス 動的コンテンツを生成するウェブサーバー 動的ウェブアプリケーション、APIの配信
Elastic Load Balancer 複数のEC2インスタンス間でトラフィックを分散 高可用性が必要な動的ウェブアプリケーション
AWS Lambda関数URL サーバーレス関数によって生成されるコンテンツ サーバーレスウェブアプリケーション、APIの配信
カスタムオリジン AWS外部のHTTP/HTTPSサーバー 既存のウェブサーバー、サードパーティのコンテンツ

Amazon CloudFrontのディストリビューション設定

CloudFrontディストリビューションを設定する際の主要なオプションは以下の通りです:

基本設定

キャッシュ動作

キャッシュ動作は、特定のパスパターンに対するCloudFrontの動作を定義します。1つのディストリビューションに複数のキャッシュ動作を設定できます。

Amazon CloudFrontの使用方法

CloudFrontは、AWS Management Console、AWS CLI、SDKs、またはインフラストラクチャ as コード(IaC)ツールを使用して利用できます。

ディストリビューションの作成

AWS CLIを使用したディストリビューションの作成

aws cloudfront create-distribution \
    --origin-domain-name my-bucket.s3.amazonaws.com \
    --default-root-object index.html

より詳細な設定を含むディストリビューションの作成

aws cloudfront create-distribution \
    --distribution-config file://dist-config.json

dist-config.jsonの例:

{
  "CallerReference": "my-distribution-2023-08-05",
  "Aliases": {
    "Quantity": 1,
    "Items": ["www.example.com"]
  },
  "DefaultRootObject": "index.html",
  "Origins": {
    "Quantity": 1,
    "Items": [
      {
        "Id": "my-s3-origin",
        "DomainName": "my-bucket.s3.amazonaws.com",
        "S3OriginConfig": {
          "OriginAccessIdentity": "origin-access-identity/cloudfront/E127EXAMPLE51Z"
        }
      }
    ]
  },
  "DefaultCacheBehavior": {
    "TargetOriginId": "my-s3-origin",
    "ViewerProtocolPolicy": "redirect-to-https",
    "AllowedMethods": {
      "Quantity": 2,
      "Items": ["GET", "HEAD"],
      "CachedMethods": {
        "Quantity": 2,
        "Items": ["GET", "HEAD"]
      }
    },
    "Compress": true,
    "DefaultTTL": 86400
  },
  "ViewerCertificate": {
    "CloudFrontDefaultCertificate": true
  },
  "Enabled": true
}

ディストリビューションの管理

ディストリビューションの一覧表示

aws cloudfront list-distributions

ディストリビューションの詳細取得

aws cloudfront get-distribution --id E1234EXAMPLE

ディストリビューションの更新

aws cloudfront update-distribution \
    --id E1234EXAMPLE \
    --distribution-config file://updated-config.json \
    --if-match ETAGVALUE

ディストリビューションの無効化

aws cloudfront get-distribution-config --id E1234EXAMPLE
# 取得した設定を編集してEnabledをfalseに設定
aws cloudfront update-distribution \
    --id E1234EXAMPLE \
    --distribution-config file://disabled-config.json \
    --if-match ETAGVALUE

ディストリビューションの削除

# ディストリビューションを無効化してから削除する必要があります
aws cloudfront delete-distribution \
    --id E1234EXAMPLE \
    --if-match ETAGVALUE

キャッシュの無効化

特定のファイルのキャッシュを無効化

aws cloudfront create-invalidation \
    --distribution-id E1234EXAMPLE \
    --paths "/images/logo.png" "/css/style.css"

すべてのファイルのキャッシュを無効化

aws cloudfront create-invalidation \
    --distribution-id E1234EXAMPLE \
    --paths "/*"

Amazon CloudFrontのセキュリティ

CloudFrontは、コンテンツ配信のセキュリティを確保するための多くの機能を提供しています:

HTTPS

CloudFrontは、ビューワーとCloudFront間、およびCloudFrontとオリジン間のHTTPS通信をサポートしています。ビューワーをHTTPからHTTPSにリダイレクトするように設定することもできます。

フィールドレベル暗号化

フィールドレベル暗号化を使用すると、クレジットカード番号などの機密データをエッジで暗号化し、オリジンサーバーでのみ復号化できるようにすることができます。

オリジンアクセスアイデンティティ(OAI)

OAIを使用すると、S3バケット内のコンテンツへの直接アクセスを防ぎ、CloudFrontを通じてのみアクセスできるようにすることができます。

OAIの作成と設定

# OAIの作成
aws cloudfront create-cloud-front-origin-access-identity \
    --cloud-front-origin-access-identity-config \
    CallerReference=my-oai-2023-08-05,Comment=OAI-for-my-bucket

# S3バケットポリシーの更新
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E127EXAMPLE51Z"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::my-bucket/*"
    }
  ]
}

地理的制限

特定の国からのアクセスを許可または拒否するように地理的制限を設定できます。

AWS WAF(ウェブアプリケーションファイアウォール)

CloudFrontディストリビューションをAWS WAFと統合して、SQLインジェクション、クロスサイトスクリプティング(XSS)などの一般的なウェブの脆弱性からアプリケーションを保護できます。

署名付きURL/Cookie

署名付きURLまたは署名付きCookieを使用して、プライベートコンテンツへのアクセスを制限できます。これは、有料コンテンツや会員限定コンテンツに適しています。

署名付きURLの生成(Python例)

import datetime
import rsa
import base64
import json
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding

def generate_signed_url(url, key_id, private_key_path, expiration_time):
    # 有効期限の設定
    expiry = int((datetime.datetime.now() + 
                 datetime.timedelta(seconds=expiration_time)).timestamp())
    
    # ポリシーの作成
    policy = {
        'Statement': [
            {
                'Resource': url,
                'Condition': {
                    'DateLessThan': {
                        'AWS:EpochTime': expiry
                    }
                }
            }
        ]
    }
    
    # ポリシーをJSON文字列に変換
    policy_json = json.dumps(policy).replace(' ', '')
    
    # プライベートキーの読み込み
    with open(private_key_path, 'rb') as key_file:
        private_key = serialization.load_pem_private_key(
            key_file.read(),
            password=None,
            backend=default_backend()
        )
    
    # ポリシーの署名
    signature = private_key.sign(
        policy_json.encode('utf-8'),
        padding.PKCS1v15(),
        hashes.SHA1()
    )
    
    # Base64エンコード
    signature_b64 = base64.b64encode(signature).decode('utf-8')
    policy_b64 = base64.b64encode(policy_json.encode('utf-8')).decode('utf-8')
    
    # 署名付きURLの生成
    signed_url = f"{url}?Policy={policy_b64}&Signature={signature_b64}&Key-Pair-Id={key_id}"
    
    return signed_url

Amazon CloudFrontのパフォーマンス最適化

CloudFrontのパフォーマンスを最適化するためのベストプラクティス:

Lambda@Edge

Lambda@Edgeは、CloudFrontのエッジロケーションでAWS Lambda関数を実行できるようにする機能です。これにより、ユーザーに近い場所でコードを実行し、レイテンシーを削減できます。

Lambda@Edgeのユースケース

Lambda@Edge関数の例(URLリダイレクト)

exports.handler = async (event) => {
    const request = event.Records[0].cf.request;
    const headers = request.headers;
    const uri = request.uri;
    
    // 古いURLパターンを新しいURLにリダイレクト
    if (uri.startsWith('/old-path/')) {
        const newUri = uri.replace('/old-path/', '/new-path/');
        
        return {
            status: '301',
            statusDescription: 'Moved Permanently',
            headers: {
                'location': [{
                    key: 'Location',
                    value: newUri
                }],
                'cache-control': [{
                    key: 'Cache-Control',
                    value: 'max-age=3600'
                }]
            }
        };
    }
    
    return request;
};

Amazon CloudFrontのモニタリングと可観測性

CloudFrontのパフォーマンスと使用状況を監視するためのツール:

Amazon CloudWatch

CloudWatchは、CloudFrontのメトリクス(リクエスト数、データ転送量、エラー率など)を収集し、アラームを設定して自動アクションをトリガーすることができます。

CloudWatchアラームの作成

aws cloudwatch put-metric-alarm \
    --alarm-name cloudfront-5xx-errors-high \
    --comparison-operator GreaterThanThreshold \
    --evaluation-periods 2 \
    --metric-name 5xxErrorRate \
    --namespace AWS/CloudFront \
    --period 300 \
    --statistic Average \
    --threshold 5 \
    --alarm-actions arn:aws:sns:us-west-2:123456789012:my-topic \
    --dimensions "Name=DistributionId,Value=E1234EXAMPLE" "Name=Region,Value=Global"

CloudFrontアクセスログ

CloudFrontアクセスログは、ディストリビューションに対するすべてのユーザーリクエストの詳細な記録を提供します。これらのログは、S3バケットに保存され、分析に使用できます。

アクセスログの有効化

aws cloudfront update-distribution \
    --id E1234EXAMPLE \
    --distribution-config file://logging-config.json \
    --if-match ETAGVALUE

logging-config.jsonの例(関連部分のみ):

{
  ...
  "Logging": {
    "Enabled": true,
    "IncludeCookies": false,
    "Bucket": "my-logs-bucket.s3.amazonaws.com",
    "Prefix": "cloudfront-logs/"
  },
  ...
}

CloudFrontリアルタイムログ

リアルタイムログは、ディストリビューションへのリクエストに関する情報をリアルタイムで提供します。これらのログは、Amazon Kinesis Data Streamsに配信されます。

AWS X-Ray

X-Rayを使用して、CloudFrontを通過するリクエストをトレースし、アプリケーションのパフォーマンスの問題を特定できます。

Amazon CloudFrontのユースケース

CloudFrontは以下のようなユースケースに適しています:

Amazon CloudFrontとの統合サービス

CloudFrontは他のAWSサービスと統合して、より強力なソリューションを構築できます:

サービス 統合の利点
Amazon S3 静的コンテンツのストレージと配信
Amazon EC2 動的コンテンツの生成と配信
Elastic Load Balancing 複数のEC2インスタンス間でのトラフィック分散
AWS Lambda サーバーレスコンテンツの生成と配信
AWS WAF ウェブアプリケーションの保護
Amazon Route 53 DNSルーティングとドメイン管理
AWS Certificate Manager SSL/TLS証明書の管理
AWS Shield DDoS保護
Amazon CloudWatch メトリクスのモニタリングとアラート
AWS Identity and Access Management (IAM) アクセス制御と権限管理

Amazon CloudFrontのベストプラクティス

まとめ

Amazon CloudFrontは、AWSが提供するグローバルなコンテンツ配信ネットワーク(CDN)サービスです。世界中のエッジロケーションを通じてコンテンツを配信し、ユーザーに最も近い場所からコンテンツを提供することで、低レイテンシーと高速なパフォーマンスを実現します。

CloudFrontの主な利点は以下の通りです:

CloudFrontを効果的に活用するには、適切なオリジンの選択、キャッシュ設定の最適化、セキュリティ機能の活用、モニタリングの設定が重要です。また、Lambda@Edgeを使用してエッジでのカスタム処理を実装することで、さらにパフォーマンスを向上させることができます。