Amazon SNS Extended Client Library for Python を使って、256 KB を超えるペイロードを処理させてみた

2023.03.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、森田です。

以下のアップデートにあるように、Python 用の Amazon SNS 拡張クライアントライブラリが公開されました。

このライブラリを利用することで Amazon SNS で 256KB以上のペイロードを処理できるようになります。

本記事では、実際にこのライブラリを使って動作を見ていきたいと思います。

はじめに

このライブラリを使用することで、Amazon SNS の制限値が増えるわけではなく、制限値以上のペイロードを扱えるように内部で処理してくれます。

具体的には、Amazon SNS で 256 KB を超えるペイロードを処理できるように、S3にペイロード情報を保存して、S3の参照先を Amazon SNSのペイロードとしているようです。

実際にライブラリを使ってその仕様を確認してみます。

やってみた

事前準備

まずは、ライブラリを以下のコマンドでインストールします。

拡張クライアント ライブラリインストール

pip install amazon-sns-extended-client

SNS トピックの作成

続いて、送信するSNSトピックを準備します。

タイプはスタンダードとして選択し、他はデフォルトの状態で作成します。

動作確認のため、作成した SNSトピックにサブスクリプションをEメールで作成します。

S3 バケットの作成

ペイロードを保存するS3バケットを作成します。

こちらもデフォルトの設定で作成します。

SNS トピックへの送信

SNS トピックへ送信するためのコードを作成します。

以下のコードでは、画像データ(256KB以上)を読み込み、base64エンコードしたものをペイロードとしています。

put.py

import boto3
import base64
import sns_extended_client
import json 


sns = boto3.client('sns')
sns.large_payload_support = '作成したS3バケット'


# 画像ファイルを開いて、バイナリモードで読み込む
with open("sample.jpg", "rb") as image_file:
    encoded_string = base64.b64encode(image_file.read()).decode("utf-8")

data = json.dumps({'image': encoded_string})


topic_arn = "作成したSNSトピックのArn"

response = sns.publish(
        TopicArn=topic_arn,
        Message=data,
        Subject="TEST"
        )

print("response is {}".format(response))

上記のコードを見ていただければわかるように、

  • import sns_extended_client
  • sns.large_payload_support = '作成したS3バケット'

を設定するだけ簡単に実装できます。

あとは、上記のスクリプトを実行してみると、以下のようにペイロードとして、S3のパスなどが登録したメールアドレスに送信されます。

ちなみに、256KB以下のファイル送った場合は、S3を使用せず、以下のようにそのままのデータが送信されます。

デフォルトでは、S3を使った送信とするか、そのままのデータで送信するかの閾値として256KBとなっていますが、

パラメータを指定することで、全てS3を使った送信とすることや任意の閾値とすることも可能です。

全てのペイロードを対象

sns.always_through_s3 = True

64Kを閾値

sns.message_size_threshold = 65536

最後に

SNS 拡張クライアントライブラリを触ってみましたが、たった数行で256 KB を超えるペイロードを処理できるため、とても便利だと感じました。

実際には、送信したペイロードの実データはS3上に保存されているので、サブスクリプション側でデータを読み込みたい場合などは、S3 Get Objectをする必要がありそうです。