障害発生の際など、やむをえず自宅で就寝中の社長を起こさないといけないことがある。インターネット時代においても遠隔地にいる人間の意識を強制的に遮る有効な方法は一つである。電話だ。
普通の人間なら順番にただ電話すれば良いのだが、我々は電話恐怖症を患うエンジニアである。過去のトラウマから誰かに電話をかけることが不安で仕方ない。
さらにはリモートワークの環境だと、アメリカ西海岸にいる社員が日本の電話番号に電話するのは色々と敷居の高さがある。素早く簡単に社長に電話し不機嫌にすることなく即座に目覚めさせる方法が必要だ。
このような課題を、我々が対処する方法はただひとつ「自動化」である。機械に電話させればよい。行末スペースをただひとつも許せないほど繊細な心を持つ我々と比べて、機械は感情がないので不機嫌な人間に当たられても何も感じない。
今回は、感情のないロボットに社長に電話させる方法を紹介する。
Twilio
TwilioというAPIから電話をかけられるサービスがある。
電話というとお高いイメージがあるが、案外お手軽な価格で月額108円で電話番号が取得でき通信料も安い。たまにイタズラ電話を発信する程度なら中学生のお小遣いでも大丈夫だ。
今回はこのNode.js SDKを利用して、hubotから呼び出す。これだけで電話がかけられる。
client = require('twilio')(accountSid, authToken)
call = (to, callback) ->
client.calls.create(
url: "https://dl.dropboxusercontent.com/u/your/voice.xml"
to: to
from: "+8150xxxxxxxx"
method: "GET"
fallbackMethod: "GET"
statusCallbackMethod: "GET"
record: "false"
, callback
)
urlにあるのは電話通話時にさせたい操作が書かれたTwiMLという要するにXMLファイルで、「○○と自動音声で発言する」「1キーが押されたら○○する」というような操作が書ける。
<Response>
<Say voice="alice" language="ja-JP">おきて!おきて!おきて!</Say>
</Response>
こうすると、通話時にaliceちゃんが一方的におきてと言ってくれる。機械的な音声だが、野郎に深夜に電話で起こされることを考えたらはるかにマシだろう。
このXMLファイルは、URLから見える場所ならどこに置いてもいいのでDropboxのPublicフォルダに置いている。
hubot
あとはさきほどの関数を呼び出すhubotスクリプトを書けばよい。
module.exports = (robot) ->
robot.respond /call/i, (msg) ->
call('社長の電話番号', ->
msg.send 'calling calling'
)
僕のいる会社では名簿から電話番号をとってきて、人を指定して電話をかけて呼び出せるようにしている。
実際
深夜の障害発生時に、躊躇することなく素早く社長やインフラ担当を目覚めさせることができ、見事に障害を乗り切った。いまや起床ですらChatOpsの一部である。