亚马逊AWS官方博客

使用 Amazon Connect 与CloudWatch 联动实现电话通知云端告警

一、背景介绍

用户在使用AWS云服务的时候,需要对关键服务的性能、可靠性等指标进行实时监控,在出现监控指标异常的时候,需要及时通知云管理人员,对异常服务进行查看并修复。越来越多的用户把生产环境部署在云端,这就要求云端业务需要7X24处于可用状态,即便目前AWS平台已经有了使用邮件、短信通知等方式发送告警的功能,但是在一些重大事件发生的时候,用户还是希望AWS平台能够直接拨打相关运维人员的手机,以便更快速地进行告警发送。

在这篇文章中,我们会探讨在AWS上使用Amazon Connect服务,结合CloudWatch监控,在出现重要事件的时候,拨打相关人员的电话,达到及时通知的目的。

二、解决方案架构

数据处理流程以及系统概要架构如下所示:

CloudWatch可以针对AWS云上大量的预定义和自定义指标进行监控,我们也可以使用CloudWatch Event事件来针对我们关注的指标触发事件,调用定义好的Lambda函数,来调用Amazon Connect服务拨打相关人员的电话。

三、服务部署

文章演示的是通过配置Amazon Connect,以调用一个预设的流程向外拨打电话的功能,然后通过Lambda函数调用的方式,提取要拨打的电话号码。

首先,我们要配置Amazon Connect 服务相关功能

1.在AWS的控制台中搜索 Amazon Connect进入服务页面,选择添加实例:

2.在出现的配置选项中根据我们的实际情况填写相关信息,主要设置Amazon Connect服务实例的访问地址:

3.设置管理员,我们会利用这里设置的管理员帐号登陆第二步设置的访问地址:

4.设置通话选项,根据需求选择来电以及出站呼叫的功能,我们这次演示只需要拨打电话,所以只勾选“出站呼叫”功能:

5.在数据存储的设置选项中可以设置存储相关日志的存储桶,可以根据自身情况设置,也可以选择默认设置:

6.最后在审核和创建的步骤中选择创建实例即可完成实例的创建。在等待一到两分钟后,实例创建成功,我们可以通过设置的访问URL访问我们的实例:

7.通过访问上面截图中的访问URL来访问(注意每个人的访问URL都是不一样的),并用我们设置的管理员帐号登陆:

8.申请电话号码,用于拨打对外的电话,本次Demo我们选择了日本地区的号码,然后继续下一步的设置:

9.创建联系流,在这里我们可以定义拨出电话需要自动执行的相关指令,我们点击“查看联系流”,进入到联系流的控制界面,然后新建一个新的联系流:

10.在联系流里面设置语言,设置使用中文,我们也可以根据需求,设置自己喜欢的语言:

11.设置播放提示,播放提示可以让电话被接通之后,播放自定义的语音,在这里我们选择动态输入,类型选择为“用户定义”,属性设为“message”。这个配置的意思是我们可以动态调整语音提示的内容,本篇文章会在后面的Lambda函数中演示如何动态的设置提示语音:

12.设置完电话挂断指令后,通过点击指令上的白色圆点,拖动到想要执行的下一个指令,可以在这两个指令之间画一个箭头,表示指令执行的先后顺序,如此把所有的指令连接,就可以把整个联系流程串联起来。我们输入流程的名称为 “warning_call_out_flow”,然后点击保存,并点击发布按钮发布联系流。

注意联系流需要发布才能被代码调用,请注意发布之后的ARN值,在编写调用代码的时候需要用到:

13.设置执行代码的IAM角色。在AWS控制台选择IAM,进入IAM的控制面板。点击角色,然后点击“创建角色”按钮,创建新的角色,我们选择AWS产品,然后在下方选择Lambda,点击“下一步:权限”按钮,

接着勾选“AmazonConnectFullAccess”策略,点击“下一步:标签”按钮,

跳过标签设置,进入审核页面,填写角色名等信息,点击“创建角色”,就创建好了具有Amazon Connect所有权限的IAM角色了,

