Amazon CloudFrontは、AWSが提供するグローバルなコンテンツ配信ネットワーク(CDN)サービスです。ウェブサイト、API、動画コンテンツ、その他のウェブアセットを世界中のユーザーに低レイテンシーで高速に配信することができます。CloudFrontは、世界中の複数のエッジロケーション(PoP: Points of Presence)を通じてコンテンツを配信し、ユーザーに最も近いエッジロケーションからコンテンツを提供することで、パフォーマンスを向上させます。
CloudFrontの基本的な仕組みは以下の通りです:
ユーザー → DNS解決 → 最寄りのCloudFrontエッジロケーション → キャッシュチェック ↓ [キャッシュヒット] → コンテンツ配信 → ユーザー [キャッシュミス] → オリジンからフェッチ → キャッシュ → コンテンツ配信 → ユーザー
CloudFrontは、以下のようなさまざまなタイプのオリジンをサポートしています:
オリジンタイプ | 説明 | ユースケース |
---|---|---|
Amazon S3バケット | 静的コンテンツを保存するAWSのオブジェクトストレージ | 静的ウェブサイト、画像、動画、ドキュメントの配信 |
Amazon EC2インスタンス | 動的コンテンツを生成するウェブサーバー | 動的ウェブアプリケーション、APIの配信 |
Elastic Load Balancer | 複数のEC2インスタンス間でトラフィックを分散 | 高可用性が必要な動的ウェブアプリケーション |
AWS Lambda関数URL | サーバーレス関数によって生成されるコンテンツ | サーバーレスウェブアプリケーション、APIの配信 |
カスタムオリジン | AWS外部のHTTP/HTTPSサーバー | 既存のウェブサーバー、サードパーティのコンテンツ |
CloudFrontディストリビューションを設定する際の主要なオプションは以下の通りです:
キャッシュ動作は、特定のパスパターンに対するCloudFrontの動作を定義します。1つのディストリビューションに複数のキャッシュ動作を設定できます。
CloudFrontは、AWS Management Console、AWS CLI、SDKs、またはインフラストラクチャ as コード(IaC)ツールを使用して利用できます。
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 "/*"
CloudFrontは、コンテンツ配信のセキュリティを確保するための多くの機能を提供しています:
CloudFrontは、ビューワーとCloudFront間、およびCloudFrontとオリジン間のHTTPS通信をサポートしています。ビューワーをHTTPからHTTPSにリダイレクトするように設定することもできます。
フィールドレベル暗号化を使用すると、クレジットカード番号などの機密データをエッジで暗号化し、オリジンサーバーでのみ復号化できるようにすることができます。
OAIを使用すると、S3バケット内のコンテンツへの直接アクセスを防ぎ、CloudFrontを通じてのみアクセスできるようにすることができます。
# 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/*"
}
]
}
特定の国からのアクセスを許可または拒否するように地理的制限を設定できます。
CloudFrontディストリビューションをAWS WAFと統合して、SQLインジェクション、クロスサイトスクリプティング(XSS)などの一般的なウェブの脆弱性からアプリケーションを保護できます。
署名付きURLまたは署名付きCookieを使用して、プライベートコンテンツへのアクセスを制限できます。これは、有料コンテンツや会員限定コンテンツに適しています。
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
CloudFrontのパフォーマンスを最適化するためのベストプラクティス:
Lambda@Edgeは、CloudFrontのエッジロケーションでAWS Lambda関数を実行できるようにする機能です。これにより、ユーザーに近い場所でコードを実行し、レイテンシーを削減できます。
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;
};
CloudFrontのパフォーマンスと使用状況を監視するためのツール:
CloudWatchは、CloudFrontのメトリクス(リクエスト数、データ転送量、エラー率など)を収集し、アラームを設定して自動アクションをトリガーすることができます。
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アクセスログは、ディストリビューションに対するすべてのユーザーリクエストの詳細な記録を提供します。これらのログは、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/"
},
...
}
リアルタイムログは、ディストリビューションへのリクエストに関する情報をリアルタイムで提供します。これらのログは、Amazon Kinesis Data Streamsに配信されます。
X-Rayを使用して、CloudFrontを通過するリクエストをトレースし、アプリケーションのパフォーマンスの問題を特定できます。
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は、AWSが提供するグローバルなコンテンツ配信ネットワーク(CDN)サービスです。世界中のエッジロケーションを通じてコンテンツを配信し、ユーザーに最も近い場所からコンテンツを提供することで、低レイテンシーと高速なパフォーマンスを実現します。
CloudFrontの主な利点は以下の通りです:
CloudFrontを効果的に活用するには、適切なオリジンの選択、キャッシュ設定の最適化、セキュリティ機能の活用、モニタリングの設定が重要です。また、Lambda@Edgeを使用してエッジでのカスタム処理を実装することで、さらにパフォーマンスを向上させることができます。