Pay-as-You-Go(無料プランではない)でAWS CloudFrontを作成する
AWS CLI を使用して CloudFront の Pay-as-you-go を作成します。
AWS Freeプランは私の場合動作しておらず、AWSコンソール上で新しいCloudFrontディストリビューションではPay-as-you-goが非表示となっています。
HugoベースのサイトをAWSにホストする際には、通常、バケットをCloudFrontの背後にあるようにし、Lambda@Edge関数をアタッチして、ディレクトリパス(例:/blog/)へのリクエストを/blog/index.htmlにリライトするようにします。これにより、S3ウェブサイトスタイルのオリジンを使用できます。その後、hugo deployまたはAWS CLIを使用してデプロイして、構築されたサイトを同期できます。ただし、この方法ではCloudFrontディストリビューションが必要で、Flat-rateプランのコミットメントを避けるためにPay-as-you-go料金体系が必要です。コンソールでは今や、選択肢としてFreeまたはProプランのみ表示されるようになりました。

この投稿では、AWS CLIとこの記事のscriptsフォルダ内のスクリプトを使用して、既存のディストリビューションの構成を再利用してPay-as-you-goディストリビューションを作成する方法を示します。
コンソールではFreeまたはProのみ表示される
アマゾンはCloudFrontのFlat-rate料金プラン(Free、Pro、Business、Premium)を導入し、CDNとWAF、DDoS保護、Route 53、その他のサービスを固定月額料金で提供しています。オーバー料金はありません。CloudFrontコンソールで新しいディストリビューションを作成する際には、今やFreeまたはPro(およびそれ以上のプラン)のオプションのみ表示されます。Proプランは**$15/月**から開始し、“Pay-as-you-go"オプションは表示されていません。
Pay-as-you-goは、CloudFront APIまたはAWS CLI(create-distribution)を使用してディストリビューションを作成する際には依然としてデフォルトです。すでに以前に作成されたディストリビューション(またはCLI経由で作成されたもの)があり、同じ動作(例:S3ウェブサイトオリジン+Lambda@Edgeによるindex.html)を持つ別のディストリビューションが必要な場合は、そのディストリビューションの構成をエクスポートし、調整し、新しいディストリビューションを作成できます。この新しいディストリビューションは、後のFlat-rateプランへのアタッチを除き、Pay-as-you-go料金体系になります。
必要な物
- 既存のCloudFrontディストリビューションがあり、その構成をコピーできる(例:別のHugoサイトで使用しているもの、またはコンソール変更前のもの)。
- AWS CLIがインストールされ、
cloudfront:GetDistributionConfigおよびcloudfront:CreateDistributionを実行できる資格情報で構成されている。 - jq(または類似のツール)を使用してJSON構成を編集できる。
以下の例で使用されるスクリプトは、この投稿のscriptsフォルダ内にあります:current-distribution-config.json、new-distribution-config.json、updated-distribution-config.json、およびfinal-distribution-config.json。
ステップ1:既存のディストリビューション構成を取得
ETagを含む完全なディストリビューション構成を取得し、保存します:
# ABCDEFGを既存のディストリビューションIDに置き換えてください
aws cloudfront get-distribution-config --id ABCDEFG > current-distribution-config.json
get-distribution-configは、ETagとDistributionConfigを含むラッパーオブジェクトを返します。新しいディストリビューションの作成には、DistributionConfigの内側の部分のみを渡しますので、それを抽出します:
jq '.DistributionConfig' < current-distribution-config.json > new-distribution-config.json
この時点で、new-distribution-config.jsonは以下のようになります(省略版)。
CallerReference、Aliases、Origins、DefaultRootObject、DefaultCacheBehavior(Lambda@Edgeを含む)が含まれています。例として、サイトドメインはmicro.comを使用しています:
{
"CallerReference": "8b2b19eb-6d41-4fc0-8d04-a1313e23e2d7",
"Aliases": {
"Quantity": 1,
"Items": ["micro.com"]
},
"DefaultRootObject": "index.html",
"Origins": {
"Quantity": 1,
"Items": [
{
"Id": "micro.com.s3.us-west-2.amazonaws.com",
"DomainName": "micro.com.s3-website-us-west-2.amazonaws.com",
"OriginPath": "",
"CustomOriginConfig": {
"HTTPPort": 80,
"HTTPSPort": 443,
"OriginProtocolPolicy": "http-only"
}
}
]
},
"DefaultCacheBehavior": {
"TargetOriginId": "micro.com.s3.us-west-2.amazonaws.com",
"ViewerProtocolPolicy": "redirect-to-https",
"LambdaFunctionAssociations": {
"Quantity": 1,
"Items": [
{
"LambdaFunctionARN": "arn:aws:lambda:us-east-1:...your-lambda-arn",
"EventType": "origin-request",
"IncludeBody": false
}
]
}
}
}
ステップ2:一意のCallerReferenceを設定
すべてのディストリビューションは一意のCallerReferenceを必要とします。他のディストリビューションと同じ値を使用すると、APIがリクエストを拒否します。新しい文字列またはタイムスタンプを使用してください:
NEW_CALLER_REF="new-distr-$(date +%s)"
jq --arg ref "$NEW_CALLER_REF" '.CallerReference = $ref' new-distribution-config.json > updated-distribution-config.json
ステップ3:エイリアスとオリジンの調整(オプション)
新しいサイトが別のドメインまたはS3バケットを使用する場合、updated-distribution-config.json内のAliasesとOriginsを更新してください(例:新しいバケットのウェブサイトエンドポイントとエイリアスリスト)。現在、カスタムドメインなしでディストリビューションを作成したい場合は、エイリアスを削除してください:
jq '.Aliases = {"Quantity": 0, "Items": []}' updated-distribution-config.json > final-distribution-config.json
別のS3ウェブサイトエンドポイントに接続する必要がある場合は、同じファイル内のOriginsセクションを編集してください(例:IdとDomainNameを新しいバケットのウェブサイトホスト名に変更し、DefaultCacheBehavior.TargetOriginIdを同じIdに設定してください)。
ステップ4:新しいディストリビューションを作成
最終構成からディストリビューションを作成します:
aws cloudfront create-distribution --distribution-config file://final-distribution-config.json
応答には、新しいディストリビューションのId、ARN、DomainName、Statusが含まれます。新しいディストリビューションは、デフォルトでPay-as-you-go料金体系を使用します。その後、DNS(またはRoute 53)を新しいCloudFrontドメインにポイントし、Hugoを使用している場合は、いつものようにHugo deployまたはAWS CLIでデプロイできます。
クイックリファレンス:フルスクリプト
既存のディストリビューションIDを使用し、エイリアスを削除して実行する流れは次の通りです:
# 1) DistributionConfigのエクスポートと抽出
aws cloudfront get-distribution-config --id EABCDEFGZ > current-distribution-config.json
jq '.DistributionConfig' < current-distribution-config.json > new-distribution-config.json
# 2) 一意のCallerReference
NEW_CALLER_REF="new-distr-$(date +%s)"
jq --arg ref "$NEW_CALLER_REF" '.CallerReference = $ref' new-distribution-config.json > updated-distribution-config.json
# 3) オプション:カスタムドメインなし
jq '.Aliases = {"Quantity": 0, "Items": []}' updated-distribution-config.json > final-distribution-config.json
# 4) (Pay-as-you-go)ディストリビューションの作成
aws cloudfront create-distribution --distribution-config file://final-distribution-config.json
Pay-as-you-go vs Flat-rate(まとめ)
- Pay-as-you-go:データ転送とリクエストに対して料金が発生します;CloudFrontの永久無料枠には、1TBのデータ転送と10MのHTTP/HTTPSリクエストが月額で含まれます。月額プラン料金はありません。
- Flat-rateプラン:こちらで記載。Freeプランは、より少ない許容範囲(例:1Mリクエスト、100GB)があります;Proプランは$15/月からで、より多くの容量とWAF、Route 53などのバンドルサービスが含まれます。オーバー料金はありません。
ご自分のトラフィックがPay-as-you-go無料枠内に収まり、Flat-rateプランのバンドル機能が必要でない場合は、上記のCLI経由でのディストリビューション作成により、コンソールがFree/Proプランのみ表示しているにもかかわらず、Pay-as-you-goのまま維持できます。