twilio で電話をクラウド化
twilio は米国サンフランシスコの twilio社が提供する、クラウドの電話網サービスです。
日本でも、いわゆる 050 IP電話のサービスを提供している会社がたくさんあります(例えば 050plus の NTTコミュニケーションズ、LaLa Call のオプテージなど)が、twilio も似たようなサービスです。
twilio以外の 050 IP電話サービス系が単純な発着信や(法人契約のプランで)IP-PBX との接続を提供しているのと比べて、twilio では多くのことをクラウド上で行うことができます。極端な話、社内に物理的な PBX を置かなくても基本的な電話網を構築することができます。
多くのことができる反面、とっつきづらさもあって twilio を使ってみようと思ったけど断念した、という方も居ると思います。確かに twilio はとても便利なサービスなんですが、機能が多いこと、それらがまとめられてないこと、頻繁なバージョンアップで使い方が変わってしまうこと、ドキュメントが整備されていないこと(記載が古いことが多い)、使ってるユーザが少なく、ノウハウがあまりない(ウェブで見つかる情報はたいてい仕様が古いか間違ってる)などが考えられます。
そうは言っても大まかにはしょせんが電話です。他者に発信するか、他者から着信するか、そこが基本機能です。発信や着信の間で API を叩いたり、twilio にホストしたアプリ(Studio、Function など)につなぎこむかどうか、というだけです。
2021年現在の twilio について、カンタンに紹介したいと思います。なおサインアップなどは難しくないので割愛します。とりあえず、サインアップして twilio console にログインできる状態にしてください。なお、twilio console は一部日本語化もできるのですが、微妙にしか日本語にならない上に、自動翻訳を使っているのか、英語のままで使いたい単語(例えば自分で設定した名前など)も勝手に日本語に変わってしまってわかりづらいので、英語のまま使います。
twilio では内線電話(仮想IP-PBX)、電話機の管理(SIP)、電話網との接続(PSTN)、IVR(自動音声応答)、SMS の送受信などさまざまな機能がありますが、とりあえず使いたいのは内線電話と電話網との接続だと思いますので、まずはここに焦点を当てていきます。
twilio を 100% 使おうと思うと、日本国内で使える 050番号の取得が必要です。これは必須機能ではないのですが、あると便利なのでとっておきます。050番号の取得方法は解説しているサイトがたくさんあると思うので割愛します。番号の維持に $4.5/月(公式価格)が必要です。番号を取得するには、日本国内のユーザであることを証明するための書類の提出が必要です。この書類の受付に、数営業日が必要ですので、この先の作業を進めるにあたって予め用意しておいたほうが懸命です。
※2022年4月追記
現在、個人向けの 050番号の割当は休止しているようです。050番号を使用するには法人である必要があり、書類の提出が必要です。電話番号が特殊詐欺などで使われることを防止するための犯罪収益移転防止法に準拠するための処置です。
いまは法人の設立自体は誰でもカンタンに行えるので、税務処理などを行えるのであれば 050番号の運用のために法人を作って、その法人名義で取得することも考えられます。(法人の設立と維持にある程度のコストが掛かってきますので使い込まないと他社サービスを使う場合と比べて割高になります)
他社のサービスになりますが、いままで個人でも気軽に登録して使えていた楽天モバイル(旧フュージョンコミュニケーションズ)の SMARTalk やオプテージの LaLa Call の個人向け新規登録が休止しているのも、同法への準拠が容易ではないためと推測されます。
追記ここまで
もっとコストを抑えてテストしたい場合などは、米国の番号を使うこともできます。こちらは番号の維持が $1.5/月(公式価格)と安い上に、日本の 050番号より高度なこと(SMS の送受信など)ができます。ただし、この番号へ発信するには国際通話が必要となるため、テストのための通話料を考えると上記050番号を取得しておいたほうがトータルではコストを抑えられると思います。発信に関しては、受け取る側の電話に国際電話番号(+1 から始まる米国の番号)が表示されます。
twilio にサインアップして、まずは電話機をセットアップしようと思ったときに目につくのが、Elastic SIP Trunk というサービスです。サービス名に SIP と入っているので、たしかに SIP を使ったサービスであることに間違いはないのですが、Elastic SIP Trunk は既存の(構築済みの)IP-PBX との接続を行うためのサービスです。
新たに仮想IP-PBX を構築する場合や、スマホにインストールした SIPアプリとの接続をする場合は、Programmable Voice を使います。
twilio では独自の用語がたくさん出てきます。直感的にわかりにくい名前になってることが多く、これが関門と言えます。ドキュメントの中に、どういう機能なのか書かれているので読み解いていく必要があります。
Programmable Voice では発信(twilio で管理している SIP端末から、PSTN網へ抜ける向き)と、着信(PSTN網から SIP端末へ)とで異なるルートを通りますので異なる設定が必要です。
着信の場合は、050番号に紐づけてしまうのがカンタンです。各050番号ごとに、呼び出す API(Webhookなど)を指定できます。サーバレスで構築したい場合は、twilio がホストするミニアプリ(Studio、TwiML Bin、Funcion)を使うこともできます。Studio は非プログラマー向けに GUI で組み立てるアプリ、TwiML Bin は XML風のスクリプトを使ったアプリ、Function は JavaScript を使ったプログラミングを使ったアプリで、できることはほぼ同じです。Studio や TwiML Bin では高度なことをやろうと思うと大変なので、JavaScript が書けるなら Function がオススメです。
呼び出す API の設定は、各 Phone Number の A CALL COMES IN で設定します。
発信の場合は異なるルートから設定します。発信元は SIP 端末(VoIP電話機、スマホのアプリなど)になると思いますが、この発信元は Programmable SIP Domain に紐付けられます。Programmable SIP Domain ではユニークな SIPドメイン名(以下、SIPドメイン。[ユーザが任意に作成].sip.twilio.com)が使われます。この各SIPドメインごとに、呼び出す API(Webhookなど)を指定します。あとは着信の場合と同じです。
つまり、呼がどこから入ってくるか(着信 = PSTN網から、発信 = SIP から)で呼び出す API が違っていると考えればわかりやすいと思います。
なお、内線電話の場合は SIP から SIP という流れになりますので、発信は Programable SIP Domain の A CALL COMES IN の API呼び出しになります。着信は直接、SIP URI へつなぐので API は関与しません。(もちろん、設定すれば関与させることもできます)
まずは、SIP端末の登録、SIP端末から PSTN網へ(発信)、PSTN網から SIP端末へ(着信)を行ってみます。
SIP端末の登録
SIP端末は登録しなくても発信可能ですが、そのままだと発信するだけで着信ができないので、SIPサーバに登録しておいて発信着信の双方を取り扱ってしまうのが一般的です。SIP端末の登録を、SIP Registration と言います。SIP Registration にはユーザ名とパスワードを使った認証を使います。ユーザ名とパスワードの組み合わせを、Credential と呼びます。複数の Credentials をまとめたものを Credential List と呼び、Credential List を紐付けて Credential を使って SIP端末に登録する行為を、SIP Registration Authentication と呼びます。
手順としては、
1. Prorammable Voice SIP Domain を作成する
2. ユーザとして Credential を作成する
3. SIP Domain に Credential(の含まれる List)を紐付けて、SIP Registration を設定する
4. SIP端末から、SIP REGISTER する
という流れになります。1~3 は twilio console で作業します。
なお、twilio で使う SIP Domain は全世界でユニークなものであり、先着順に好きな文字列を使うことができます。たとえば、test (test.sip.twilio.com)といった文字列はすでに他者に取られているので使うことができません。
どうしても、test で使いたい場合は、サブドメイン名として設定できますので、まずはプライマリーにユニークなドメイン名をとってしまいましょう。(test.sip.twilio.com は他者に取られていて使えないが、hogehoge.sip.twilio.com を取ってしまえば、test.hogehoge.sip.twilio.com も使える)
この SIP Domain は技術的には隠す必要のない文字列ですが、これを知られてしまうと他者から攻撃を受ける可能性があります。他人から推測されにくい文字列を使うことで、ある程度防御することができます。(SIP の仕組み上、ここを完全に秘匿とすることができない)
まずは、ユーザ認証用の設定を行います。twilio console にログインし、Programmable Voice、SIP Domains、Credential Lists と進みます。
リストの左上にある「+」をクリックして新しい Credential List を追加します。
Friendly Name は覚えやすい文字列を入れておきます。
一つの Credential List には複数の Credentials を入れることができます。最初の一つは、作成時に追加します。
Username と Password は、後ほど SIPクライアントで使います。Username に関しては英数字で作ることができるのですが、後々、番号計画を作っていく中で、Username と内線番号の紐付けが必要になってきます。Username = 内線番号をしておくことで、この紐付けを省略してしまおうと考えます。
なおパスワードは、大文字小文字数字が 1文字以上含まれる、12文字以上の文字列が必要です。これを他人に知られると無断で使われてしまうのでかならず秘匿してください。
「Save」 をクリックすると Credential List が作られ、1つ目の Credential が追加されます。
後々のテストのために、2つ目の Credential も追加しておきます。Credential List の左上の「+」をクリックして、Username として 3002 を追加しておきます。
「Save」をクリックして設定を保存します。
次に、SIP Domain を追加します。
Programmabale Voice、SIP Domains、Domains と進みます。ドメインの一覧の左上の「+」をクリックして新しい SIP Domain を追加します。
FRIENDLY NAME は自分が覚えやすい名前ならなんでも使えます。
SIP URI はこれから使うドメイン名になります。入力して、Available と表示されれば使えます。これは特別秘匿する必要はないものの、あまり外部へ積極的に公開したいものではありません。(ブルートフォース攻撃の対象となる可能性があるため)
先ほど、Credential で作成した Username と組み合わせ、今回の例だと 3001@fugafuga.sip.twilio.com が SIP URI となり、発着信の際の発信元、宛先のアドレス(SIP界の電話番号)になります。
極端な話、この SIP URI さえ知っている相手なら、IP-PBX を使わなくても、直接通話することができます。(相手が匿名の相手との通話を許可している場合)
発信元に関しては自己申告なので、テキトーなアドレスでも使えてしまいます。
このあたりは、電子メイルに似た考え方だと考えて良いでしょう。
内線番号との紐付けが面倒になりますが、Credential で Username に英文字列を使った場合(例えば、hoge にします)、SIP URI は hoge@fugafuga.sip.twilio.com となり、電話機の操作だけで接続するのが困難になります。この場合は、IP-PBX(もちろん、twilio でも)の中で、3001@fugafuga.sip.twilio.com 宛の通話を、hoge@fugafuga.sip.twilio.com 宛に転送することで番号を使っての通話に対応させます。(もちろん、電話帳機能を使う、ソフトフォンなど、英文字での入力が容易な環境であれば英文字のままの SIP URI でも通話可能です)
Voice Authentication はこの SIP Domain への直接通話を許可する IPアドレスか、ユーザを指定します。IPアドレスだけ、ユーザだけ、IPアドレスとユーザの組み合わせ、のいずれかが使えます。すべての受け入れ OK という設定はできません。(ここで許可した IPアドレス、もしくはユーザは、SIP URI さえ知っていれば通話をリクエストすること(SIP INVITE を送る)ができます)
SIP Registration が DISABLED になっているので、ENABLED に変更します。
CREDENTIAL LISTS に先ほど作成しておいた、Credential List を追加します。複数、追加することができます。
「Save」をクリックして設定を保存します。
ここまでの設定作業で、SIPクライアント(VoIP電話機、SIPアプリなど)から接続する準備ができました。接続例として、Androidアプリの GS Wave と、Windows用ソフトの MicroSIP での設定の様子をご紹介します。もちろん、他の SIPアプリ、SIPソフトでも使えます。相性などがあって、ダメな場合もありますが、GS Wave と MicroSIP はとても安定して使えるのでオススメです。
Android用アプリ、GS Wave の設定方法
※一般的に GS Wave と呼ばれているアプリですが、アプリストア上での名称は Grandstream Wave Lite - Video という名称になっています。インストール後のアイコンなどは、GS Wave になります。
GS Wave をインストールしたら、Settings、Account Settings へ進んでください。右上の「+」をタップします。
SIP Account をタップします。
Add New Account という画面が表示されるので必要な情報を入れていきます。
SIP Server の欄には、さきほど作った SIP URI のドメイン名部分を入れるのですが、一部、変更する必要があります。
SIP URI のドメイン名が、fugafuga.sip.twilio.com だった場合、入力するサーバ名は、fugafuga.sip.tokyo.twilio.com:5061 となります。twilio.com の前に、.tokyo を追加、末尾に :5061 (コロン5061)を追加します。
この、sip.tokyo.twilio.com というのはエッヂロケーションサーバー名と呼ばれ、各地域ごとに用意されています。
末尾の 5061 は、SIP プロトコルでやりとりする中で、TLS という暗号化通信を使うために仕掛けです。(twilio の仕様で、TLS を使う場合は 5061 を使うように指定されています)
SIPプロトコルではデフォルトで、トランスポート層に UDP を使います。この場合は 5060 を指定するのですが、パケット解析などのデバッグ以外に UDP を使うメリットもないので、TLS を使うようにします。
SIP User ID には先ほど Credential で作ったユーザ名を入れます。
Password は Credential でユーザを作った際に入れたパスワードです。
必要な情報をすべて入れたあとは、このような状態になってると思います。SIP Server については、自身で作られた SIP URI によって文字列が異なります。
すべて入れ終わったら、右上の「✓」をタップして反映、左上の「<」をタップして戻ります。
一覧に、いま作った「3001」が追加されていると思いますのでタップして、追加の設定を入れていきます。
SIP SETTINGS という項目の中の、Transmission Protorol をタップしてください。
TLS を選択し、左上の「<」で戻ります。
NETWORK SETTINGS の中の、NAT Traversal をタップします。
STUN を選択します。
左上の「<」を 3回タップして Settings まで戻ります。
Advanced Settings をタップします。
NETWORK SETTINGS の中の STUN Server Settings をタップします。
stun.l.google.com:19302 を入力して「OK」をタップします。
Account Settings で一覧を見ると、いま追加した「3001」の右のマークがグリーンになっていれば登録できています。
ここがレッドの場合はなんらかの理由で登録できていません。この場合の対処方法は、別の項目でご紹介しますが、とりあえずは設定を一通り見直してください。
追加:
追加で推奨の設定があります。こちらもご覧ください。
twilio に SIPクライアントを追加するときの注意(特にスマホ)
Windows用ソフト、MicroSIP の設定方法
MicroSIP をインストールしたら、ウィンドウの右上の ▼マークをクリック、アカウントの追加をクリックします。
SIPサーバには SIP Domain で作った SIP URI のドメイン名部分を入れるのですが、一部、変更する必要があります。
SIP URI のドメイン名が、fugafuga.sip.twilio.com だった場合、入力するサーバ名は、fugafuga.sip.tokyo.twilio.com:5061 となります。twilio.com の前に、.tokyo を追加、末尾に :5061 (コロン5061)を追加します。
詳しい説明は GS Wave の設定をご覧ください。
ユーザ名に Credential で作ったユーザ名、パスワードにパスワードを入力します。
ドメインは、SIP URI のドメイン名をエッヂサーバに変えたものを入力します。SIP URI のドメイン名が fugafuga.sip.twilio.com だった場合、fugafuga.sip.tokyo.twilio.com となります。(:5061 は追加しません)
トランスポートを TLS に変更します。
「保存」をクリックします。
左下のステータス欄がオンラインになれば接続できています。
twilio console でレジスト状況を確認
twilio console にログイン、Programmable Voice、SIP Domains、該当の SIP Domain を選択します。
Registered SIP Endpoints というタブを選択します。
ここにユーザ名を入れて「Search」をクリックすると、登録済みのクライアントが表示されます。(複数拠点から同時にログインすることもできるので、複数が表示される可能性もあります)
3001 は GS Wave で使ったユーザです。USER AGENT に Grandstream Wave と表示されていることがわかります。
CONTACT というのがこのユーザの SIP URI(SIP界における電話番号、メイルアドレスのようなもの)になります。最後に、transport=tls と付いているので、TLS を使った暗号接続であることがわかります。
3002 もみてみます。こちらは USER AGENT が MicroSIP になっています。
お疲れさまでした。この 2つのユーザは今後の解説でも使っていきます。
次回は、登録した SIPユーザから、PSTN網(ふつうの電話)へ発信するまでを紹介します。
目次
twilio で電話をクラウド化 (この記事)
twilio に SIPクライアントを追加するときの注意(特にスマホ)
クラウドPBX、twilio を VoIPフォンで使う(Panasonic KX-UT248)