Amazon Pinpoint で SMS を送るときに、表示名を指定する Sender ID を設定してみる

# はじめに

Amazon Pinpoint や Amazon SNS を使って SMS (ショートメッセージサービス) を送ると、携帯電話の電話番号を宛先にしてメッセージを送信できます。何も意識しないで、デフォルトのまま SMS を送信すると、日本だと基本的には送信元が `NOTICE` と表示されます。

![image-20220703170453052.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/9e8cc896-3685-42c2-a343-8d5895e93de6.png)



自分たちが提供しているサービスで、たとえばワンタイムパスワードを SMS で送りたいときに、`NOTICE` と表示されるのはちょっと味気ないです。また、`NOTICE` という表示名が他のサービスと被っていると、同じ画面の中に異なるサービスのメッセージが表示されるので、基本的には独自の表示名に変えたくなります。



このときに、Pinpoint や SNS では、大きく分けて 3 つの方法を使って送信元を指定できます。AWS Document にそれぞれの違いが詳細に書かれているのですが、一言で表すとこんな感じです。

- Sender ID の指定 : 送信元の表示名を追加料金なしに簡単に指定できるので、とてもお手軽です。お手軽な一方、任意な文字を指定できるので、悪い人による[なりすまりの危険があるデメリット](https://www.jc3.or.jp/threats/topics/article-245.html)もあります。
- ショートコードを取得 : 自分専用のショートコードを取得するので、なりすましの危険性を下げられます。一方、追加の料金がそこそこかかります。
- ロングコードを取得 : ショートコードと比べて、一定期間あたりの SMS 送信料が制限されています。また、追加の料金も発生します。

参照 Document : https://docs.aws.amazon.com/ja_jp/pinpoint/latest/userguide/channels-sms-originating-identities.html#channels-sms-originating-identities-long-codes



基本的には、お手軽な表示名設定の Sender ID か、追加のコストをかけて厳密に提供するショートコード、といった使い分けでしょうか。

なお、Sender ID を使った場合は、このように表示名を好きな文字にカスタマイズできます。

![image-20220703173725639.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/fe088707-fff6-a18b-fef3-59dc1a8ff0d3.png)



今回の手順では、Sender ID の設定方法をいくつかみていきましょう。





# Pinpoint で SMS

Pinpoint では、20代、男性、ゲーム好き、といった特定の属性を持つユーザーに、最適なメッセージを届けるためのサービスです。特定の属性を持つユーザーに送りたいときは、キャンペーンという機能を利用します。ただ、今回はテスト用途なので、テストメッセージ機能で SMS の Sender ID 設定方法を確認したいと思います。基本的には、キャンペーンでも同じような設定方法です。

なお、Pinpoint では、日本に SMS を送るときに、Sender ID がサポートされている点が書かれています。

- https://docs.aws.amazon.com/ja_jp/pinpoint/latest/userguide/channels-sms-countries.html



Pinpoint のぺージから、Test messaging メニューを選びます。そして、SMS と送信先電話番号を指定します。

送信したい電話番号が、090-1234-5678 だとすると、`+819012345678` と入力すればよいです。

![image-20220703173020873.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/a7399525-e95b-f32b-21c9-7942a309c1af.png)



そして、メッセージ本文を入れ、Sender ID を指定して、Send message を押します。

![image-20220703173353144.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/7aef9d7a-cb13-6e17-390d-e038c5839c09.png)



すると、このように送信元の表示名を変更して受信することが出来ました。

![image-20220703173716978.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/df2ae73c-0b00-6d8c-859f-883fba53d455.png)





# Pinpoint の OTP で SMS

Pinpoint には、ワンタイムパスワードを生成してくれる機能があります。詳細は割愛しますが、もし自分たちのアプリケーションでワンタイムパスワードを利用する必要性が出てきた場合は、便利に利用できると思います。(認証認可の文脈だと、Cognito だったり他の認証系 SaaS も良い選択肢だと思います)

Pinpoint のワンタイムパスワードは、ざっくり何をしてくれるかというと、指定した携帯電話番号に、SMS でワンタイムパスワードを送ってくれます。また、ユーザーさんから入力してもらったワンタイムパスワードが正しいかを評価してくれます。



Pinpoint の OTP は、AWS CLI や REST API で送信できます。マネージメントコンソール上ではありません。

- OriginationIdentity : ここに文字列を入れることで、Sender ID として認識してくれます。今回は `MyService` と入れてみます。

指定するパラメータ詳細はこちら : https://docs.aws.amazon.com/pinpoint/latest/apireference/apps-application-id-otp.html

```
aws pinpoint send-otp-message --application-id 4d1eda5192f94dde85217c395546718f --send-otp-message-request-parameters '{
   "Channel": "SMS",
   "BrandName": "MyBrand",
   "CodeLength": 5,
   "ValidityPeriod": 20,
   "AllowedAttempts": 5,
   "OriginationIdentity": "MyService",
   "DestinationIdentity": "+819012345678",
   "ReferenceId": "redid01",
   "Language": "ja-JP"
}'
```



すると、携帯電話の SMS に、ワンタイムパスワードが送られてきます。

![image-20220703174514807.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/53c6f313-8093-c5c7-9145-1fd65a8a2949.png)



余談ですが、次のコマンドで、ユーザーから入力してもらったワンタイムパスワードの正当性を確認できます。

```
aws pinpoint verify-otp-message --application-id 4d1eda5192f94dde85217c395546718f --verify-otp-message-request-parameters '{
   "DestinationIdentity": "+819012345678",
   "ReferenceId": "redid01",
   "Otp": "48271"
}'
```



Response の値です。true と返ってきますね。

```
{
    "VerificationResponse": {
        "Valid": true
    }
}
```



なお、同じコマンドをもう一度実行すると、false に変わります。ワンタイムパスワードなので、1回しか使えないわけですね。

```
{
    "VerificationResponse": {
        "Valid": false
    }
}
```



# 余談 : SNS で SMS

Amazon SNS でも Sender ID が利用できそうなのか、確認をしてみたいと思います。

SNS のページで、Publish test message を押します。

![image-20220703175400699.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/bccf78df-d406-15e7-b81f-2085b2d9a3a4.png)



宛先の番号を入力します。

![image-20220703175517196.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/182ce9b6-6925-a107-5281-eaee75553972.png)



Sender ID に `MyCompany03` と指定して、Publish message を押します。

![image-20220703175604843.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/8a368cd5-cb08-e7bc-fefc-a5c2ba830e4a.png)



検証した携帯電話では無事に表示されました。

![image-20220703175729742.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/596162ff-b074-399e-e973-8c9c827f1e84.png)



# まとめ

Sender ID を使った送信元表示の方法を確認しました。Pinpoint と SNS でも、この記事の検証環境だと想定通り表示されました。お手軽に表示名をカスタマイズできるので、まずはこのあたりから利用を開始してもいいかもしれません。より厳密に SMS を届けるためには、ショートコードなどを利用すると、なりすましの脅威軽減にも役にたつので、場合によってはこちらも検討しましょう。



# 参考URL

- Pinpoint で、日本の Sender ID がサポートされている旨がかかれている
  - https://docs.aws.amazon.com/ja_jp/pinpoint/latest/userguide/channels-sms-countries.html