[アップデート] CloudFront の定額料金プランが API・CLI・CloudFormation から操作できるようになりました

[アップデート] CloudFront の定額料金プランが API・CLI・CloudFormation から操作できるようになりました

CloudFront の定額料金プランが AWS CLI・CloudFormation から操作できるようになったので、実際に Free プランと PRO プランでサブスクライブしてみました。Web ACL の関連付けの注意点や、有料プランの承認フローについて紹介します。
2026.09.04

いわさです。

CloudFront には、CDN や WAF などをまとめて月額固定料金で使える定額料金プランがあります。

https://dev.classmethod.jp/articles/aws-flat-rate-pricing-plans/

あまり意識したことなくて知らなかったのですが、これまで定額プランのサブスクライブはマネジメントコンソールからしかできませんでした。
なので、これまでは IaC でディストリビューションを作る場合は、一旦従量課金で作成してから、手動でコンソールを開いてプランを変更する必要があったらしいです。

これが今朝のアップデートで、この定額プランを AWS API・CLI・SDK・CloudFormation から操作できるようになったとアナウンスありました。

https://aws.amazon.com/about-aws/whats-new/2026/09/cloudfront-flat-rate-pricing-plans-api/

今回こちらを確認してみたので紹介します。
料金を発生させたくないので、$0/月の Free プランで試します。

AWS CLI でサブスクライブしてみる

調べてみたところ API 名前空間は pricing-plan-manager で、実は AWS CLI v2 には 2.36.12(2026 年 7 月 30 日)の時点で追加されているようでした。
今回はアナウンス時点の最新である 2.36.39(2026 年 9 月 3 日)で確認しています。

https://github.com/aws/aws-cli/commit/2d20b5c88bc4a1bc8d6ef5cd98483ebc553acdb0

オペレーションは CreateSubscriptionGetSubscriptionListSubscriptionsCancelSubscriptionApprovePaidSubscription など 9 つです。この記事ではサブスクライブとキャンセルを試します。

早速 CLI から Free プランをサブスクライブしてみます。
CloudFront プランでは、サブスクライブ対象にディストリビューション 1 つと WAF web ACL 1 つを指定します。

まず WAF web ACL を作成します。CloudFront 用なので CLOUDFRONT スコープです。

aws wafv2 create-web-acl \
  --name hoge-cf-plan-webacl \
  --scope CLOUDFRONT \
  --region us-east-1 \
  --default-action Allow={} \
  --visibility-config SampledRequestsEnabled=true,CloudWatchMetricsEnabled=true,MetricName=hogeCfPlanWebacl \
  --profile hoge

次に検証用のディストリビューションを作成します。オリジンはダミーで、キャッシュポリシーだけ指定した最小構成です。

作成したディストリビューションと web ACL の ARN を指定して、create-subscription を実行します。plan-tierFREE です。

aws pricing-plan-manager create-subscription \
  --plan-family CloudFront \
  --plan-tier FREE \
  --usage-level DEFAULT \
  --resource-arns \
    "arn:aws:cloudfront::123456789012:distribution/EXAMPLE1234567" \
    "arn:aws:wafv2:us-east-1:123456789012:global/webacl/hoge-cf-plan-webacl/aca05f57-xxxx" \
  --profile hoge

ところが、最初はこのエラーで弾かれました。

An error occurred (ValidationException) when calling the CreateSubscription operation:
The following resources are not eligible for this subscription tier:
arn:aws:cloudfront::123456789012:distribution/EXAMPLE1234567.

このディストリビューションは対象外だと言われます。デプロイ完了を待っても同じでした。
調べてみたところ、原因は、web ACL を作っただけでディストリビューションに関連付けていなかったことでした。
定額プランを使うには、ディストリビューションに WAF web ACL が関連付けられている必要があるっぽいです。

You must have a AWS WAF Web ACL associated with your distribution if you're using a pricing plan.

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/flat-rate-pricing-plan.html

サブスクライブ対象に web ACL を渡すだけでなく、ディストリビューションの WebACLId にも設定しておく必要があるようで、関連付けてから再実行してみるといけました。

{
    "eTag": "0",
    "subscription": {
        "arn": "arn:aws:pricingplanmanager::123456789012:subscription:sub_xxxxxxxx",
        "planFamily": "CloudFront",
        "planTier": "FREE",
        "status": "SYNC_IN_PROGRESS",
        "resourceArns": [
            "arn:aws:cloudfront::123456789012:distribution/EXAMPLE1234567",
            "arn:aws:wafv2:us-east-1:123456789012:global/webacl/hoge-cf-plan-webacl/aca05f57-xxxx"
        ],
        "createdAt": "2026-09-03T21:39:37.011945+00:00",
        "updatedAt": "2026-09-03T21:39:37.011945+00:00"
    }
}

作成直後の statusSYNC_IN_PROGRESS で、少し待って list-subscriptions で何度確認してみるとそのうち ACTIVE になります。

aws pricing-plan-manager list-subscriptions --profile hoge
{
    "subscriptionSummaries": [
        {
            "arn": "arn:aws:pricingplanmanager::123456789012:subscription:sub_xxxxxxxx",
            "planFamily": "CloudFront",
            "planTier": "FREE",
            "status": "ACTIVE",
            "resourceArns": [
                "arn:aws:cloudfront::123456789012:distribution/EXAMPLE1234567",
                "arn:aws:wafv2:us-east-1:123456789012:global/webacl/hoge-cf-plan-webacl/aca05f57-xxxx"
            ],
            "createdAt": "2026-09-03T21:39:37.011945+00:00",
            "updatedAt": "2026-09-03T21:39:49.852444+00:00",
            "eTag": "2"
        }
    ]
}

