何が「1個」なのか
- 時間課金されない
- GB課金されない
- 個数課金される
ひとことで言うと
1回の呼び出しが1個とは限らない。個数を決めるのはペイロードのサイズだ。
なぜそうなるのか
時間とバイトは連続量で、動いている感覚がある。それに比べると個数は一番簡単なメーターに見える。呼んだ回数を数えて単価を掛けるだけ。ところが3つのうち一番直感が外れるのがこれで、理由は単純だ。コード側で数えた回数と、請求書側で数えられた個数が一致しない。
原因はチャンクにある。リクエスト単価は「リクエスト1回の値段」ではなく「ある大きさまでの仕事の値段」で、その大きさはサイズで決まっている。超えた分は、複数回呼んだのと同じ扱いになる。AWS 自身が SQS の料金ページにそう書いている。「ペイロードの 64 KB ごとに 1 リクエストとして課金される (例: 1 MiB のペイロードを持つ API アクションは 16 リクエストとして課金される)」。
チャンクサイズはサービスごとにバラバラで、推測できるような規則性はない。
- Amazon SQS — 1 リクエストあたり 64 KB。
- Amazon SNS — publish 側で 64 KB、さらに配信側でも 64 KB。
- Amazon EventBridge — カスタムイベント 1 件あたり 64 KB。「256 KB のペイロードのイベントは 4 イベントとして課金される」。Schema Discovery だけは同じペイロードを 8 KB で刻む。
- Amazon API Gateway — HTTP API は 512 KB 単位、WebSocket メッセージは 32 KB 単位で「33 KB のメッセージは 2 メッセージとして計測される」。REST API だけは例外で、サイズに関係なく 1 回は 1 回。
- AWS AppSync — リアルタイムメッセージは「配信データのペイロード 5 KB ごと」に課金。送受信の両方向。
- AWS IoT Core — 1 メッセージ 5 KB。8 KB の publish は 2 メッセージ。
- Amazon Kinesis Data Streams のプロビジョンドモード — PUT ペイロードユニットは 25 KB。45 KB のレコードは 2 ユニット、1 MB のレコードは 40 ユニット。
ここから実用的なルールが1本出る。チャンク境界までの余白は無料、1 バイトはみ出した瞬間に有料。 IoT の 4 KB publish と 5 KB publish は同じ値段で、5.1 KB になると倍になる。メッセージフォーマットを自分で握っているなら設計で効く非対称性だし、握っていないなら思い込む前に測るべき非対称性だ。
揉めるのは3行目だ。空振りのポーリングもれっきとした API アクションなので、他と同じように課金される。us-east-1 の標準キューで 100 万リクエストあたり $0.40、毎月最初の 100 万回は無料。
で、いくらなの
チャンクは「1回が1個にならない」3つの理由のうちの1つでしかない。残りはリクエストのクラスと、扇形に広がる先の数だ。
リクエストのクラスは桁が違う。 S3 はリクエストを階層で分けていて、その差は微妙どころではない。us-east-1 で Requests-Tier1 (PUT・COPY・POST・LIST) が 1,000 件 $0.005、Requests-Tier2 (GET とその他すべて) が 1,000 件 $0.0004。読むのではなく書くというだけで 12.5 倍。DELETE と CANCEL はそもそも無料だ。オブジェクトごとにバケットを LIST して回るクローラーは、読むだけの仕事に書き込み階層の単価を払っていることになる。だいたいこの形で刺さる。
ファンアウトは1回の呼び出しを N 個に変える。 SES の送信メーターはメッセージ単位ではなく宛先単位で、50 アドレスへの SendEmail 1 回は 50 件の課金になる。us-east-1 で 1,000 件 $0.10。SNS は二重取りで、publish で 1 回、配信ごとにもう 1 回。しかも課金される宛先とされない宛先がある。publish は 100 万件 $0.50。配信は us-east-1 で以下のとおり。
- SQS と Lambda — $0.00。AWS の price list 上でも本当にゼロ。
- モバイルプッシュ — 100 万件 $0.50。
- HTTP/S — 100 万件 $0.60。最初の 10 万件は無料。
- メール / email-JSON — 10 万件 $2.00、つまり 100 万件 $20。最初の 1,000 件は無料。
メール配信は HTTPS POST の 33 倍。publish の呼び出し側にはその情報は一切ない。値段を決めているのはサブスクリプションのプロトコルで、そのサブスクリプションは全然別の場所で設定されている。
そもそもリクエストですらない「個数」も多い。 このメーターが数えているのは「頼んだ離散的なもの」であって、リクエストはその中で一番よくある形にすぎない。以下 us-east-1。
- Bedrock は入力トークンと出力トークン。キャッシュ読み込みとキャッシュ書き込みは別の usage type で計測される。
- Textract はページ。200 ページの PDF は 200 ページで、やり直せばさらに 200 ページ。
- Polly は文字数。音声だけでなく Speech Marks も同じ単価で数えるので、両方頼めば払う文字数は倍になる。標準ボイスで 100 万文字 $4.00、ニューラルで $16.00。SSML タグは課金文字に含まれない。
- Translate は原文の文字数を「空白文字を含めて」数える。100 万文字 $15.00。
- Transcribe は音声を1秒単位で数えるが、「リクエストごとの最低課金は 15 秒」。
- Comprehend は 100 文字を 1 ユニットとして数え、「リクエストごとに 3 ユニット (300 文字) の最低課金」がある。1 ユニット $0.0001。
- Step Functions の Standard はステート遷移。ステップが実行されるたびに 1 遷移で、1,000 遷移 $0.025。毎月 4,000 遷移までは期限なしで無料。
- Config は構成項目 (configuration item)。リソースの変更が記録されるたびに 1 個で、継続的記録なら 1 個 $0.003。
- Route 53 は DNS クエリそのもの。標準レコードで 100 万クエリ $0.40。
例外と罠
AWS のおよそ半分にはそもそも個数メーターがない。そして境界線は思っている場所にない。 このサイトが索引している 185 サービスのうち、個数メーターを持つのは 89、持たないのが 96。分かれ目は「安いサービス」対「高いサービス」ではなく、コントロールプレーン対データプレーンだ。RunInstances、DescribeInstances、IAM の全 API、STS の全 API — どれだけ叩いても無料。EC2・ECS・EKS・RDS・ALB・Fargate・CloudFormation のスタック操作、どこにも呼び出し課金はない。AWS に構成を変えてくれと頼むのは無料。データを動かせ・データを見ろと頼むと個数で取られる。
役に立つのは後半のほうだ。探す場所を教えてくれるから。EBS は片方の半分ともう片方の半分が1サービスに同居している一番きれいな例で、ボリュームの作成・アタッチ・記述は無料なのに、EBS direct API — スナップショットのブロックを読み書きするやつ — はリクエスト単位とブロック単位の両方で課金される。ListSnapshotBlocks と ListChangedBlocks が 1,000 リクエスト $0.0006、GetSnapshotBlock が 1,000 SnapshotAPIUnit あたり $0.003、PutSnapshotBlock が $0.006。1 ユニットは 512 KiB ブロック 1 個。同じサービス、同じコンソール、データに触った瞬間にメーターが入る。
最低課金は脚注ではなく一族だ。 どの最低値も同じ発想を別の角度から実装したもので、まとめて見ると「小さく・バーストする仕事が 数量 × 単価 の予想を超える」理由そのものになっている。
- Transcribe のリクエストあたり 15 秒。3 秒のクリップに刻めば 5 倍払う。
- Comprehend の 3 ユニット。20 文字の文字列は 300 文字の文字列と同じ値段。
- Redshift Spectrum はクエリごとに MB 単位に切り上げ、さらに 1 クエリ 10 MB の下限。
- S3 Standard-IA と One Zone-IA は「課金対象の最小オブジェクトサイズが 128 KB」で保管も最低 30 日。Glacier 系は 90 日、Deep Archive は 180 日、EBS スナップショットアーカイブは 90 日。
- Glue のクローラーは 10 分の最低課金。5 分おきに走らせれば実質ずっと課金され続ける。
- IoT Core の Rules Engine は「ルールあたり最低 1 アクション」で計測する。評価だけして何も起動しなかったルールも、ルール 1 個 + アクション 1 個。
チャンクの発想はバイトメーターにも漏れ出している。 Amazon Data Firehose にはリクエスト課金が一切ない。Direct PUT の取り込みは GB 単位で、第1階層 $0.029/GB。ところが計量する前に、レコードを 5 KB の倍数に切り上げる。「3KB のレコードは 5KB として、12KB のレコードは 15KB として課金される」。つまり 1 KB のレコードを流し続けると、実際に送った量の 5 倍で課金される。リクエストという次元がどこにも存在しないメーターの上で、だ。チャンクは個数メーターの性質ではない。AWS の性質であって、小さいものが大量に届く場所ならどこにでも出てくる。