TwilioとPythonで夜中でも必ず起こす電話アラートを30分で実装した話

# はじめに
皆さんは障害のアラートが来たときにどのように対処していますか？
一般的な企業ですと電話発信によるアラートが行われていることが多いと思いますが、我々のような弱小企業ですとなかなか電話のアラートを実現するのは難しいという問題があります。
この記事では電話アラートをTwilioを使ってサクッと実現できた話を書いていきます。

[Twilio](https://www.twilio.com/ja/) は電話番号を発行して(PSTN網経由で)電話をかけたり、プログラムかからSMSを送ったりといった電話関連の操作を行うことができます
この記事ではTwilioの電話機能を活用して、自システムの障害発生時に私の電話番号に電話をかけて夜中でも着信音を鳴らし無理やり起こしアラート対応させる仕組みを実装しました。


ちなみに、電話アラートはいろいろな手段で実現可能ですのでが、一応いくつか例を書いておきます
- VoIPを使ったPush通知を持つアプリを作成し、着信音を鳴らす
- アラート通知サービスを使用し(PSTN網経由で)電話をかけ着信音を鳴らす
- SIPクライアントをインストールしSIP経由で発信を行い着信音を鳴らす(仕組み上はVoIP Pushと同等)
- Twilio等の公衆電話網(PSTN)へ送出可能なサービスを使用し電話を掛け着信音を鳴らす。

今回はその中でも一番下のTwilioを使った手法を紹介していきます。

# やったことのまとめ
- Twilioのアカウント発行
    - 個人でアカウントを作成する場合は、Twilioでアカウントの確認作業などが発生する場合があります
- Twilioを使ってアメリカの電話番号を発行
    - アメリカの電話番号はすぐに発行可能です
- Pythonの数行のコードを書いて自身の電話番号に発信する
    - 10行くらいのPythonのコードで実現できてしまいます

# 実現までの流れ
## Twilioアカウントの作成
当然のことながらまずはTwilioのアカウントの作成が必要です。
アカウントの作成のフローは省略しますが、こちらのドキュメントが参考になるかと思います

> 新規登録ですぐ使える！Twilioのクラウド電話機能&SMS API
> https://cloudapi.kddi-web.com/magazine/other/voice-and-sms-that-can-be-used-immediately-by-new-registration

アカウントを発行すると、2000円分のトライアル用のデポジットがもらえます

なお、Twilioは法人や個人事業主の使用を想定しています。個人の場合は現在何かしらのサービスを運用していたり、これからビジネスを始める予定がある方である必要があるかと思います
私は個人でアカウントを作成しましたが、作成後にTwilioの用途をメールで聞かれました。実際私はTwilioをビジネスで活かそうとしていますので、PoCをしていますと答えて使用許可をいただきました。


## 電話番号の発行
ここではアメリカの番号を発行します。ワンクリックで番号が発行できてしまいます。
ダッシュボード画面で `Get a Trial Number` をクリックするだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707111/a4d271a9-0405-f175-6de3-0a1fcd939c1b.png)
クリックすると `+1 xxx xxx xxxx`のようなアメリカの電話番号が取得できたかと思います。これで番号発行は終わりです。あとは電話をかけるだけです
アメリカの電話番号の維持費は2022/12/21現在では￥165円/月となっていました。それとは別に通話を行う度に課金がされますが、通話に出なければ課金されることはありません。

なお日本国内の番号 `050-xxxx-xxxx` や `03-xxxx-xxxx` を取得したいと思うかもしれませんが、取得には審査が必要ですのでご注意を。アメリカの番号であれば即時発行できますので今回はアメリカの番号を使用しています。

## 電話をかけてみる
早速電話をかけてみましょう。今回は`Python`経由で電話をかけてみます。公式ドキュメントは[こちら](https://www.twilio.com/ja/docs/voice/make-calls)

注意として、トライアル版では本人認証（電話番号認証）の際に使用した電話番号にしか電話をかけることができません。もし自由に電話をかけたい場合は課金(最低2000円)をしてアカウントのアップグレードが必要となります。
また、着信端末では留守電サービスをOFFに設定しておくことをおすすめします。発信が留守番電話サービスに移行してしまうとアメリカから日本への通話課金(約100円)が発生してしまうため、すぐにデポジットを消費してしまう可能性があります。(通話が開始されなければ課金されることはありません)。

### アカウントの認証情報を取得
[コンソール画面](https://console.twilio.com/)の下部にAccount Infoパネルがあります。こちらにSIDやAuthToken、取得した電話番号が記載されています、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707111/09e0d5e0-0db3-c36f-7111-34ad33ccbc4c.png)
これらはPythonプログラム内の認証情報として使用します

### Pythonのライブラリの導入
PythonからTwilioに電話をかけるには [twilio](https://pypi.org/project/twilio/)ライブラリが必要となります。事前に `pip install`しておきます
```
$ pip3 install twilio
```

### プログラムの実行
Pythonで以下のプログラムを実装し実行してみましょう
```
import os
from twilio.rest import Client

account_sid = 'ここにSID'
auth_token = 'ここにAuth Token'
phone_number = '+1xxxxxxxxxx'   # Twilioで取得した電話番号
target_number= '+8190xxxxxxxx'  # ここに発信先の電話番号(090-xxxx-xxxxの場合は+8190xxxxxxxxとなる)。トライアルの場合はアカウント認証に使用した電話番号にしかかけられないので注意

client = Client(account_sid, auth_token)

## 発信を開始する
call = client.calls.create(url='http://demo.twilio.com/docs/voice.xml', to=target_number, from_=phone_number)

# 発信から30秒後に通話をキャンセルしたい場合は以下を実行。通話キャンセルを実行しなかった場合でも約1分で発信が自動キャンセルされます
# sleep(30)
# call.update(status='completed')
```

上記コードを実行すると無事自分の端末に着信が来たと思います。これで電話アラートの実装は終わりです！非常に簡単ですね。
この通話に出てもTwilioの方にCallbackなどを実装していないためなにも起きません。アメリカから日本への課金もされてしまうことですし通話には出ないようにしましょう。

## 実際にシステムに組み込み電話アラートを実現！
あとはシステムの障害発生時に上記のPythonコードを実行して発信を行うだけです。
これを応用すれば複数人での発信のローテーションなども実現できるかと思います。(ローテーションを止める仕組みなどの実装が必要ですが)


# おわりに
以上のようにTwilioを使うことで簡単に公衆電話網を経由して発信を行うことができました。
今回は電話アラートのような仕組みを実装しましたが、他にもいろいろな活用方法があるかと思います。
皆様もTwilioを使用して電話を組み合わせたサービスの実現にトライしてみてはいかがでしょうか。