■始めに
初めまして。下屋敷と申します。
ニフティ株式会社に中途入社して5年目になります。
弊社では今AWSのサービスを次々と取り入れてシステム開発をしています。
ニフティでは回線接続サービスを提供していますが、私が担当しているシステムで回線申込時に特定オプションを申し込んだお客様に対して使用可になった際にSMS通知をしたいという要望があったため、Amazon SNSのSMSを用いて対象者へのSMS送信を導入、実装した話をお伝えしようと思います。
単にSMS送信をしたいだけなのですが、ネット検索をしてみてもトピック機能などの記事に寄ってしまっていたり、後述するサポート申請に関する記述が無かったりと、意外とそういった記事が無かったというのも書いてみようと思った理由です。
■前提として
- オプションが使用可になった申込ユーザに対しては、ECSクラスターのタスクスケジューリングにて定期バッチ起動をして対象者へのSMS送信をします
- 特定オプションの申込は月500件想定なので、SMSを500件/月送信する予定です
■AWSコンソール上からSMS送信を試してみる
テスト送信してみます
- ログイン後Amazon SNS(SMS)サービスへ移動
- デフォルトはサンドボックス内になっている(詳細は後述)と思うので、先に電話番号を登録して認証します。※登録に関する手順詳細は割愛
- ちなみに検証してみたところ「+810X0」形式でも「+81X0」形式でも送信できるみたいです。(boto3経由でも同様でした賢い!)
- 電話番号認証完了したら「テキストメッセージの発行」から発行してみます
- 既に登録された電話番号が送信先選択できるので選択して「送信者ID」も指定
- 届きました!
- ちなみに送信者ID指定しないと「NOTICE」として送信されます
これで送信テストできました!
■Amazon SNS(SMS) を用いたメッセージ送信のソース(Python)
awsコンソール上からのSMS送信は確認できました。
バッチからAmazon SNS(SMS)を呼び出して送信をしたいので、実装方法を確認します。
- boto3のpublishを用いると送信が可能です(機能詳細)
- boto3は実行環境にpip installしておきましょう
- 事前にAWSコンソール上のIAMよりIAMユーザーを作成し、AmazonSNSFullAccess のアクセス許可を設定しておきます。その際に生成された アクセスキーID と シークレットアクセスキー を控えておきます
サンプルソース(Python)
単にSMS送信を実行するだけなら以下のソースで行けるはずです。
実際は複数の電話番号にお送りすることになると思うので、対象の電話番号分client.publishをループする形になるかと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import boto3 client = boto3.client( 'sns', aws_access_key_id='[アクセスキーID]', aws_secret_access_key='[シークレットアクセスキー]', region_name='[リージョン]' ) res = client.publish( PhoneNumber='[電話番号]', Message='[送信するメッセージ本文]', MessageAttributes={ 'AWS.SNS.SMS.SenderID': { 'DataType': 'String', 'StringValue': '[送信者ID]' } } ) |
こちらのソースでも同じように送信できました!
ですが、色々実装・確認をしながらマニュアル等を確認していたところ、後述の制限などがあることが分かったので、
その制限を確認しつつサポートへの申請をしています。
次はそちらを確認していきます。
■Amazon SNS(SMS) を利用するにあたっての注意
単に特定の電話番号にSMSメッセージ送信をしたかっただけなのですが、実装導入するにあたり、何点か気を付けなければいけないことがありました。
デフォルトの状態ですと、以下の制約があります。
- アカウントの毎月毎のSMSの使用料上限が決まっている。デフォルトは$1.00 USD (https://docs.amazonaws.cn/en_us/sns/latest/dg/sms_preferences.html)
- デフォルトはAmazon SNS サンドボックス内にあるので、SMS内で認証した電話番号(最大10件)以外に送ろうとする場合はアカウントをサンドボックス外に移動申請する必要がある(https://docs.aws.amazon.com/ja_jp/sns/latest/dg/sns-sms-sandbox.html)
こちらの制約について確認します。
アカウントのSMSメッセージングの使用料上限について
▼日本国内でのコストと上限
執筆時点での日本国内でSMSメッセージを送信しようとしたときのコストは $0.07451 です。
デフォルトの上限は$1.00 USDとのことでした。これは1か月ごとの上限のようです。
アカウントの請求ダッシュボードを参照した際に「Amazon Simple Notification Service APN1-SMS-Price-ROW」が1.00 USDに到達していると、SMS送信不可となります
▼どのくらいのコストがかかるか試算してみる
SMS 使用クォータの計算式 大体要約すると以下のような計算式になります。
1 2 |
(1日のメッセージ送信量 × 30日【1か月】) × $0.07451 USD × 【メッセージが長文になって分 割される想定の時何パート分割されるか】 = 1か月の使用量 |
- デフォルトですと、日本国内では短いメッセージでも大体13件くらいまでしか送信できない想定です
- 余談ですが、日本の大手通信キャリアのSMSの文字上限は1メッセージは670文字(全角)くらいのようなので動作検証は必ず必要ですが、大体のメッセージは1パートで送れる想定です
1か月送信件数 | SMS金額 | パート | * | コスト | 判定 |
500 | $0.07451 | 1 | $37.2550 | × | |
100 | $0.07451 | 1 | $7.45100 | × | |
50 | $0.07451 | 1 | $3.72550 | × | |
14 | $0.07451 | 1 | $1.04314 | × | |
13 | $0.07451 | 1 | $0.96863 | 〇 | |
12 | $0.07451 | 1 | $0.89412 | 〇 | |
… | |||||
2 | $0.07451 | 1 | $0.14902 | 〇 | |
1 | $0.07451 | 1 | $0.07451 | 〇 |
今回はさほど長文を送るわけではないので、1パートのみのメッセージを想定して試算すると…
月500件くらい送る想定 × $0.07451 × 1パート = $37.255
▼確認結果
$37 USDと試算が出ました。切り上げて$38とし、こちらを上限として申請しないとダメそうです。
申請後はAWSコンソール上で自分で上限値を上げる必要があるとのこと。
SMS サンドボックス
▼何でサンドボックスがあるの?
過去はSMSのサンドボックス機能は実装されていなかったようです。
ここ最近は新規でアカウント作成するとサンドボックス状態になっています。
サンドボックスは個人的な見解ですが、こういった意図があるのかなと思っています。
- 最初から不特定多数にSMS送信できる仕組みはサービスとして良くない
- 最初のうちは本当に送りたい先を登録&認証してその送信先にSMSを送って内容を検証すべき
- 一旦遊び場(試験場)のような場所を設けておいて、検証できたらそのサービスを公開(サンドボックスからの移動)することで安全を保障する
▼サンドボックス内の機能制限
デフォルトはこのような表記になっていると思います。
サンドボックス内でも大体機能は使えますが以下制限があるようです。
- SMS メッセージは、認証済みの送信先電話番号にのみ送信できます。
- 最大 10 個の認証済みの送信先電話番号を持つことができます。
- 送信先の電話番号を削除できるのは、認証または最後の認証の試行から 24 時間以上経過後に限られます。
▼そのままサンドボックス内で要件を満たせるか?
送り先が完全に決まっていて定期送信するような用途でしたらそのままでも良さそうですが、今回はオプション申込されたユーザそれぞれにSMSメッセージお送りしなければいけないので、そのままでは良くなさそうです。
- 毎度毎度バッチ実行の度に、電話番号登録 → 認証するのは流石にNG(お客様に認証をしていただく手段が無い)
- しかも認証できたとしても最大10個までしか登録できない
- 一度登録した電話番号は認証してから24時間以上経たないと削除できない
▼確認結果
サンドボックス内での利用では要件を満たせません。
というわけでAWSサポートに連絡して上記の撤廃申請を出すことにしました。
■AWSサポートへの申請
デフォルトのままですと、制限により実装機能を満たす使い方ができないということが分かったので、AWSサポートへの申請を出します。
サポートページからの申請
- ログイン後 サポートページ へ
- Service limit increaseを選択
- 【Case details】 Limit type:SNS Text Messagingを選択し、optionalはどういう用途で制限を撤廃したいのかを記載
- 【Requests】 「SMSアカウント使用量のしきい値の増加」、「アカウントのサンドボックス外への移動」が目的なのでRequestsからそれぞれ追加
- 【Case description】どういう用途・目的で申請を出しているのかを記載
記述内容が不明だったり、情報不備などあればサポートから返信されるので、とりあえず自分がやりたいことを記載してみて申請を出してみるといいと思います。
大体数日以内にはサポートからお返事いただけると思います。(結構早かった)
申請が通るとこのような感じでサポートからお返事を頂けました。
申請通ったのでアカウント情報確認
申請が通ったので変更されているはずです。確認します。
- 1USD → 38USD
- AmazonSNSサンドボックスから移動
▼アカウントのSMSメッセージングの使用料上限
- 「テキストメッセージングの優先設定」より「アカウントの使用制限」が設定したい上限値になっているか確認(変更されていました)
- 設定したい上限値になっていなければ変更
▼SMS サンドボックス
- ステータスが変わりました これでSMS メッセージを任意の電話番号に送信できるようになりました
- 「サンドボックスの送信先電話番号」の項目は消えます
- 変更前はこちらでした
■まとめ
これでAmazon SNS(SMS)を活用できるようになりました。
成功、失敗等をもっと詳細に知る必要がある場合は、cloud watch logsに出力する必要がありますが、
今回は簡易的な実装なのでここまでとなります。
AWSの技術、UIは移り変わりが激しいので、ここで共有させていただいた内容も数か月後、数年後には古くなっている可能性がありますが、誰かのお役に立てれば幸いです!