不晓得从什么时候开始,当咱们分割一些企业的客服时,越来越多的分割和反对工作都开始由AI机器人程序代为实现了。无论是电话下单,查问订单状态,征询业务问题,或者其余什么类型的求助,这些机器人通常都能很好地实现,而一些比拟「黑科技」的机器人,甚至在胜利解决问题之后,咱们都无奈判断电话那头的到底是人还是程序……
就是因为成果太好,很多企业甚至曾经开始次要通过这种形式向用户提供服务,甚至开始缩减人工客服的岗位。那么这就可能产生一个问题:如果机器人客服的程序挂了,你的客户该由谁来提供服务?
如果你的智能客服是基于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账户编号。
{ "Version": "2012-10-17", "Statement": [{ "Sid": "VisualEditor0", "Effect": "Allow", "Action": ["dynamodb:GetItem", "dynamodb:UpdateItem"], "Resource": "arn:aws:dynamodb:us-east-1:xxxxxxxxxxxx:table/lexDR" }]}
- 点击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):
import jsonimport boto3import osimport loggingdynamo_client=boto3.client('dynamodb')logger = logging.getLogger()logger.setLevel(logging.DEBUG)def getCurrentPrimaryRegion(key): result = dynamo_client.get_item( TableName=os.environ['TABLE_NAME'], Key = { "connectRegion": {"S": key } } ) logger.debug(result['Item']['lexRegion']['S'] ) return result['Item']['lexRegion']['S']def lambda_handler(event, context): logger.debug(event) region = event["Details"]["Parameters"]["region"] return { 'statusCode': 200, 'primaryCode': getCurrentPrimaryRegion(region) }
- 在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):
import jsonimport boto3import sysimport osdynamo_client = boto3.client('dynamodb')primaryRegion = os.environ['PRIMARY_REGION']secondaryRegion = os.environ['SECONDARY_REGION']tableName = os.environ['TABLE_NAME']primaryRegion_client = boto3.client('lex-runtime',region_name=primaryRegion)secondaryRegion_client = boto3.client('lex-runtime',region_name=secondaryRegion)def getCurrentPrimaryRegion(): result = dynamo_client.get_item( TableName=tableName, Key={ 'connectRegion': {'S': primaryRegion} } ) return result['Item']['lexRegion']['S']def updateTable(region): result = dynamo_client.update_item( TableName= tableName, Key={ 'connectRegion': {'S': primaryRegion } }, UpdateExpression='set lexRegion = :region', ExpressionAttributeValues={ ':region': {'S':region} } )#SEND MESSAGE/PUT SESSION ENV VAdef put_session(botname, botalias, user, region): print(region,botname, botalias) client = primaryRegion_client if region == secondaryRegion: client = secondaryRegion_client try: response = client.put_session(botName=botname, botAlias=botalias, userId=user) if (response['ResponseMetadata'] and response['ResponseMetadata']['HTTPStatusCode'] and response['ResponseMetadata']['HTTPStatusCode'] != 200) or (not response['sessionId']): return 501 else: if getCurrentPrimaryRegion != region: updateTable(region) return 200 except: print('ERROR: {}',sys.exc_info()[0]) return 501def send_message(botname, botalias, user, region): print(region,botname, botalias) client = primaryRegion_client if region == secondaryRegion: client = secondaryRegion_client try: message = os.environ['SAMPLE_UTTERANCE'] expectedOutput = os.environ['EXPECTED_RESPONSE'] response = client.post_text(botName=botname, botAlias=botalias, userId=user, inputText=message) if response['message']!=expectedOutput: print('ERROR: Expected_Response=Success, Response_Received='+response['message']) return 500 else: if getCurrentPrimaryRegion != region: updateTable(region) return 200 except: print('ERROR: {}',sys.exc_info()[0]) return 501def lambda_handler(event, context): print(event) botName = os.environ['BOTNAME'] botAlias = os.environ['BOT_ALIAS'] testUser = os.environ['TEST_USER'] testMethod = os.environ['TEST_METHOD'] if testMethod == 'send_message': primaryRegion_response = send_message(botName, botAlias, testUser, primaryRegion) else: primaryRegion_response = put_session(botName, botAlias, testUser, primaryRegion) if primaryRegion_response != 501: primaryRegion_client.delete_session(botName=botName, botAlias=botAlias, userId=testUser) if primaryRegion_response != 200: if testMethod == 'send_message': secondaryRegion_response = send_message(botName, botAlias, testUser, secondaryRegion) else: secondaryRegion_response = put_session(botName, botAlias, testUser, secondaryRegion) if secondaryRegion_response != 501: secondaryRegion_client.delete_session(botName=botName, botAlias=botAlias, userId=testUser) if secondaryRegion_response != 200: updateTable('err') #deleteSessions(botName, botAlias, testUser) return {'statusCode': 200,'body': 'Success'}
在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或send_message
- send_message:此办法将调用Lex运行时函数postText,该函数将提取语音并将其映射至训练得出的某一intent。postText将测试Lex的自然语言理解能力,每项申请的应用老本为0.00075美元,简直能够忽略不计。
- put_session:此办法将调用Lex运行时函数put_session,该函数为用户创立一个新的会话。put_session不会测试Lex的自然语言理解能力。
- TEST_USER – test
- 点击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不可用时,应用来自其余区域的资源以持续响应客户呼叫。