Day 10: 徹底比較!AWS CloudFront vs Azure CDN - パフォーマンスとコストで選ぶべきCDNサービス
皆さん、こんにちは。エンジニアのAkrです。
「徹底比較! AWS vs Azure」シリーズ、Day 10へようこそ。
今回は、ウェブサイトやアプリケーションの表示速度を劇的に向上させるCDN(Content Delivery Network)を徹底比較します。AWSのAmazon CloudFrontと、AzureのAzure CDN及びAzure Front Doorを、実践的な観点から詳しく分析していきます。
CDN(Content Delivery Network)とは?
CDNは、世界中に分散配置されたサーバー(PoP: Point of Presence)を利用し、ユーザーの地理的に最も近い場所からコンテンツを配信するサービスです。
CDNの主な効果
- レスポンス時間の短縮: 物理的距離を短縮することで配信速度を向上
- サーバー負荷の軽減: オリジンサーバーへのアクセス集中を回避
- 可用性の向上: 複数のPoPによる冗長化でサービス継続性を確保
- 帯域幅コストの削減: オリジンサーバーからの転送量を削減
対象となるコンテンツ
- 静的コンテンツ(画像、CSS、JavaScript、フォントファイル)
- 動画・音声ファイル
- ソフトウェアダウンロード
- API レスポンス(キャッシュ可能な場合)
サービス概要の比較
AWS CloudFront
特徴:
- AWS独自開発のグローバルCDNサービス
- 2008年リリースの老舗サービス
- AWSエコシステムとの深い統合
主要機能:
- Lambda@Edge / CloudFront Functions
- AWS Shield(DDoS保護)
- AWS WAF統合
- Real-time Logs
- Origin Shield
Azure CDN / Azure Front Door
特徴:
- 複数プロバイダー選択式(Microsoft、Akamai、Edgio)
- Azure Front Door への統合移行中
- Microsoftエコシステムとの強い連携
主要機能:
- Rules Engine
- Dynamic Site Acceleration (DSA)
- Web Application Firewall (WAF)
- Health Probes
- Session Affinity
詳細機能比較
機能カテゴリ | AWS CloudFront | Azure CDN/Front Door |
---|---|---|
グローバルネットワーク | 400+ PoPを世界50カ国以上に展開 | プロバイダーにより異なる (Microsoft: 118+ PoP、Akamai: 4000+ PoP) |
オリジン統合 | S3、EC2、ALB、API Gateway等との深い統合 | Azure Blob Storage、App Service等との統合 |
エッジコンピューティング | Lambda@Edge CloudFront Functions |
Rules Engine Azure Functions(Front Door) |
セキュリティ | AWS Shield Standard/Advanced AWS WAF SSL/TLS証明書管理 |
DDoS保護 Azure WAF Azure Key Vault統合 |
動的コンテンツ | Dynamic Content Acceleration Lambda@Edge処理 |
Dynamic Site Acceleration(DSA) Azure Front Door最適化 |
リアルタイム分析 | Real-time Logs CloudWatch統合 |
Azure Monitor統合 診断ログ |
プロトコル対応 | HTTP/1.1, HTTP/2, WebSocket | HTTP/1.1, HTTP/2, WebSocket |
パフォーマンス比較
レスポンス時間
AWS CloudFront:
- アジア太平洋地域: 平均 50-80ms
- 北米: 平均 30-50ms
- ヨーロッパ: 平均 40-70ms
Azure CDN:
- プロバイダーにより大きく異なる
- Microsoft: アジア太平洋地域 60-90ms
- Akamai: グローバル平均 40-60ms
キャッシュヒット率
両サービスとも適切な設定により 85-95% のキャッシュヒット率を実現可能。
# CloudFrontでのキャッシュ制御例
Cache-Control: public, max-age=31536000
CloudFront-Is-Desktop-Viewer: true
CloudFront-Viewer-Country: JP
# Azure CDNでのキャッシュ制御例
Cache-Control: public, max-age=31536000
X-Azure-Ref: 0.3f1e2d17.1640995200.12ab34cd
セキュリティ機能の詳細比較
AWS CloudFrontのセキュリティ
// Lambda@Edgeでのセキュリティ実装例
exports.handler = (event, context, callback) => {
const request = event.Records[0].cf.request;
const headers = request.headers;
// IP制限の実装
const clientIP = headers['x-forwarded-for'] ?
headers['x-forwarded-for'][0].value :
event.Records[0].cf.request.origin.custom.domainName;
if (isBlockedIP(clientIP)) {
callback(null, {
status: '403',
statusDescription: 'Forbidden',
body: 'Access denied'
});
return;
}
callback(null, request);
};
セキュリティ機能:
- AWS Shield Standard(無料)
- AWS Shield Advanced(有料、$3,000/月)
- AWS WAF統合
- SSL/TLS終端
- Field-level Encryption
Azure CDN/Front Doorのセキュリティ
{
"rules": [
{
"name": "IPRestriction",
"priority": 100,
"ruleType": "MatchRule",
"matchConditions": [
{
"matchVariable": "RemoteAddr",
"operator": "IPMatch",
"matchValue": ["192.168.1.0/24"],
"negateCondition": true
}
],
"action": {
"type": "Block"
}
}
]
}
セキュリティ機能:
- DDoS保護(標準)
- Azure WAF
- SSL/TLS終端
- Private Link統合
- Bot Management
料金比較
AWS CloudFront 料金構造
リージョン | データ転送(GB あたり) | HTTPリクエスト(10,000件あたり) | HTTPSリクエスト(10,000件あたり) |
---|---|---|---|
米国・欧州 | $0.085(最初の10TB) | $0.0075 | $0.01 |
アジア太平洋 | $0.140(最初の10TB) | $0.0075 | $0.009 |
日本 | $0.114(最初の10TB) | $0.0075 | $0.009 |
無料利用枠(12ヶ月間):
- データ転送: 50GB/月
- HTTPリクエスト: 2,000,000件/月
Azure CDN 料金構造
プロバイダー | データ転送(GB あたり) | HTTPリクエスト(10,000件あたり) |
---|---|---|
Microsoft | $0.087(最初の10TB) | $0.0075 |
Akamai | $0.160(最初の10TB) | $0.022 |
Edgio | カスタム価格 | カスタム価格 |
実際のコスト例
月間 100GB、100万リクエストの場合:
AWS CloudFront(アジア太平洋):
データ転送: 100GB × $0.140 = $14.00
HTTPSリクエスト: 100 × $0.009 = $0.90
合計: $14.90/月
Azure CDN(Microsoft):
データ転送: 100GB × $0.087 = $8.70
HTTPリクエスト: 100 × $0.0075 = $0.75
合計: $9.45/月
実際の設定例
AWS CloudFront 設定例
# CloudFormationテンプレート例
Resources:
CloudFrontDistribution:
Type: AWS::CloudFront::Distribution
Properties:
DistributionConfig:
Enabled: true
DefaultCacheBehavior:
TargetOriginId: S3Origin
ViewerProtocolPolicy: redirect-to-https
CachePolicyId: 4135ea2d-6df8-44a3-9df3-4b5a84be39ad # Managed-CachingOptimized
Compress: true
Origins:
- Id: S3Origin
DomainName: !GetAtt S3Bucket.DomainName
S3OriginConfig:
OriginAccessIdentity: !Sub 'origin-access-identity/cloudfront/${OriginAccessIdentity}'
PriceClass: PriceClass_100 # 米国・欧州のみ
ViewerCertificate:
AcmCertificateArn: !Ref SSLCertificate
SslSupportMethod: sni-only
Azure Front Door 設定例
{
"name": "myFrontDoor",
"properties": {
"frontendEndpoints": [
{
"name": "frontendEndpoint1",
"properties": {
"hostName": "example.azurefd.net",
"sessionAffinityEnabledState": "Disabled",
"sessionAffinityTtlSeconds": 0
}
}
],
"backendPools": [
{
"name": "backendPool1",
"properties": {
"backends": [
{
"address": "example.blob.core.windows.net",
"httpPort": 80,
"httpsPort": 443,
"weight": 100,
"priority": 1,
"enabledState": "Enabled"
}
],
"healthProbeSettings": {
"path": "/",
"protocol": "Https",
"intervalInSeconds": 30
}
}
}
]
}
}
実際の運用における考慮点
監視・アラート設定
CloudWatch(CloudFront):
import boto3
cloudwatch = boto3.client('cloudwatch')
# カスタムメトリクス作成例
cloudwatch.put_metric_alarm(
AlarmName='CloudFront-HighErrorRate',
ComparisonOperator='GreaterThanThreshold',
EvaluationPeriods=2,
MetricName='4xxErrorRate',
Namespace='AWS/CloudFront',
Period=300,
Statistic='Average',
Threshold=5.0,
ActionsEnabled=True,
AlarmActions=['arn:aws:sns:us-east-1:123456789012:my-sns-topic'],
AlarmDescription='CloudFront 4xx error rate is high'
)
Azure Monitor(Front Door):
# Azure CLI を使ったアラート設定例
az monitor metrics alert create \
--name "FrontDoor-HighLatency" \
--resource-group "myResourceGroup" \
--scopes "/subscriptions/{subscription-id}/resourceGroups/myResourceGroup/providers/Microsoft.Network/frontdoors/myFrontDoor" \
--condition "avg OriginLatency > 1000" \
--description "Front Door origin latency is high"
パフォーマンス最適化のベストプラクティス
共通の最適化手法:
-
適切なキャッシュTTL設定
# 静的リソース(長期キャッシュ) Cache-Control: public, max-age=31536000, immutable # API レスポンス(短期キャッシュ) Cache-Control: public, max-age=300
-
圧縮の有効化
- Gzip/Brotli圧縮
- 画像の最適化(WebP対応)
-
HTTP/2の活用
- 多重化による高速化
- Server Push(対応している場合)
選択基準とおすすめパターン
AWS CloudFrontが適している場合
技術的要件:
- AWSエコシステム中心の構成
- Lambda@Edgeでのエッジコンピューティングが必要
- AWS Shield Advancedレベルのセキュリティが必要
ビジネス要件:
- グローバルなトラフィック分散が必要
- セキュリティを最重要視
- AWSの他サービスとの統合を最大化したい
コード例(S3との統合):
import boto3
# S3とCloudFrontの連携例
s3 = boto3.client('s3')
cloudfront = boto3.client('cloudfront')
# S3バケットポリシーでCloudFrontのみアクセス許可
bucket_policy = {
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowCloudFrontAccess",
"Effect": "Allow",
"Principal": {
"Service": "cloudfront.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudfront::123456789012:distribution/ABCDEFGHIJKLMN"
}
}
}
]
}
Azure CDN/Front Doorが適している場合
技術的要件:
- Microsoft エコシステム中心の構成
- Office 365、Microsoft 365との連携
- 複数のCDNプロバイダーからの選択が必要
ビジネス要件:
- 特定地域でのパフォーマンス最適化(Akamaiネットワーク活用)
- 段階的なマルチクラウド移行
- Microsoft のエンタープライズサポートを活用
コード例(Azure Blob Storageとの統合):
// Azure SDK を使った統合例
using Azure.Storage.Blobs;
using Azure.ResourceManager.Cdn;
var blobServiceClient = new BlobServiceClient(connectionString);
var containerClient = blobServiceClient.GetBlobContainerClient("static-content");
// CDN エンドポイント経由でのアクセス最適化
var cdnEndpoint = "https://mycdn.azureedge.net";
var optimizedUrl = $"{cdnEndpoint}/static-content/{blobName}";
トラブルシューティング
よくある問題と解決法
キャッシュが効かない場合:
# CloudFront
aws cloudfront get-distribution-config --id ABCDEFGHIJKLMN
aws cloudfront create-invalidation --distribution-id ABCDEFGHIJKLMN --paths "/*"
# Azure CDN
az cdn endpoint purge --resource-group myResourceGroup --profile-name myCDNProfile --name myEndpoint --content-paths "/*"
証明書の問題:
- CloudFront: ACM証明書は us-east-1 リージョンで発行必要
- Azure Front Door: Key Vault または Azure 管理証明書を使用
パフォーマンステストの実施方法
測定ツールと手法
# cURLでのレスポンス時間測定
curl -w "@curl-format.txt" -o /dev/null -s "https://your-cdn-domain.com/test-file.jpg"
# curl-format.txt の内容例
time_namelookup: %{time_namelookup}\n
time_connect: %{time_connect}\n
time_appconnect: %{time_appconnect}\n
time_pretransfer: %{time_pretransfer}\n
time_redirect: %{time_redirect}\n
time_starttransfer: %{time_starttransfer}\n
----------\n
time_total: %{time_total}\n
A/Bテストの実施
// JavaScript でのパフォーマンス測定
const performanceTest = async (urls) => {
const results = [];
for (const url of urls) {
const startTime = performance.now();
try {
const response = await fetch(url);
const endTime = performance.now();
results.push({
url,
loadTime: endTime - startTime,
status: response.status,
size: response.headers.get('content-length')
});
} catch (error) {
results.push({
url,
error: error.message
});
}
}
return results;
};
最終的な選択指針
決定フローチャート
総合評価
評価項目 | AWS CloudFront | Azure Front Door | 重要度 |
---|---|---|---|
パフォーマンス | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | High |
機能の豊富さ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | High |
セットアップの容易さ | ⭐⭐⭐ | ⭐⭐⭐⭐ | Medium |
コスト効率 | ⭐⭐⭐ | ⭐⭐⭐⭐ | High |
エコシステム統合 | ⭐⭐⭐⭐⭐ (AWS) | ⭐⭐⭐⭐⭐ (Azure) | High |
グローバル展開 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | Medium |
セキュリティ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | High |
まとめ
AWS CloudFront と Azure CDN/Front Door は、それぞれ異なる強みを持つ優秀なCDNサービスです。
AWS CloudFrontを選ぶべき場合
- AWSエコシステム中心のアーキテクチャ
- Lambda@Edgeによるエッジコンピューティングが必要
- グローバル展開でのパフォーマンス最適化を重視
- セキュリティ機能の統合を重視
Azure Front Doorを選ぶべき場合
- Microsoftエコシステムとの統合が必要
- コスト効率を重視
- 段階的なクラウド移行を計画中
- 特定地域でのパフォーマンス(Akamaiネットワーク活用)が必要
どちらを選択しても、適切な設定と運用により、優れたパフォーマンスとユーザーエクスペリエンスを実現できます。重要なのは、自社の技術スタック、要件、予算に最も適合するサービスを選択することです。
次回は、ロードバランサーの比較を行います。お楽しみに!
この記事が役に立ったら、ぜひ「いいね」やシェアをお願いします。質問やフィードバックもお待ちしています!