AWS CloudWatch アラームを Amazon Connect を使って電話通知する

はじめに

オンプレミスで稼働しているサーバを AWS へ移設することになったので、監視関連も AWS へ移設することになりました。基本的には CloudWatch に監視関連を集約し、検知したアラームをメール通知、slack 通知、電話通知等様々な通知手段を活用し通知するようにしました。今回は Amazon Connect を利用した電話通知の設定方法を紹介します。

AWS Service

  • CloudWatch
  • SNS
  • Lambda
  • Amazon Connect

Amazon Connect 設定(インスタンス作成)

まずは、Amazon Connect インスタンス作成です。
[サービス > Amazon Connect > インスタンスを追加する] を選択

<ステップ 1: ID 管理>
「Amazon Connect 内にユーザーを保存」を選択
アクセス URL : https://XXXXXXXXXX.awsapps.com/connect/home
XXXXXXXXXX : 任意で設定


<ステップ 2: 管理者>
「これをスキップ」を選択
※今回は検証のみなのでスキップで OK です


<ステップ 3: テレフォニーオプション>
着信通話を Amazon Connect で処理します : チェック外す
発信通話を Amazon Connect で処理します : チェック
※今回は発信のみなので着信設定は無しで OK です


<ステップ 4: データストレージ>
デフォルト設定でOK
※S3, CloudWatch Logs 格納先の細かい設定がしたい人はここで設定可能です


<ステップ 5: レビューと作成>
内容を確認し問題無ければ「インスタンスの作成」を押下

Amazon Connect 設定(電話番号取得)

インスタンスを作成したら、次に電話番号を取得します。
先程作成したインスタンスの URL にアクセスします。
アクセス URL : https://XXXXXXXXXX.awsapps.com/connect/home

※管理者作成をスキップした場合、アクセス URL からログインが出来なくなるので、緊急アクセスから接続してください。
緊急アクセス : サービス > Amazon Connect > 対象インスタンス > 概要 > 緊急アクセス

左側のメニューから [ルーティング > 電話番号] へ移動し
右上の「電話番号の取得」を押下


<電話番号の取得>
料金無料通話
国/地域 : Japan
5つの中から好きな番号を選択

Amazon Connect 設定(問い合わせフロー作成)

電話番号を取得したら、次に問い合わせフローを作成します。

左側のメニューから [ルーティング > 問い合わせフロー] へ移動し
右上の「問い合わせフローの作成」を押下


必要なフロー情報(左側)をクリックし、フロー図(右側)へドラッグします。
<必要なフロー情報>
[設定 - 音声の設定]
[操作 - プロンプトの再生]
[終了/転送 - 切断/ハングアップ]


各フロー情報の処理順番を決めます。
フロー情報右下にある「○」をクリックし次のフロー情報へドラッグします。


[設定 - 音声の設定] の設定をします。
フロー図に設定した [設定 - 音声の設定] をクリックすると設定が可能になります。
言語 : 日本語
音声 : Mizuki(女性の声) or Takumi(男性の声)
※音声に関しては好みで決めてください


[操作 - プロンプトの再生] の設定をします。
フロー図に設定した [操作 - プロンプトの再生] をクリックすると設定が可能になります。
プロンプト : テキスト読み上げまたはチャットテキスト
テキストの入力 : 電話通知時に読み上げてもらいたいメッセージを入力


問い合わせフローの名前を入力(左上)し、「保存」(右上)を押下。
保存後、「公開」を押下。
※公開しないとこの問い合わせフローは使用できないので注意してください!!!!

以上で Amazon Connect の設定は完了です。

Lambda 設定

続いて、Lambda 関数を設定します。
[サービス > Lambda > 関数 > 関数の作成] を選択
 関数の作成 : 一から作成
 関数名 : 任意
 ランタイム : Python 3.8(Python の最新 Ver を選択)
 実行ロール : 基本的な Lambda アクセス権限で新しいロールを作成

<関数コード>
import boto3
def lambda_handler(event, context):
    client = boto3.client('connect')
    client.start_outbound_voice_contact(
        InstanceId='{InstanceId}',
        ContactFlowId='{ContactFlowId}',
        SourcePhoneNumber='+81XXXXXXXXXX',
        DestinationPhoneNumber='+81YYYYYYYYYY'
    )

<環境変数>

  • InstanceId : Amazon Connect インスタンス ID
  • ContactFlowId : Amazon Connect フロー ID
  • SourcePhoneNumber : Amazon Connect で取得した電話番号(ハイフン、スペース無し)
  • DestinationPhoneNumber : 通知先の電話番号(+81のあと、通知したい番号の頭「0」を取ったものを入れる)。例 ) +8190YYYYXXXX

InstanceId, ContactFlowId は、上記で作成した問い合わせフロー作成画面から確認できます。
「追加のフロー情報」の Arn 情報を確認して設定してください。
arn:aws:connect:{AWS::Region}:{AWS::AccountId}:instance/{InstanceId}/contact-flow/{ContactFlowId}

以上で Lambda の設定は完了です。

SNS 設定

続いて、SNS を設定します。
[サービス > Simple Notification Service > トピック > トピックの作成] を選択
 名前 : 任意
 表示名 : 任意

続いて、上記で作成したトピックのサブスクリプションを設定します。
[サービス > Simple Notification Service > トピック > 上記で作成したトピック > サブスクリプションの作成] を選択
 トピック : 上記で作成したトピックの ARN
 プロトコル : AWS Lambda
 エンドポイント : 上記で設定した Lambda の ARN

以上で SNS の設定は完了です。

CloudWatch アラーム設定

続いて、CloudWatch アラームを設定します。
こちらに関してはアラームを作成して通知先を上記で作成した SNS トピックを指定するだけなので、今回はサンプルとして EC2 の CPU 使用率アラームを作成したいと思います。

[サービス > CloudWatch > アラーム > アラームの作成] を選択

【メトリクス】
[メトリクスの選択] 押下
[CPUUtilization] でメトリクスを検索
EC2 > インスタンス別メトリクス
対象 [インスタンス名] にチェックを付け [メトリクスの選択] 押下

【条件】については適当に閾値設定してください


【通知】
アラーム状態トリガー : アラーム状態
SNS トピックの選択 : 上記で設定した SNS トピック

【Auto Scaling アクション】【EC2 アクション】は必要であれば設定してください

以上で CloudWatch アラームの設定は完了です。

これで CloudWatch アラームが発動すれば、Lambda に設定した通知先に電話通知されます。

おわりに

この仕組みを実装すれば電話連絡を外注する必要が無くなるので結構使えると思った。外注するよりお金もかかりません。
ただし、今回紹介した設定だと通知先が1つに限定されてしまうので、一度に複数又は輪番で通知することが出来ないのが欠点です。
今回の設定で一度に複数人へ通知させるには、Lambda 関数の start_outbound_voice_contact API を人数分設定して通知先だけ変更してあげれば可能ですが、構成としてはいまいちかもしれません。
Step Functions, Systems Manager Parameter Store, Lambda を連携すれば輪番で通知することも出来そうですが、今回は見送ります。
今回は検証で設定しただけで諸々適当に設定しているので、正式に運用するのであれば下記設定は気にした方が良いと思います。管理しづらい名前で自動的に作成されてしまいます。
 IAM ロール
 S3 格納先
 CloudWatch Logs 格納先
 等々

参考リンク