[アップデート] Amazon SNS のメッセージペイロード上限が 1 MiB になったので境界値近くのサイズで送信した時の挙動を確認してみた
いわさです。
Amazon SNS にはトピックごとにペイロードサイズの上限があります。
メッセージペイロード上限は従来 256 KiB だったのですが、先日のアップデートで 1 MiB へ拡張されました。
これまで 256 KiB を超えるメッセージを SNS で扱うには、Amazon SNS 拡張クライアントライブラリのようなものを使うか、メッセージを分割する必要がありました[1]。
今回のアップデートでは、トピックに MaximumMessageSize 属性を設定するだけで、最大 1 MiB のメッセージをそのまま publish できるようになりました。
今回こちらを確認してみたので紹介します。
実際に確認してみる
まずコンソールでトピックを作ってみましょう。
トピックの作成画面に「Maximum message size」欄から上限を指定できます。
デフォルトは 256 KiB で、1〜1024 KiB の範囲で変更できます。以下はスタンダードトピックの作成画面です。

以下は FIFO トピックの作成画面です。今回のアップデートはどちらのタイプにも対応しています。良いですね。

今回は上限いっぱいの 1024 KiB(1 MiB)を指定してトピックを作りました。
なお、AWS CLI で確認してみると次のようにget-topic-attributesのAttributes.MaximumMessageSizeで確認できます。バイト単位で 1,048,576 が入っていました。
$ aws sns get-topic-attributes \
--topic-arn arn:aws:sns:ap-northeast-1:123456789012:blog-sns-large-payload \
--query 'Attributes.MaximumMessageSize'
"1048576"
トピック作成したので実際に送信テストしてみます。
今回は受信確認用に、SQS キューを作ってサブスクライブしておきます。SNS のエンベロープを挟まず生データから本文サイズをそのままチェックしたかったので、raw message delivery を有効にしておきました。
では 1 MiB ちょうどのペイロードを送ってみましょう。判定はメッセージ本文とメッセージ属性の合計サイズに対して行われるので、属性なしで本文を 1,048,576 バイトぴったりにしました。
$ python3 -c "import sys; sys.stdout.write('A'*1048576)" > /tmp/msg_1mib.txt
$ aws sns publish \
--topic-arn arn:aws:sns:ap-northeast-1:123456789012:blog-sns-large-payload \
--message file:///tmp/msg_1mib.txt
{
"MessageId": "c8565e63-1215-5989-ba79-3d44f295fe1a"
}
上限ちょうどの場合、成功しましたね。
SQS 側で受信してみると、本文がそのまま 1 MiB 届いていました。いいですね。
$ aws sqs receive-message \
--queue-url https://sqs.ap-northeast-1.amazonaws.com/123456789012/blog-sns-large-payload-q \
--query 'Messages[0].Body' --output text | wc -c
1048577
wc -c の末尾改行 1 バイトを除くと 1,048,576 バイトで、送った 1 MiB がそのまま SQS に届いていますね。
次に、上限を 1 バイトだけ超える 1,048,577 バイトで送ってみます。
$ python3 -c "import sys; sys.stdout.write('A'*1048577)" > /tmp/msg_over.txt
$ aws sns publish \
--topic-arn arn:aws:sns:ap-northeast-1:123456789012:blog-sns-large-payload \
--message file:///tmp/msg_over.txt
An error occurred (InvalidParameter) when calling the Publish operation: Invalid parameter: Message too long
お、エラーになりました!message too long です。
1 バイト超えただけで拒否されましたね。
256 KiB を超える設定にするときの制約
MaximumMessageSize を 256 KiB より上に設定すると、サブスクライブできるエンドポイントとサブスクリプション数に制約がかかるらしいです。
公式ドキュメントには次のように記載されていました。
Topics with MaximumMessageSize set above 256 KiB support Amazon Data Firehose, Amazon SQS, and AWS Lambda subscriptions, with up to 100 total subscriptions per topic.
まとめると、256 KiB を超える設定にすると次の制約が発生します。
- 対応エンドポイントは SQS・Data Firehose・Lambda の 3 種類に絞られる。HTTP/HTTPS・SMS・E メール・モバイルプッシュは使えなくなる
- Data Firehose はレコードサイズの上限(1,000 KiB)が 1 MiB より小さい。それを考慮して低めにしておくことが推奨されている
- サブスクリプション数の上限が 1 トピックあたり 100 になる。スタンダードだと 1250 万上限だったと思うので注意
デフォルトのトピックはこれまでどおり 256 KiB
MaximumMessageSize を設定していないトピックがどうなるかも見ておきます。
属性を指定せずにトピックを作ると、get-topic-attributes のレスポンスに MaximumMessageSize が含まれず、256 KiB のデフォルトが適用されます。
256 KiB ちょうど(262,144 バイト)と、そこから 1 バイト超えた 262,145 バイトを送ってみます。
$ aws sns publish --topic-arn arn:aws:sns:ap-northeast-1:123456789012:blog-sns-default-payload \
--message file:///tmp/msg_256k.txt
{
"MessageId": "fdaae8d4-b941-5606-84bb-8bf359d41fe8"
}
$ aws sns publish --topic-arn arn:aws:sns:ap-northeast-1:123456789012:blog-sns-default-payload \
--message file:///tmp/msg_256k_over.txt
An error occurred (InvalidParameter) when calling the Publish operation: Invalid parameter: Message too long
262,144 バイトは publish 成功、262,145 バイトは拒否されました。
属性を設定していないトピックは従来の 256 KiB のままなので、既存トピックの挙動は変わりません。
1 MiB を使いたいトピックだけ MaximumMessageSize を上げる感じです。
料金はどうなるか
では明示的に 256 KiB 以上に指定する必要があるわけですが、これを超えた時の料金はどうなるのでしょうか。
安心してください。MaximumMessageSize を上げること自体に料金はかかりませんよ。
今回のアップデートに併せてだと思いますが、料金ページ側にも 1 MiB で送った場合どうなるのかについても追記されていました。
Each 64KB chunk of published data is billed as 1 request. For example, a single publish with a 1 MiB payload is billed as 16 requests.
Standard トピックは、発行データを 64 KB ごとに 1 リクエストとして数えます。で、リクエスト数に応じた料金になります。
なので 256 KiB のメッセージ 1 回は 4 リクエスト、1 MiB のメッセージ 1 回は 16 リクエストとしてカウントされます。
一方で FIFO トピックは計算方法が違っていて、1 KB から最大メッセージサイズ(最大 1 MiB)までは 1 メッセージとして数えられるのですが、FIFO の場合はリクエスト数に加えてペイロードデータ量(GB あたり)も料金が発生する感じです。
まぁつまりですね、実際に送信したペイロードサイズの分だけお金がかかるので、トピックの設定を変更すること自体はどっちでもいいぜってことです。
さいごに
本日は Amazon SNS のメッセージペイロード上限が 1 MiB に拡張されたので確認してみました。
これまでちょっとペイロードサイズが大きいメッセージを受信していた方には「おっ」というアップデートですね。
アーキテクチャなどで頑張っていた方は今回のアップデート機能に乗り換えても良いかもしれませんね。1MiB の上限はありますけども。