Free プランは承認モードを指定しなくても、そのままアクティブになります。
approval-mode が承認モードの指定なのですが Free では IMMEDIATE のみです。

有料プランは作成しただけでは課金されない

有料プランの approval-modeMANUAL がデフォルトで、create-subscription した時点では PENDING_APPROVAL で止まり、approve-paid-subscription を呼ぶまで課金は始まりません。
作成だけなら課金されないので、PRO プランで試してみました。

aws pricing-plan-manager create-subscription \
  --plan-family CloudFront \
  --plan-tier PRO \
  --usage-level DEFAULT \
  --approval-mode MANUAL \
  --resource-arns \
    "arn:aws:cloudfront::123456789012:distribution/EXAMPLE1234567" \
    "arn:aws:wafv2:us-east-1:123456789012:global/webacl/hoge-cf-plan-webacl/aca05f57-xxxx" \
  --profile hoge
{
    "eTag": "0",
    "subscription": {
        "arn": "arn:aws:pricingplanmanager::123456789012:subscription:sub_zzzzzzzz",
        "planFamily": "CloudFront",
        "planTier": "PRO",
        "status": "PENDING_APPROVAL",
        "resourceArns": [
            "arn:aws:cloudfront::123456789012:distribution/EXAMPLE1234567",
            "arn:aws:wafv2:us-east-1:123456789012:global/webacl/hoge-cf-plan-webacl/aca05f57-xxxx"
        ],
        "createdAt": "2026-09-03T21:58:41.362811+00:00",
        "updatedAt": "2026-09-03T21:58:41.362811+00:00"
    }
}

承認するまで課金されないことはドキュメントにも明記されています。

PENDING_APPROVAL means a paid-tier subscription has been created but is not yet active and incurs no charges until it is approved out of band via a separate ApprovePaidSubscription call.

今回は承認せずキャンセルしました。PENDING_APPROVAL のサブスクリプションは即座に削除され、課金は発生しません。作成と承認が分かれているので、IaC やエージェントに作成を任せても課金の開始は承認で握れます。

CloudFormation でもやってみる

CloudFormation でも試します。

リソースタイプは AWS::PricingPlanManager::Subscription です。
こちらも同じで web ACL・ディストリビューション・サブスクリプションをまとめて定義する必要があります。

cfn-cloudfront-free-plan.yaml
Resources:
  WebAcl:
    Type: AWS::WAFv2::WebACL
    Properties:
      Name: hoge-cfn-cf-plan-webacl
      Scope: CLOUDFRONT
      DefaultAction:
        Allow: {}
      VisibilityConfig:
        SampledRequestsEnabled: true
        CloudWatchMetricsEnabled: true
        MetricName: hogeCfnCfPlanWebacl

  Distribution:
    Type: AWS::CloudFront::Distribution
    Properties:
      DistributionConfig:
        Enabled: true
        WebACLId: !GetAtt WebAcl.Arn
        Origins:
          - Id: hoge-origin
            DomainName: example.com
            CustomOriginConfig:
              HTTPPort: 80
              HTTPSPort: 443
              OriginProtocolPolicy: https-only
              OriginSSLProtocols:
                - TLSv1.2
        DefaultCacheBehavior:
          TargetOriginId: hoge-origin
          ViewerProtocolPolicy: redirect-to-https
          CachePolicyId: 658327ea-f89d-4fab-a63d-7e88639e58f6

  FreePlanSubscription:
    Type: AWS::PricingPlanManager::Subscription
    Properties:
      PlanFamily: CloudFront
      PlanTier: FREE
      UsageLevel: DEFAULT
      ResourceArns:
        - !Sub "arn:aws:cloudfront::${AWS::AccountId}:distribution/${Distribution.Id}"
        - !GetAtt WebAcl.Arn

Outputs:
  SubscriptionArn:
    Value: !GetAtt FreePlanSubscription.Arn
  SubscriptionStatus:
    Value: !GetAtt FreePlanSubscription.Status
aws cloudformation create-stack \
  --stack-name hoge-cf-free-plan \
  --template-body file://cfn-cloudfront-free-plan.yaml \
  --region us-east-1 \
  --profile hoge

なお有料プランをテンプレートで書いても、CloudFormation は PENDING_APPROVAL で止めるだけで承認まではしません。承認は CLI などで別途行う必要があります。

削除時の挙動はリソース定義にも書かれています。

Deleting an activated subscription does not terminate it immediately; it schedules a cancellation that takes effect at the end of the current billing period.

アクティブなサブスクリプションはスタックを削除しても即座には止まらず、請求サイクルの末に解約がスケジュールされます。
有料プランならそれまで課金が続きます。Free プランは即時解約でした。

さいごに

本日は CloudFront の定額料金プランが API・CLI・CloudFormation から操作できるようになったので確認してみました。

ディストリビューションの作成からプランの申し込みまでを 1 つのテンプレートで完結できるのが便利ですね。
WAF web ACL の関連付けを忘れるとサブスクライブできないので、そこだけ気をつけたいです。

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事