Amazon Connectで月4ドルで電話発信する仕組みを構築する

142件のシェア(ちょっぴり話題の記事)

「システム障害アラート、やっぱり電話で発信したいよね…」

システム運用の要である障害アラート。異常発生に即対応するためのアラート運用は重要です。アラートの通知先としては代表的なものにメールがありますし、最近ではSlackなどのチャットツールを併用している現場も多いと思います。

しかし、やっぱり昔から一番緊急度が高いアラートとして利用されているのは、「電話」じゃないでしょうか。そう、聞きたくないんだけれど聞かないといけないアレです。

ただ、電話によるアラートをシステムに組み込むのって敷居が高そうじゃありませんか?サードパーティーのサービスを契約したり初期費用がかかったり時間も手間もかかったり… そこでAmazon Connectの出番ですよ。

実際やってみましたが、月4USD程度のランニングコストと1時間程度の手間で、手軽にSNS経由で電話発信する仕組みを作ることができました。

Amazon Connectの使い方の一つの用途として、一度目を通してもらえればと思います。

(祭) ∧ ∧
 Y  ( ゚Д゚)
 Φ[_ソ__y_l〉     オテガル デンワハッシン マツリダワッショイ
    |_|_|
    し'´J

システムアラートの電話発信構成図

構成図はこんな感じ。

やろうとしていることは非常にシンプルで、任意のシステムアラートをSNSで発行し、そこからLambda経由でAmazon Connect経由で電話発番するという内容です。発信するときのメッセージ内容は自由に日本語やその他Amazon Pollyに対応している任意の言語での自動読み上げが可能です。

恐ろしく簡単にできるので、まずはやってみましょう。

Amazon Conenct経由での電話発番構成の構築

Amazon Connectコンタクトセンターの構築

まず最初に、Amazon Connectのコンタクトセンターを構築する必要があります。ここは、下記ブログを参照ください。手順は思った以上に、非常にシンプル。まじ簡単。

を実施して、電話かけた時にプロンプトが再生されるところまで、構築してください。

Lambdaのメッセージを受ける問い合わせフローの作成

Lambdaから指定されたメッセージを発話するための問い合わせフローを作成します。上で作成した問い合わせフローを以下に変更します。

設定内容としては非常にシンプル。真ん中のプロンプトの再生を、以下のように設定します。

テキスト読み上げ機能を「動的に入力する」と指定し、タイプに「ユーザー定義」、属性にmessageを指定します。

このmessageは、後でLambdaから任意のメッセージを渡すときの属性名となります。

Lambdaの作成

Amazon Connectの問い合わせフローを起動するためのLambdaを作成します。超シンプルなPythonのLambda関数がこちら。

import boto3

def lambda_handler(event, context):
    
    connect = boto3.client('connect')

    message = 'とっても大変なことが起こりました。もうほんとやばいです。なんとかしてください!!'
    
    connect.start_outbound_voice_contact(
        DestinationPhoneNumber='+819012345678',
        ContactFlowId='a3382313-XXXX-474f-9c15-ZZZZZZZZZZZZ',
        InstanceId='7c6d5dae-XXXX-4903-96e4-ZZZZZZZZZZZZ',
        SourcePhoneNumber='+818012345678',
        Attributes={
            'message': message
        }
    )

メインは、start_outbound_voice_contact関数の呼び出しです。公式ドキュメントはこちら。

以下にパラメータを解説していきます。

  • DestinationPhoneNumber
    • 発信先電話番号を文字列のE.164形式で記入
    • 例:'+819012345678'
  • ContactFlowId
    • コンタクトセンターの問い合わせフローID
  • InstanceId
    • Amazon ConnectのインスタンスID
  • SourcePhoneNumber
    • 発信元電話番号を文字列のE.164形式で記入
    • 例:'+818012345678'
  • Attributes
    • 問い合わせフローの属性に引き渡す情報をkey,Value形式で記入

インスタンスIDと問い合わせフローIDがすごいわかりにくいのですが、Amazon Connectの画面で問い合わせフローを開いたときのURLに記載されているARNから抜き出します。具体的には以下の通り。

arn:aws:connect:{AWS::Region}:{AWS::AccountId}:instance/{インスタンスID}/contact-flow/{コンタクトフローID}

あとは、Lambdaが実行されるIAMロールに、AmazonConnectFullAccessのポリシーを追加します。

テストコードの実装とIAMロールの設定が完了したら、Lambdaをテスト実行してみましょう。無事発信先電話番号に電話がかかってきて、Lambdaで指定したメッセージが読み上げられればOKです!

LambdaとAmazon Conenctインスタンスが異なるリージョンの場合

一点、LambdaとAmazon Connectのインスタンスは同一リージョンに存在する必要があるので、注意してください。

最初、東京リージョンのLambdaからシドニーリージョンのAmazon Connectインスタンスにつながらなかったのですが、Connectのクライアントを取得するところで明示的にリージョン指定することで、無事東京リージョンのLambdaからでもシドニーのAmazon Connectインスタンスにつなげることができました。

connect = boto3.client('connect', region_name='ap-southeast-2')

Fujiwara_y(@ekodasolo)さん。情報提供ありがとうございます!

SNSトピックの作成とサブスクリプション構築

Lambdaの動作テストが完了したら、SNSトピックの作成とサブスクリプションへのLambdaの登録を行います。

と言っても、実施内容は簡単。SNSメニューよりトピックの作成を行い、そのあと作成されたトピックにサブスクリプション登録で、上で作成したLamddaを紐付けるだけです。

こんな感じで登録できればOk。

SNSの画面から「メッセージの発行」を実施してみて、先程の電話発信ができればOKです。

ここまでで、基本的な構成の構築は完了です。

SNSを構築する利点1「いろんなイベントソースへの対応」

今回の構成、Lambdaさえあれば電話番号発信はできるんですが、SNSをLambdaの前に構築しておくことは、AWSの様々なイベントソースへの対応が容易という利点があります。

CloudWatch EventsやCloudWatch Alarmなど監視系のマネージドサービスから連携できるのは一番大きなメリットですが、その他にもS3のイベントやStep Functionsなど、他のマネージドサービスとの連携で、SNSが使われていることは非常に多いです。

まぁ、こんな感じでSNSには、大抵のものがくっつきます(雑)。

SNSを構築する利点2「複数サブスクリプションの登録」

SNSを構築しておく利点の2つ目ですが、複数サブスクリプションを登録できる使い勝手の良さが挙げられます。

最初の構成図では、SNSの後ろにLambdaだけぶら下げてそこからConnectへの発信のみしていましたが、音声で受信できる情報は限られます。なので、その他必要なイベントのテキスト情報などは、メールやSlackにも合わせて流しておくようにしましょう。

以下のイメージです(Slackの前にもLambdaを入れるのが普通ですが、ここでは省略してます)。

これにより、以下のシステム障害運用が可能です。

  1. システムによる重大なエラーをCloudWatch Alarmで検知
  2. CloudWatch AlarmからSNSを発砲
  3. SNSからLambda経由でシステム担当者に電話発信。合わせてアラート内容の詳細をテキストでメールとSlackに送信
  4. 障害対応開始

SNSへのサブスクリプション登録はいつでも自由に可能かつ運用も手軽なので、システム障害系のアラームと電話発信用のLambdaの前には、是非SNSを挟んでおくことをおすすめします。

システムアラートとして利用する場合のAmazon Connectの料金

実際にこの仕組を運用するにあたり必要な料金を試算します。

料金 - Amazon Connect | AWS

  • 1 日あたりの要求された電話番号 (USD)
    • 直通ダイヤル(050,03) 0.10USD
    • 料金無料通話(0800,0120) 0.48USD

今回の利用用途では、受信は使わないので、直通ダイヤルを使う想定で、月3USD。

  • 1分あたりの発信通話の使用
    • 発信先:日本 0.100 USD

システムアラートではそもそも通話時間自体はほぼないので、長くて10分で見積もったとして、1USD。

システムアラート専用用途で使う場合、Amazon Connectは月当たり約4USDで利用が可能です。もちろん初期費用は無料。

どうでしょう。電話発信の仕組みを構築する場合、費用面を懸念される方も多いと思いますが、これぞクラウドという料金体系ですね。素晴らしい。

気軽に電話発信をシステムに組み込むことができるAmazon Connectの衝撃

Amazon Connectを自分で触ってみるまでは、どうしてもコンタクトセンターとしてのイメージが強く導入するにも敷居が高いものだと思ってました。

今回、改めてAmazon Connectをあれこれ触ってみることで、こんなに手軽かつ安価に電話発信の仕組みをAWSに組み込むことができることに驚きました。

日々のシステム運用で電話発信を組み込みたい現場も多いと思います。Amazon Connectを使えば、簡単かつお安くAWSフルマネージドで使える電話発信の仕組みを構築することができます。一度、これをきっかけに検討されてみてはいかがでしょうか。

それでは、今日はこのへんで。濱田(@hamako9999)でした。

最後に

この記事は、全面的にこちらの記事を参考にさせていただきました。感謝!

また、弊社ブログでは、Amazon Connectのブログも多数投稿されています。いろんなユースケースのブログが投稿されているので、これをきっかけにAmazon Connectに興味を持った方は、是非こちらもごらんください。