Amazon Pinpointを使ったSMS送信をおこなってみた

2021.11.21

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

いわさです。

Amazon Pinpointのアップデートが出ていたので試したかったのですが、意外にもSMS送信チャネルに関する記事がまだ無かったことに気づきました。
Amazon SNSと似ていますし簡単ではありますが、本日はSMS送信方法について記事にしてみました。

プロジェクトでSMSチャネルを有効化する

Pinpointではまずプロジェクトを作成し、その中で必要なチャネルを有効化していきます。
SMSを送信するために、SMSチャネルをまず有効化する必要があります。

支出管理されているように見えるので一見使えそうですが、上記はまだ有効化されていない状態です。
設定の編集から「このプロジェクトのSMSチャネルを有効にする」を選択して保存してください。

サンドボックス

SMS送信機能はサンドボックスの概念があります。
このサンドボックスはSNSのSMS送信と共通で、リージョンごとにサンドボックスステータスが存在しています。

SMSのサンドボックスの有効/無効はSNSと共通で、どちらかで追加した検証済み電話番号は別のサービスでも検証済み電話番号として使うことが可能です。
購入した電話番号についても同様で、PinpointのバックエンドでSNSを使っているような印象を受けました。
実体がどうなっているのかまだよく調べていませんが。情報お持ちの方は教えて頂けると嬉しいです。

SMS送信

本日は単一送信を行います。SNSとほとんど同じ流れです。
セグメントやキャンペーンを使うとAmazon Pinpointの旨みが出てくるのだろうなと理解していますが、本日はシンプルにAPIレベルでの単一送信を行いますね。

テスト機能を使ってマネジメントコンソールから送信

マネジメントコンソールにテスト送信機能があり、APIなど用意せずに送信を行うことが出来ます。
以下の検証ではサンドボックス外のアカウントを使っています。

Sender IDオプション無しだと、発信者がNOTICEとなりました。
Sender IDを指定することが可能なので、iwasa-testと指定してみましょう。

受信側の表示が変わりましたね。

ちなみに、差出人に返信出来ない状態で受信されていますが、Pinpointの場合は双方向SMSという機能もあります。
これもSNSと比較する際のメリットになる部分ですが、これは今度また紹介したいと思います。

boto3を使って送信

次にプログラムを使って送信してみます。

Pinpointメッセージは共通のSendMessagesコマンド/APIでメッセージ送信が可能です。
メッセージのリクエスト内で、どのチャネルでどこへどういうメッセージを送信するのかを指定します。

ここでは、AWSドキュメントに記載されている送信サンプルをベースにboto3ドキュメントを参考に、プロファイルと送信者IDを指定するよう変更して送信してみました。

import logging
import boto3
from botocore.exceptions import ClientError

logger = logging.getLogger(__name__)

def send_sms_message(
        pinpoint_client, app_id, origination_number, destination_number, message,
        message_type):
    try:
        response = pinpoint_client.send_messages(
            ApplicationId=app_id,
            MessageRequest={
                'Addresses': {destination_number: {'ChannelType': 'SMS'}},
                'MessageConfiguration': {
                    'SMSMessage': {
                        'Body': message,
                        'MessageType': message_type,
                        'OriginationNumber': origination_number,
                        'SenderId': 'hoge-iwasa'}}})
    except ClientError:
        logger.exception("Couldn't send message.")
        raise
    else:
        return response['MessageResponse']['Result'][destination_number]['MessageId']

session = boto3.Session(profile_name="hoge")
message_id = send_sms_message(session.client('pinpoint'), "1bcc2ed731064d5f961243549dd7fc16", "+1xxxxxxxxxx", "+81xxxxxxxxxxx", "piyopiyopiyopiyopiyo", "TRANSACTIONAL")
print(message_id)

送信出来ました。

ちなみに送信先の国に応じてダイヤルコードを付与する必要があるのと、使える機能使えない機能がかなり違っています。
日本は色々サポートされていますね。詳細は以下をご参照ください。

まとめ

本日はAmazon Pinpointを使って単純なSMS送信をしてみました。
今回のように単純にSMS送信に使うだけだとSNSとの棲み分けが難しくてメリットを感じにくいかもしれません。

ただ、Pinpointのドキュメントを色々と目を通してみたところ、マルチチャネルやセグメント・キャンペーンの機能などのPinpointマネージドな機能を活用出来ると、相当おもしろいかもしれません。
最近アップデートされた機能を使いたかったのですが、それは置いておいて、マルチチャネルや双方向SMSなどPinpointならではの主要機能を次回使ってみたいと思います。