AmazonSNSを利用して社員専用のWebサイトから社用携帯に一斉にSMS送信する機能を実装してみた。

なぜAmazonSNS(SMS)

社内に居ない社員に対してメールのチェック等を促す手段として社用携帯への一斉Push機能を実装する事になった。
専用のスマホアプリを作成すればGoogleGCMAppleAPNs等での通知を検討するのだが一旦はそこまでの工数は掛けない方針となったのでSMSでの通知をすることになった。
ただ今後の拡張性等(GoogleGCM、AppleAPNs等を使うようになるかもしれない)を考えてGoogleGCM、AppleAPNs、SMSでの通知をSNS topicという形(後述する電話帳のようなもの)に抽象化して呼び出し元からは意識しないで実装出来るAmazonSNSでのSMS送信を選択した。

Topicの作成

Topicと言われる一斉通知先の集合体(電話帳のようなもの)をまず作成する。

  1. SNSdashbordにログイン
  2. 「CreateTopic」を選択し新規作成する
    • Display NameがメールやSMSの送信元として表示される
  3. Topic画面から「Create subscription」ボタンを選択することにより個別の送信先を追加する
    • 電話番号が08012345678の場合は+818012345678のように指定する
    • ここにSMS以外の通知方法を混在させることが出来る
    • Topic ARNは後で使うのでメモしておく

送信上限値の変更

デフォルトでは1ドル分以上のSMSが送れない設定になっている。
これに気が付かずに途中から送れなくなりしばらくハマった。
上限引き上げの申請はサポートに連絡することで可能である。申請が通るには一週間位要する。

  1. 申請が通ったら改めてSNSdashbordにログイン
  2. 「Text messaging (SMS)」->「Manage text messaging preferences」を選択
  3. 「Account spend limit」を申請した上限値に引き上げる
  4. ついでに「Default message type」をTransactionalに変更すると送信料金が多少上がるが到達率も上がるらしい。
    • 試してた限りではPromotionalでも問題は無さそうではあったが

AWSアクセスキーの作成

APIを叩くときのキーを作成する

  1. AWSコンソール右上の「アカウント」->「セキュリティ認証情報」を選択
  2. 「アクセスキー」から「新しいアクセスキーの作成」ボタンを押下してアクセスキーを作成する
    • アクセスキーIDとシークレットアクセスキーは後で使うのでメモしておく

aws-sdk-railsを導入

社員用WebサイトはRubyOnRailsで構築されているのでaws-sdk-railsを導入する

  1. $ gem install aws-sdk を実行
  2. gem 'aws-sdk-rails' をGemfileに追記
  3. $ bundle install を実行

環境変数の設定

aws-sdk-railsはシークレットキー等は環境変数を参照してくれるので、それらを実行環境に設定しておく。
設定すべき環境変数は下記。

Key 説明
AWS_ACCESS_KEY_ID アクセスキーID
AWS_SECRET_ACCESS_KEY シークレットアクセスキー
AWS_REGION AWSのリージョン

コーディング

引数msgに渡されてきた文字列を一斉送信するサンプル
リファレンスはこちら

sample.rb
def send_sms(msg)
  sns = Aws::SNS::Client.new()
  arn = 'arn:aws:sns:ap-xxxxxxxxxxxxxxxxxxxx'   # Topicで作成したARN
  res = sns.publish({
    topic_arn: arn,
    message: msg
  })
end