こんにちは。インフラエンジニアのTYです。普段はAWS,GCPなどのクラウドを扱ったサービスの検証・開発を行っています。
実は以前「Asterisk入門~SIPフォンで通話してみる~」というブログを書かせていただきました。今回はAsteriskの別の機能についてお話ししたいと思います。
1. 概要
AsteriskはオープンソースのPBXです。PBXとは”Private Branch Exchange”の略で日本では”電話交換機”と訳すのが一般的です。1つの親番号に着信した通話をコールセンターやオフィス内線の様に適切な端末に振り分けます。
そんなPBXであるAsteriskですが、PSTNやSIPでの通話もちろんWebRTCでの通話も可能です。
Asteriskの情報は思っているよりも少なく、自分で構築した際にはWebRTCで通話できるようにするだけでも少し苦労しました。本記事では、私自身の備忘録もかねてAsteriskでWebRTC通話ができるようにしてみたいと思います。
2. 構築
AWS EC2インスタンスにUbuntuをセットアップし、そこにAsterisk,WebRTC通話で利用するブラウザアプリをインストールして構築していきます。
2.1 EC2
EC2インスタンスにUbuntuをセットアップし起動します。インスタンスタイプは小さいもので問題ないです。
2.1.1 セキュリティグループ
セキュリティグループは以下のようにします。
※アクセスするIPが制限できる場合は制限しましょう。
2.2 Asterisk導入
2.2.1 Asteriskインストール
EC2にsshでログインし、Asteriskを導入します。
まずはシステムが更新されているか確認してください。
shell-session
$ sudo apt-get update
Asteriskをインストールします。
shell-session
$ cd ~
$ wget <http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-18-current.tar.gz>
$ tar -xvf asterisk-18[tab]
$ cd asterisk-18.[tab]
$ sudo su
# contrib/scripts/install_prereq install
# ./configure --with-pjproject-bundled
# make menuselect
# make && make install && make config
# exit
$ cd ~
次にAsteriskの設定ファイルをインストールします。
shell-session
$ git clone <https://github.com/InnovateAsterisk/S2E2.git>
$ sudo cp ~/S2E2/config/* /etc/asterisk
2.2.2 Asterisk設定(http.conf
)
AsteriskでWebRTC通話を行うにはAsteriskのhttpサーバー機能を有効化します。/etc/asterisk/http.conf
を以下の様に変更します。
shell-session
$ sudo vim /etc/asterisk/http.conf
[general]
enabled=yes ; HTTP
bindaddr=127.0.0.1
bindport=8080
tlsenable=no ; HTTPS
enablestatic=no
Asteriskを再起動します。
shell-session
$ sudo service asterisk restart
2.3 apacheインストールと構成
WebRTC通話で利用するブラウザアプリを用意します。今回はブラウザアプリもAsteriskと同じサーバーに配置します。
まずはapacheをインストールし設定します。
shell-session
$ cd ~
$ sudo su -
# apt-get install apache2
# a2enmod ssl
# a2enmod proxy
# a2enmod proxy_http
# a2enmod proxy_wstunnel
必要なポートを開放します。
shell-session
# vim /etc/apache2/ports.conf
Listen 0.0.0.0:80
Listen 0.0.0.0:443
Listen 0.0.0.0:4443
Webアプリで利用する設定を行います。この時にDNSサーバーにAsteriskサーバーのIPアドレス指すエントリファイルを作成する必要があります。DNSサーバーは何でもいいですが、AWSだとroute53を利用できます。
shell-session
# vim /etc/apache2/sites-enabled/000-default.conf
<VirtualHost 0.0.0.0:80>
ServerName <Asteriskサーバーのドメイン>
DocumentRoot /var/www/html
</VirtualHost>
apacheを再起動します。
shell-session
# service apache2 restart
snapとcertbotをインストールし、証明書を発行します。
shell-session
# snap install --classic certbot
# ln -s /snap/bin/certbot /usr/bin/certbot
# certbot --apache
certbotが完了すると、新しい設定ファイルが作成されるので、それを開いてws/
ホストを追加します。
shell-session
# vim /etc/apache2/sites-enabled/000-default-le-ssl.conf
<VirtualHost 0.0.0.0:4443>
ServerName __copy_from_above__
DocumentRoot /var/www/html
SSLCertificateFile __copy_from_above__
SSLCertificateKeyFile __copy_from_above__
Include /etc/letsencrypt/options-ssl-apache.conf
ProxyRequests off
ProxyPreserveHost On
ProxyPass /ws ws://127.0.0.1:8080/ws
ProxyPassReverse /ws ws://127.0.0.1:8080/ws
</VirtualHost>
apacheの設定はこれでOKなのでapacheを再起動し、設定を反映します。
shell-session
# service apache2 restart
# exit
$ cd ~
2.4 ブラウザアプリインストール
WebRTC通話で利用するブラウザアプリをインストールし、ドキュメントルートに配置します。
shell-session
$ git clone <https://github.com/InnovateAsterisk/Browser-Phone.git>
$ sudo cp -r Browser-Phone/Phone/* /var/www/html/
2.5 Asteriskユーザー設定(pjsip.conf/extensions.conf
)
ここまでで利用するWebRTCアプリの設定が完了しました。最後にAsteriskサーバーの設定を行います。
まずはpjsip.conf
でWebRTCで利用するユーザーを作成します。/etc/asterisk/pjsip.conf
を編集します。githubから設定ファイルをインストールしているためそこに以下を追記します。
このconfファイルでAsteriskで使用するユーザーを定義します。
※パスワードはお好きな文字列に変更してください。
shell-session
$ sudo vim /etc/asterisk/pjsip.conf
; == Users
[User1](basic_endpoint,webrtc_endpoint)
type=endpoint
callerid="One Hundred" <100>
auth=User1
aors=User1
[User1](single_aor)
type=aor
mailboxes=User1@default
[User1](userpass_auth)
type=auth
username=User1
password=1234
[User2](basic_endpoint,webrtc_endpoint)
type=endpoint
callerid="Two Hundred" <200>
auth=User2
aors=User2
[User2](single_aor)
type=aor
[User2](userpass_auth)
type=auth
username=User2
password=1234
[User3](basic_endpoint,webrtc_endpoint)
type=endpoint
callerid="Three Hundred" <300>
auth=User3
aors=User3
[User3](single_aor)
type=aor
[User3](userpass_auth)
type=auth
username=User3
password=1234
次に/etc/asterisk/extensions.conf
を編集します。こちらもgithubからインストールしているため以下を追記してください。
このconfファイルでダイヤル番号とユーザー紐づけます。
shell-session
$ sudo vim /etc/asterisk/extensions.conf
[subscriptions]
exten => 100,hint,PJSIP/User1
exten => 200,hint,PJSIP/User2
exten => 300,hint,PJSIP/User3
[from-extensions]
exten => 100,1,Dial(PJSIP/User1,30)
exten => 200,1,Dial(PJSIP/User2,30)
exten => 300,1,Dial(PJSIP/User3,30)
exten => _[*0-9].,1,NoOp(Music On Hold)
exten => _[*0-9].,n,Ringing()
exten => _[*0-9].,n,Wait(2)
exten => _[*0-9].,n,Answer()
exten => _[*0-9].,n,Wait(1)
exten => _[*0-9].,n,MusicOnHold()
exten => e,1,Hangup()
ここまでで設定出来たらAsteriskを再起動します。
shell-session
$ sudo service asterisk restart
ここまででAsteriskサーバーおよびWebRTCアプリの構築は完了です。実際に動作を確認してみましょう。
3.動作確認
動作確認のためWebRTCアプリに接続します。Chromeで以下のURLにアクセスします。
shell-session
https://<Asteriskサーバーのドメイン>
アクセスすると以下のようなサイトが表示されます。
アカウントをクリックし、Asteriskサーバーに登録します。赤枠内にはAsteriskサーバーのドメインを入力します。パスワードにはpjsip.conf
で設定した値を入力します。
そのほかはデフォルトのままで保存します。
シークレットウィンドウや別ブラウザなどでもう一つWebRTCアプリを表示し、そちらは別のアカウントで登録します。本記事の内容だとUser2 or User3があるはずです。
アカウントが2つ登録出来たらどちらかのアカウントから発信してみましょう。右上の電話マークをクリックし発信先にダイヤルします。ダイヤル番号はUser1なら100、User2なら200といったようになっています。このダイヤル先の設定はextensions.conf
で行っています。
うまく設定できていればブラウザ同士で通話ができるはずです!
4.さいごに
今回はオープンソースのPBXであるAsteriskをWebRTCの通話ができるように構築しました。音声のみの通話だけでなくビデオ通話も可能になっています。また、AsteriskはPBXであるため、通話の転送や着信をキューに入れて待機させておくことも可能です。
本記事でインストールしたWebRTCアプリには”SIPJS”というライブラリが使用されています。これはjavascriptでAsteriskを利用できるようにするためのライブラリでこのライブラリを利用すれば自作のWebRTアプリでAsteriskを利用することも可能です。私はまだそこまでチャレンジできていませんがそのあたりにもチャレンジしていきたいと思います。
ありがとうございました。