亚马逊AWS官方博客
使用 Amazon Connect 创建高可用性多区域 Amazon Lex 机器人
如今,众多AWS客户利用Amazon Lex机器人在电话及其他多种渠道之上增强Amazon Connect自助服务的对话体验。借助Amazon Lex,呼叫方(用Amazon Connect术语描述,即客户)能够快速获取问题的答案,几乎不需要人工客服的介入。但这同时也给服务可用性提出了更高的要求,因此引发了新的问题:我们该使用哪种架构模式提升机器人可用性?在本文中,我们将探讨一种跨区域方法,通过在多个区域中部署Amazon Lex机器人以提高服务可用性。
架构概述
在这套解决方案中,一旦Amazon Lex出现服务可用性问题,Amazon Connect流能够将中断影响控制在最低程度,借此实现业务连续性。此架构模式使用以下组件:
- 两个Amazon Lex机器人,各自处于不同的区域内。
- 两个机器人由负责区域检查的AWS Lambda函数进行触发,并集成至Amazon Connect流内。
- 用于检查机器人运行状况的Lambda函数。
- 为Amazon Connect区域中的主机器人创建一套Amazon DynamoDB表,并通过Lambda函数进行读取。
- 使用DynamoDB表保存Amazon Connect与Amazon Lex之间的区域映射。由之前提到的运行状态检查函数负责更新此表。区域检查函数读取此表,以获取Amazon Connect与Amazon Lex的最新主区域映射。
之所以要在两个区域内设置完成相同的Amazon Lex机器人,是为了能够随时在辅助区域中启动该机器人,进而在主区域发生故障时及时替换。
Amazon Lex的多区域模式
随后的两节,主要描述集成有Amazon Lex机器人的Amazon Connect流如何在主区域发生服务故障或中断的情况下,快速实现恢复并使用辅助区域内的Amazon Lex正常响应客户呼叫。
运行状况检查函数将根据TEST_METHOD Lambda环境变量对两个Amazon Lex运行时API之一进行调用(PutSession或 PostText)。您可以根据自己的喜好及用例要求选择其中一个。PutSession API调用不会产生任何额外的Amazon Lex关联费用,但无法测试Amazon Lex提供的自然语言理解(NLU)功能。PostTextAPI则允许您检查Amazon Lex的NLU功能,且额外成本不高。
运行状况检查函数会将通过测试的区域名称,更新至DynamoDB表(lexDR)中的lexRegion列。如果主区域正常通过运行状况检查,则lexRegion将被更新为主区域名称。如果运行状况检查失败,则该函数将基于辅助区域内的TEST_METHOD环境变量向相应的运行时API发出调用。如果测试成功,则DynamoDB表中的lexRegion列将被更新为辅助区域;如果测试仍然失败,则更新为err,代表两个区域皆已发生服务中断。
在Amazon Connect收到的每项呼叫中,都会发出区域运行状况检测函数调用,借此获取当前Amazon Connect区域中的活动Amazon Lex区域。由区域运行状况检查函数返回的主区域将作为最新条目,由该检查函数写入至DyanmoDB表。由区域检查函数返回的可用区域内Amazon Lex机器人,将通过Get Customer Input Block配置接受Amazon Connect的调用。如果函数返回的是辅助区域,则Amazon Connect将调用辅助区域中的机器人。
部署Amazon Lex机器人
大家需要在主区域与辅助区域中创建相同的对话机器人。在本文中,我们将us-east-1作为主区域,us-west-2作为辅助区域。接下来,先使用主区域us-east-1创建机器人:
- 在Amazon Lex控制台上,点击Create。
- 在 Try a Sample部分,选择
OrderFlowers
,而后在COPPA 中选择No。 - 其他设置项皆保留默认值,点击 Create。
- 此机器人的创建与构建操作将自动进行。
- 在机器人构建完成(约需1至2分钟)后,选择 Publish。
- 创建一个别名,名称为
ver_one
。
对us-west-2
区域重复上述步骤。现在,您已经在us-east-1
与us-west-2
中建立起能够正常运行的Amazon Lex机器人。
创建DynamoDB表
请确保您当前处于 us-east-1
区域内。
- 在DynamoDB控制台处,选择 Create。
- 在Table name部分,输入
lexDR
。 - 在Primary key部分,输入
connectRegion
且类型为 String。 - 其他各项保留默认值,而后选择 Create。
- 在Items选项卡中,选择 Create item。
- 将
connectRegion
的值设置为us-east-1
, 而后Append一个类型为String、名称为lexRegion
的新列,并将其值设置为us-east-1
。 - 点击Save。
为Lambda函数创建IAM角色
在此步骤中,我们将为两项Lambda函数创建一个AWS身份与访问管理(AWS Identity and Access Management,简称IAM)角色。
- 在IAM控制台上,点击 Access management并选择Policies。
- 点击Create Policy。
- 点击JSON。
- 粘贴以下自定义IAM策略,此策略允许对DynamoDB表
lexDR
.进行读取/写入访问。请将策略中的 “xxxxxxxxxxxx”部分替换为您的AWS账户编号。 - 点击Review Policy。
- 将其命名为
DynamoDBReadWrite
,而后点击 Create Policy。 - 在IAM控制台上,点击 Access management 下的Roles ,而后点击Create Role。
- 为该服务选择 Lambda,而后点击 Next。
- 附加以下权限策略:
AWSLambdaBasicExecutionRole
AmazonLexRunBotsOnly
DynamoDBReadWrite
- 点击Next: Tags。接下来,点击Next: Review以跳过Tags页面。
- 将角色命名为
lexDRRole
,而后点击 Save。
部署区域检查函数
我们首先需要创建一项Lambda函数,用于从DynamoDB表中读取记录,借此判断哪个Amazon Lex机器人与Amazon Connect实例处于同一区域当中。Amazon Connect或者使用此机器人的应用程序后续将调用此函数。
- 在Lambda控制台上,选择 Create function。
- 在Function name部分,输入
lexDRGetRegion
。 - 在Runtime部分, 选择 Python 3.8。
- 在Permissions之下, 选择 Use an existing role。
- 选择角色
lexDRRole
。 - 选择 Create function。
- 在Lambda代码编辑器中,输入以下代码(下载自 lexDRGetRegion.zip):
- 在Environment variables部分, 选择 Edit。
- 添加一项环境变量,其中 Key 为
TABLE_NAME
, Value为lexDR
。 - 点击 Save 以保存该环境变量。
- 点击 Save 以保存该Lambda函数。
部署运行状况检查函数
在 us-east-1
当中创建另一项Lambda函数,用以实现运行状况检查功能。
- 在Lambda控制台上, 选择 Create function。
- 在Function name部分,输入
lexDRTest
。 - 在Runtime部分, 选择 Python 3.8。
- 在Permissions之下, 选择 Use an existing role。
- 选择
lexDRRole
。 - 选择 Create function。
- 在Lambda代码编辑器中,输入以下代码(下载自 lexDRTest.zip):
- 在 Environment variables部分, 选择 Edit, 而后添加以下环境变量:
- BOTNAME –
OrderFlowers
- BOT_ALIAS –
ver_one
- SAMPLE_UTTERANCE –
I would like to order some flowers.
(向机器人发送的示例话语。) - EXPECTED_RESPONSE –
What type of flowers would you like to order?
(机器人在收到以上示例话语后应做出的预期响应。) - PRIMARY_REGION –
us-east-1
- SECONDARY_REGION –
us-west-2
- TABLE_NAME –
lexDR
- TEST_METHOD –
put_session
orsend_message
- send_message : 此方法将调用Lex运行时函数postText,该函数将提取语音并将其映射至训练得出的某一intent。postText将测试Lex的自然语言理解能力,每项请求的使用成本为0.00075美元,几乎可以忽略不计。
- put_session: 此方法将调用Lex运行时函数put_session,该函数为用户创建一个新的会话。put_session不会测试Lex的自然语言理解能力。
- TEST_USER –
test
- BOTNAME –
- 点击Save以保存此环境变量。
- 在Basic Settings section当中,将Timeout的值更新为 15 秒。
- 点击Save以保存此Lambda函数。
创建一条Amazon CloudWatch规则
为了每5分钟触发一次运行状况检查函数,我们需要创建一条Amazon CloudWatch规则。
- 在CloudWatch控制台的Events之下, 选择 Rules。
- 选择 Create rule。
- 在Event Source之下,将选项切换为 Schedule。
- 将Fixed rate of 设置为5 minutes。
- 在 Targets之下, 选择 Add target.
- 选择目标 Lambda function。
- 在 Function部分, 选择
lexDRTest
. - 在Configure input之下, 选择 Constant(JSON text),而后输入 {}
- 选择 Configure details。
- 在Rule definition之下的Name部分,输入
lexHealthCheckRule
。 - 选择 Create rule。
现在,您应该已经建立起lexHealthCheckRule
CloudWatch规则,能够每5分钟调用一次lexDRTest
函数。这项操作将检查您主机器人的运行状况是否正常,并将结果对应更新至DynamoDB表。
创建Amazon Connect实例
现在,我们需要创建一个Amazon Connect实例,借此在创建lexDRTest
函数的同一区域之内测试机器人的多区域模式。
- 如果您还没有Amazon Connect实例,请首先创建一个。
- 在Amazon Connect控制台上,选择作为Amazon Connect传输流目标的实例别名。
- 选择 Contact flows。
- 在Amazon Lex之下,从
us-east-1
区域中选择OrderFlowers
机器人,而后点击 Add Lex Bot。 - 在
us-west-2
区域中选择OrderFlowers
机器人,而后点击Add Lex Bot。 - 在AWS Lambda之下,选择
lexDRGetRegion
并点击 Add Lambda Function。 - 点击左侧面板中的 Overview再点击登录链接,借此登录至您的Amazon Connect实例。
- 点击左侧面板中的 Routing,而后点击下拉菜单中的 Contact Flows。
- 点击 Create Contact Flow 按钮。
- 点击 Save 按钮旁的向下箭头按钮,再点击 Import Flow。
- 下载联系流程 Flower DR Flow。在Import Flow 对话框中上传此文件。
- 在Contact Flow中,点击 Inovke AWS Lambda Function部分,借此在屏幕右侧打开一个属性面板。
- 选择
lexDRGetRegion
并点击Save。 - 点击 Publish按钮,发布当前联系流程。
将电话号码关联至联系流程
接下来,我们需要将电话号码关联至联系流程,借此调用并测试OrderFlowers机器人。
- 点击左侧导航栏中的 Routing选项。
- 点击Phone Numbers。
- 点击Claim Number。
- 选择您的国家代码并选择电话号码。
- 在Contact flow/IVR 选择框中,选择我们在之前步骤中导入的联系流程
Flower DR Flow
。 - 等待几分钟,而后呼叫该号码以与OrderFlowers机器人交互。
测试集成效果
要测试这套解决方案,您可以执行以下操作以模拟us-east-1区域发生故障的场景:
- 在
us-east-1
区域中打开Amazon Lex控制台。 - 选择
OrderFlowers
机器人。 - 点击 Settings。
- 删除机器人别名
ver_one
在下一次进行运行状况检查时,解决方案将尝试与us-east-1区域的Lex机器人进行通信。由于机器人别名不存在,因此无法获得成功响应。因此,本示例随后会呼叫辅助区域us-west-2并收到成功响应。在收到响应后,示例将使用us-west-2更新lexDR以及DynamoDB表中的lexRegion列。
接下来,所有指向us-east-1区域内Connect的后续呼叫都将与us-west-2区域内的Lex机器人进行实际交互。通过这一自动切换,可以证明当前架构模式确实能够在发生服务故障时保障业务连续性。
在删除机器人别名到下一次运行状况检查之间的时段内,对Amazon Connect的呼叫都将失败。但在运行状况检查之后,系统将自动实现业务连续性保障。因此,每一轮运行状况检查之间的间隔越短,则停机时间越短。您可以通过编辑Amazon CloudWatch规则lexHealthCheckRule
以调整每次运行状况检查之间的间隔时长。
要让 us-east-1
区域再次通过运行状况检查,请在 us-east-1
中重新创建 OrderFlowers
机器人的别名 ver_one
。
资源清理
为了避免产生不必要的额外成本,请删除本示例中创建的所有资源。
- 创建在
us-east-1
与us-west-2
当中的Amazon Lex机器人OrderFlowers
- CloudWatch规则
lexHealthCheckRule
- DynamoDB表
lexDR
- Lambda函数
lexDRTest
与lexDRGetRegion
- IAM角色
lexDRRole
- 联系流程
Flower DR Flow
总结
配合Amazon Lex提供的自助服务,Amazon Connect将帮助您轻松创建便捷直观的客户服务体验。本文提供一种跨区域形式的高可用性实现方法,保证能够在某一区域中的机器人或支持实现API不可用时,使用来自其他区域的资源以继续响应客户呼叫。