14.在AWS的控制台选中Lambda, 新建函数,选择从头开始创作,输入函数名为“cloudwatch_alarm_call_out_lambda”,运行语言选择Python 2.7,权限一栏选择“使用现有角色”,然后在现有角色的下拉框中选中在上一步中创建的IAM角色,点击创建按钮,创建出空白的Lambda函数:

15.在新创建的Lambda函数中,加入以下代码,请注意替换 DestinationPhoneNumber后面的“*******”为你想要拨打的号码,并且加上国家代号,以中国号码为例,我们需要使用+86为前缀的可用电话号码。

而“InstanceId”、“ContactFlowId”这两个参数可以在第12步中生成的ARN值中找到,参考该步骤中的截图标记的部分,填写你自己的参数。

SourcePhoneNumber则是在步骤8中设置的号码,在这里我们的值是+815031851732’。

修改好Lambda函数的代码之后,我们点击保存按钮保存。

# -*- coding: utf-8 -*-
import json
import boto3

client = boto3.client('connect')

def lambda_handler(event, context):
    info= '<speak><break time="3s"/>您好,您在东京区域的EC2实例在刚才关闭,如是正常操作请忽略,该实例ID为'+ event['detail']['instance-id'].encode('utf8')+'</speak>'
    response = client.start_outbound_voice_contact(
    DestinationPhoneNumber='+********',
    InstanceId='6296a16c-875a-4a6e-a110-e855f0d71acc',
    ContactFlowId='6601714c-6b4a-45b8-be10-7bc9ec0f2af8',
    SourcePhoneNumber='+815031851732',
    Attributes={
        'message': info
    }
    )
    
    return {
        'statusCode': 200,
        'body': json.dumps(response)
    }

在这段代码中,我们通过抓取event对象中的相关属性的值,构造一段信息赋值给变量info,info中的

<break time=“3s”>

作用是在电话接通之后,等待三秒钟再播报info中的内容,可以防止云管理人员遗漏相关信息。

info变量的字符串遵循SSML规范,更多内容可以参考以下博客,https://aws.amazon.com/blogs/contact-center/ssml-in-amazon-connect-contact-flows/ 。

构造完成的info值,我们直接赋予对应的联系流的属性message,需要注意代码中的属性名称message和我们在第11步中设置的属性名称message要完全一致。通过这段代码我们就可以把触发Lambda函数的事件内容抓取出来,在电话中语音告知云管人员。

16.配置CloudWatch的事件,在CloudWatch控制面板,选中事件->规则,然后创建规则。在本文中我们演示EC2实例被关闭之后,我们拨打电话通知相关人员,对应的配置可以参考下图。我们保存事件为 “ec2_shutdown_event”

配置完成之后,Amazon Connect就可以根据EC2实例被停止的事件来拨打电话给相关人员了。

17.我们通过在EC2控制台停止一台运行中的EC2实例,很快,Amazon Connect自动拨通云管理人员的手机进行告警:

接到告警电话

 

四、总结

在本篇文章的讨论中,我们演示的情况比较简单,在实际生产环境中,我们可以根据自己的业务情况设置更多的监控指标,并且把联系人的电话和监控指标所属的业务做一个对应关系,根据告警信息所属的业务,拨打相关负责人的电话。

 

本篇作者

倪赛龙

AWS解决方案架构师,负责基于AWS云计算方案的架构咨询和设计实现,同时致力于无服务计算的应用和推广

尹广东

AWS解决方案架构师,负责基于AWS云计算方案架构的咨询和设计,在国内推广AWS云平台技术和各种解决方案。具有十年以上云计算和 APM(应用性能管理)解决方案领域工作经验,熟悉主流的云计算及 APM 产品,对企业级应用系统架构、网络架构、存储架构有深刻了解,熟悉 TCP/IP 网络协议、主流的路由交换协议,超过4年的AWS技术实践经验,深度理解AWS核心的计算、网络、存储以及云计算的弹性伸缩,目前专注于AWS FSI行业解决方案设计。