ペイロードサイズが2GBまで対応されたAmazon SNSのPythonライブラリ「Extended Client Library for Python」を試してみた

2023.03.31

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

こんにちは!DA(データアナリティクス)事業本部 サービスソリューション部の大高です。

皆さんはAmazon SNSをお好きでしょうか?私は大好きです。ユースケースにもよりますが、SESと比較するとお手軽にメールを宛先としたメッセージ配信ができるところが特に大好きです。

このAmazon SNSは通常はペイロードサイズの上限は256KBとなっていますが、Amazon S3をペイロードの保存先として利用することで2GBまで送信できるライブラリがこれまでも存在しました。

これはJava用のライブラリで「Amazon SNS Extended Client Library for Java」というものだったのですが、先日「Amazon SNS Extended Client Library for Python」というPython用のライブラリが公開されました。

とても気になるので、実際に試してみたいと思います。

前提条件

以下を前提としています。

  • AWSアカウントを持っており、AWS CLIなどでクレデンシャルの設定が済んでいる
  • Python 3.x と pip がインストール済み

また、SNSトピックも事前に作成し、Emailのサブスクリプションも設定しておきました。

  • トピック名
    • cm-ootaka-sandbox-sns-topic

セットアップ

まずは該当ライブラリをインストールします。

pip install amazon-sns-extended-client boto3

これで準備ができました。

メッセージ送信のためのサンプルコード

公式のGitHubのREADMEを元に、以下のような簡単なサンプルコードを用意しました。

publish-message.py

import boto3
from sns_extended_client import SNSExtendedClientSession

TOPIC_ARN = "arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:cm-ootaka-sandbox-sns-topic"
BUCKET_NAME = "this-is-sample-s3-bucket-name"

sns_extended_client = boto3.client("sns", region_name="ap-northeast-1")
sns_extended_client.large_payload_support = BUCKET_NAME
sns_extended_client.always_through_s3 = True
sns_extended_client.publish(
    TopicArn=TOPIC_ARN, Message="This message should be published to S3"
)

print("Publish Done.")

なお、TOPIC_ARNBUCKET_NAMEはサンプル値です。

また、今回はペイロードサイズが小さいものを利用するので、sns_extended_client.always_through_s3Trueを指定することで、強制的にS3バケットを利用するように指定しています。

このコードを使って試してみましょう。

SNSメッセージを送ってみる

では、実際に送ってみます。

% python3 publish-message.py
Publish Done.

配信されるメール

送信が完了すると以下のようなメールが届いていました。

["software.amazon.payloadoffloading.PayloadS3Pointer", {"s3BucketName": "this-is-sample-s3-bucket-name", "s3Key": "62e9a741-3703-4270-b421-ae7c23e9b0c4"}]

--
If you wish to stop receiving notifications from this topic, please click or visit the link below to unsubscribe:
https://sns.ap-northeast-1.amazonaws.com/unsubscribe.html?SubscriptionArn=[DUMMY_ARN]&Endpoint=[DUMMY_EMAIL]

Please do not reply directly to this email. If you have any questions or comments regarding this email, please contact us at https://aws.amazon.com/support

unsubscribeの箇所はダミーの値を入れていますが、このような感じです。

送信されたペイロードがS3のどこに保存されたかが分かる通知内容となっていました。

実際に、S3バケットの中身も確認してみます。

% aws s3 cp s3://this-is-sample-s3-bucket-name/62e9a741-3703-4270-b421-ae7c23e9b0c4 -
This message should be published to S3

ちゃんと、送付したメッセージがS3バケットのオブジェクトとして保存されていることが確認できました!

まとめ

以上、ペイロードサイズが2GBまで対応されたAmazon SNSのPythonライブラリ「Extended Client Library for Python」を試してみました。

自分自身でS3にオブジェクトをPutして、SNSのメッセージにその旨を書くこともできますが、このライブラリを利用すれば特に意識せずに一連の流れを処理できるので楽そうですね。

実際にユーザーにメール通知をさせるユースケースなどを考えた場合には、もう少しユーザーフレンドリーなメッセージを通知したくなると思います。その場合には、間に別途処理を挟んでメッセージを加工してあげると良さそうかなと思いました。

どなたかのお役に立てば幸いです。それでは!