Amazon Connectを使ってCloudWatchアラームに電話通知を設定してみた

Amazon Connectを使ってCloudWatchアラームに電話通知を設定してみた

Clock Icon2024.10.30

こんにちは。
繁松です。

はじめに

CloudWatch Alarmの通知先に電話を設定したいと思ったことはありませんか?
CloudWatch、Lambda、Amazon Connectを組み合わせることで電話通知が可能になります。

本ブログではCloudWatchアラームの実行アクションにLambdaを指定して、Amazon Connectから通知先の電話番号にアラーム内容を音声通知させてみます。

shapes-1730209225771

やってみた

前提条件

  • Amazon Connect
    • 構築済みであること
    • 電話番号取得済みであること

Amazon Connect

Amazon Connectコンタクトフローの作成

以下のようなフローを作成します。

2024-10-29_23h37_33

電話通知の際にCloudWatchアラーム名を読み上げたいのでプロンプトの再生ブロックには以下の内容を設定します。

クラウドウォッチアラームの通知です。 $.Attributes.alarmName のアラームが発生しています。

作成後にコンタクトフローIDをメモしておきます。

Lambda

Lambda関数の作成

Python 3.12でLambdaを作成します。

2024-10-29_23h52_32

ロールのポリシー追加

LambdaのロールにAmazon Connectの発信に必要な以下のポリシーを追加します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "connect:StartOutboundVoiceContact",
            "Resource": "*"
        }
    ]
}

CloudWatchアラーム用のポリシー追加

LambdaにCloudWatchのリソースベースポリシーを追加します。
Lambda→アクセス権限→リソースベースのポリシーステートメントで「アクセス権限を追加」を選択します。

以下の値を入力し保存します。

ステートメントID:任意の値
プリンシパル:lambda.alarms.cloudwatch.amazonaws.com
アクション:lambda:InvokeFunction

2024-10-30_00h29_11

コード

Amazon ConnectのインスタンスID、コンタクトフローID、Amazon Connectで取得した電話番号、通知先の電話番号を設定します。
電話番号は「E.164」形式(例:+815011111111)で指定する必要があります。
今回「EC2_CPU使用率80%超過」というアラート名を読み上げて通知したいのですが、EC2を「イーシー二」と呼んでしまうのでコードの中で「イーシーツー」に変換しています。

import boto3

def lambda_handler(event, context):
    # Amazon Connectクライアントの作成
    connect = boto3.client('connect')

    # Amazon Connectインスタンスの設定
    instance_id = 'Amazon ConnectインスタンスID'
    contact_flow_id = 'コンタクトフローID'
    source_phone_number = 'Amazon Connectで取得した電話番号'
    destination_phone_number = '通知先の電話番号'

    # イベントからcloudwatchアラーム名を取得
    alarmName = event['alarmData']['alarmName']
    # EC2をイーシー二と読むので置換
    alarmName_replace = alarmName.replace("EC2", "イーシーツー")

    # アウトバウンドコールの開始
    response = connect.start_outbound_voice_contact(
        DestinationPhoneNumber=destination_phone_number,
        ContactFlowId=contact_flow_id,
        InstanceId=instance_id,
        SourcePhoneNumber=source_phone_number,
        Attributes={
            'alarmName': alarmName_replace
        }
    )

通知先の電話番号を携帯電話宛(070,080,090)に設定したい場合はAWSサポートへの申請が必要になります。

https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/country-code-allow-list.html

CloudWatch

CloudWatch Alarmの作成

EC2のCPU使用率が80%を超えた場合のアクションに電話通知を設定してみます。

2024-10-30_00h12_48
2024-10-30_00h13_16

Lambdaアクションに先ほど作成した関数を設定します。

2024-10-30_00h14_52

アラーム名に「EC2_CPU使用率80%超過」を設定します。
2024-10-30_00h16_22

動作確認

動作確認のためAmazon Connect宛に電話通知を行いました。
設定したCloudWatchアラーム名「EC2_CPU使用率80%超過」を読み上げています。

https://www.youtube.com/watch?v=MrCNjLzyLiU

さいごに

AWSリソースの監視で電話通知まで行いたい場合にはAmazon ConnectとLambdaを利用することで実装できます。
今回はアラーム名を読み上げる内容としましたが、別のCloudWatchイベントログを読み上げるように変更することも可能です。

以前まではCloudWatchのアクションにSNSを設定してLambdaを呼び出す必要があったのですが、2023年のアップデートからCloudWatchのアクションにLambdaを設定することが可能になったので、よりシンプルな構成で電話通知の設定が可能になりました。

参考情報

https://dev.classmethod.jp/articles/cloudwatch-alarms-lambda-change-action/
https://dev.classmethod.jp/articles/amazon-connect-onpremises-call/
https://dev.classmethod.jp/articles/cloudwatch-alarm-startoutboundvoicecontact/

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.