ども、@kimihom です。
Web サービスを運営していれば障害は付き物なので、その対策を検討した結果について記しておこう。
障害検知
きっかけとなったのは、起きている昼間だったら定期的に Slack 通知などをみながら様子を見て、誰かが発見したら共有すれば良い。しかし、夜間で起きた場合にどうするかという問題がある。
これに対して、そもそも夜間は使う人が少ないから、起きた時に見つけたら対応する。というケースでほとんどは問題ないのかもしれない。基本的にこうした障害は結局は外部サービス側の障害解消を待つしかないケースが多いのである。
それでも、自分達でWebサービスを運営しているのであれば、できる限り早くユーザーに向けてその状況を報告しなければならない。そうした責任感が増した時、深夜に障害が発生したら早くお知らせする体制が必要になってくるだろう。
Amazon Connect
Amazon Connect は、いろいろなケースで電話をカスタマイズできるクラウドベースのコンタクトセンターである。
「あれ?いつもはTwilioのことを書いてない?」そう思った読者の皆様にはいつもブログを読んでいただいて感謝である。そう、今回のような障害通知を利用するケースで、Twilio Voice を使うケースがとても多い。
しかし、私自身が Twilioを使ったWebサービスを開発しているため、仮にTwilioで障害が起きてしまったら、そもそも通知さえ届かなくなる事態が発生してしまう。それを防ぐためには、Twilio とは別の環境で電話の通知を出すようにしなければならなかった。
ではAmazon Connectを使って具体的にどう実装をするかについては、以下のWebサイトを参考にさせてもらった。
Amazon ConnectでLambdaから電話をかける | It works for me
こちらの記事の補足として、IAM の設定の記載がなかったので記しておこう。ズバリ、必要なのは普段 AWS Lambda を実行させているIAM権限に connect:StartOutboundVoiceContact
を追加すればOKである。
実際の流れは以下となる。
- 障害が発生したら、Webhook で Amazon API Gateway へ飛ばす
- AWS Lambda を実行させて、その内容をSlack通知
- エラーの回数が指定した回数を超えたら、電話で緊急対応通知を出す
電話で緊急対応通知を出すには、AWS Connect の API を呼び出すだけでOKだ。参考までに以下のようなコードとなろう。
const AWS = require('aws-sdk'); const async = require('async'); const CALL_NUMBERS = [ '+81******', '+81******', '+81******' ]; const connect = new AWS.Connect({apiVersion: '2017-08-08', region:"ap-northeast-1"}); async.each(CALL_NUMBERS, (number, cb) => { connect.startOutboundVoiceContact({ ContactFlowId: 'dc2527a3-****-****-****', DestinationPhoneNumber: number, SourcePhoneNumber: '+815011113333', // Amazon Connectで取得した電話番号 InstanceId: '1d8f3ad7-****-****-****', }, (err) => { console.log(`${number} call done. err: ${err}`); cb(); }); }, callback);
Amazon Connect の感想
こうした特定の電話の処理を、パッとやりたい場合には、ググりながらなんとか対応することが可能。 しかし、実際にコンタクトセンターとして運用をしていく場合には、ものすごい複雑だと思った。その複雑さにより、わかる人にはいろいろな拡張ができる仕組みではある。しかし、これをゼロからいじっていくのは大変なことである。
では、実際にコールセンターを作りたい場合には、何を使えばいいのか?
その答えは、きっと私がここに記さなくても、あなたはわかってくれていると信じている。
終わりに
今回は Amazon Connect を利用した障害通知の方法に関して記した。
夜間の障害をどう捉えるか。Webサービス運営の責任感を感じ始めるようになってきたら、検討してみてはいかがだろうか。