はじめに
はじめまして。会員システムグループでメールシステムの担当をしている鹿野です。
みなさまは、担当されているシステムの監視アラート対応はどうされていますか?
弊社のメールシステムはメールサービスを提供しているというその特性もあり、緊急度の高いアラートは電話で担当者に通知を行う構成を採用しています。
今回はそのアラート発生から担当者に電話で通知するまでのフローを Alertmanager と Amazon Connect を使って構成したお話です。
この記事で使用している構成コードのサンプルはこちら
システム構成
構成はとてもシンプルです。
- アラートが発生するとAlertmanagerがSNSトピックにメッセージを発行し、メッセージを受けたSNSトピックはサブスクライブしているLambda関数を呼び出します。
- 呼び出されたLambda関数がAmazon ConnectのStartOutboundVoiceContact APIをコールします。
- Amazon Connectが電話で通知を行います。
Lambda関数のコードサンプルを以下に抜粋しておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import os import boto3 DEST_PHONE_NUMBER = "+81xxxxxxxxxx" connect = boto3.client("connect") def lambda_handler(event, context) -> None: contact = connect.start_outbound_voice_contact( DestinationPhoneNumber=DEST_PHONE_NUMBER, ContactFlowId=os.getenv('CONNECT_CONTACT_FLOW_ID'), InstanceId=os.getenv('CONNECT_INSTANCE_ID'), SourcePhoneNumber=os.getenv('SOURCE_PHONE_NUMBER'), Attributes={"message": "This is alert notification system."}, ) |
今回使用するサンプルでは発信先電話番号を定数(DEST_PHONE_NUMBER)として定義していますが、環境変数で渡してあげたり、またはDBで管理するなどお好みで拡張ができます。
また、着信時に流れる機会音声の内容についてはAttributesパラメータに渡すmessage属性の内容がそのまま適用されるようになっています。
構成してみる
以下のステップで構成していきます。
- 通知システムの構成
- Alertmanagerのアラート通知設定
通知システムの構成
ここでの通知システムとは、構成図のAWSリソース群のことを指します。
構成するには、以下の要素が満たされていることが前提です。
- Terraformクライアントがインストール済み
- AWS IAM認証情報が設定済み
実行計画を確認して、
1 |
terraform plan |
構成を反映します。
1 |
terraform apply |
outputsに出力された以下項目はAlertmanagerのアラート通知設定で使用するので、値を控えておきます。
- iam_assumable_role_arn
- sns_topic_arn
また、SNSトピックへメッセージを発行するIAMユーザーのアクセスキーが必要です。
コンソールまたはCLI等から取得しておきましょう。
Alertmanagerのアラート通知設定
Alertmanagerのバージョンは 0.23.0 以降が必須です。
Prometheus及びAlertmanager自体の構成は済んでいるものとし、Alertmanagerのバージョンは 0.23.0 を使用しています。
以下のステップで構成していきます。
- IAM認証プロファイルの作成
- Alertmanager設定ファイルにAWS SNSレシーバーを追加
IAM認証プロファイルの作成
Alertmangerのホスト上にIAM認証プロファイルを作成しておきます。
このサンプルでは、プロファイル名を共に alertmanger
とします。
Alertmanager設定ファイルにAWS SNSレシーバーを追加
Alertmanager設定ファイルにAWS SNSレシーバーを追加します。
1 2 3 4 5 6 7 8 9 10 11 12 |
route: receiver: 'snsreceiver' receivers: - name: 'snsreceiver' sns_configs: - api_url: 'https://sns.ap-northeast-1.amazonaws.com' topic_arn: '<sns_topic_arn>' subject: 'optional string' sigv4: region: 'ap-northeast-1' profile: 'alertmanager' role_arn: '<iam_assumable_role_arn>' |
- topic_arn に前の項目で控えておいた
sns_topic_arn
の値を入力します。 - sigv4.role_arn に
iam_assumable_role_arn
の値を入力します。
設定ファイルを保存後、Alertmanager を再起動、または設定を再読み込みさせれば Alertmanager の通知設定は完了です。
構成後の注意点
AWSリソースを構成して、Alertmanagerにも通知設定を反映したからはい終わり!
となればいいのですが、電話でアラート通知を受けるにはあともう2ステップ必要です。
- 発信元電話番号の取得とコンタクトフローへの紐づけ
- 発信先電話番号の制限解除
発信元電話番号の取得とコンタクトフローへの紐づけ
この記事を執筆した時点では、発信元電話番号の取得や、取得した電話番号をコンタクトフローへ紐づけするリソースが、TerraformのAWSプロバイダーに存在していなかったため構成内に組み込むことができませんでした。
本サンプルではコンソール上から紐づけ作業を行いますが、CLIでも同様のこと(claim-phone-number, associate-phone-number-contact-flow)ができるので構成フローに組み込もうと思えばできると思います。
発信元電話番号の取得とコンタクトフローへの紐づけは、Amazon Connectインスタンスの管理画面から行います。
取得と紐づけができたら、terraform.tfvarsファイルを作成して、connect_source_phone_number
に取得した発信元電話番号(E.164)を設定します。
1 |
connect_source_phone_number = "+1xxxxxxxxxx" |
構成を更新します。
1 |
terraform apply |
発信先電話番号の制限解除
地味なハマりポイントです。
これで発信できるようになったと思いきや、試しにアラート通知テストをしてみると以下のエラーに遭遇します。
1 2 3 |
[ERROR] DestinationNotAllowedException: An error occurred (DestinationNotAllowedException) when calling the StartOutboundVoiceContact operation: None |
エラー文だけだとさっぱり分かりません。
原因は、日本の携帯電話番号がデフォルトでは許可されていないプレフィックスとして、サービス側で制限されていたからでした。
リストに載っているプレフィックスから始まる電話番号に発信したい場合は、AWSサポートからサービスクォータ引き上げ申請を行います。
内容に問題がなければ、数日程度で受理されます。
ここまでやることで、アラート通知を電話に発信できるようになります。
カスタマイズするとしたら
大きく二分すると、カスタマイズ先は以下の2つが挙げられます。
- Lambda関数
- コンタクトフロー
「発信先電話番号の指定」は前者でしかできませんが、それ以外のことはどちらでも可能です。
しかし、StartOutboundVoiceContact をコールしてから電話が切断されるまでのフローはコンタクトフローで制御されているため、フローの制御はできることならコンタクトフローに任せてしまったほうが楽かと思います。
例えばですが、「電話を受信して対応を開始したか?」に基づいてSlackに通知したければ、以下のようなフローを組み込めば実現できるかもしれません。
「顧客の入力を取得する」+「顧客の入力を保存する」 or 「コンタクト属性の設定」 -> 「コンタクト属性を確認する」 -> 「Slack通知するLambda関数を呼び出す」
まとめ
- Amazon Connect を使って電話アラート通知の仕組みを構成できる
- 発信先電話番号に制限がある点には注意が必要
以上がAlertmanagerとAmazon Connectで構成する電話アラート通知についてのお話でした。
Terraformのアップデートで、将来的にはTerraformだけで構成作業が完結できるようになることを期待しています。