本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
将调用路由到 Amazon Chime SDK PSTN 音频的 AWS Lambda 函数 ()AWS CLI
本教程将指导您完成使用 Amazon Chime SDK PSTN 音频服务设置到 Lambda 函数的呼叫路由的过程。您将学习如何创建 Lambda 函数、设置 SIP 媒体应用程序以及配置 SIP 规则来处理来电。
先决条件
在开始本教程之前,请务必执行以下操作:
安装 AWS CLI。有关更多信息,请参阅《AWS CLI 用户指南》中的 Installing or updating to the latest version of the AWS CLI。
使用适当的 AWS CLI 凭据配置您的。如果尚未设置凭证,请运行
aws configure
。对 Amazon Chime 软件开发 AWS Lambda 工具包的概念有基本的了解。
设置足够的权限以在您的 AWS 账户中创建和管理 Amazon Chime 软件开发工具包和 Lambda 资源。
对于基于电话号码的路由,您需要在 Amazon Chime SDK 的电话号码清单中有一个电话号码。
对于基于语音连接器的路由,您需要在帐户中配置语音连接器。
成本考虑因素
本教程包含清理说明,以确保完成后不会产生持续的费用。有关更多信息,请参阅 Amazon Chime 软件开发工具包
让我们开始为 Amazon Chime SDK PSTN 音频设置呼叫路由。
搜索和配置电话号码
在使用电话号码触发器创建 SIP 规则之前,您需要在 Amazon Chime SDK 库存中包含电话号码。以下是搜索可用电话号码并进行配置的方法。
例 : 搜索可用的电话号码
# Search for available toll-free phone numbers aws chime-sdk-voice search-available-phone-numbers \ --phone-number-type TollFree \ --country US \ --toll-free-prefix 844 \ --max-results 5 \ --region us-east-1
此命令在美国搜索前缀为 844 的可用免费电话号码。您可以修改参数以搜索不同类型的数字。
例 : 配置电话号码
找到可用的电话号码后,您可以使用以下命令进行配置:
# Order a phone number aws chime-sdk-voice create-phone-number-order \ --product-type SipMediaApplicationDialIn \ --e164-phone-numbers "
+18445550100
" \ --region us-east-1
+18445550100
替换为搜索结果中的实际可用电话号码。此命令会将电话号码配置到您的帐户。
例 : 检查电话号码状态
订购电话号码后,您可以查看其状态:
# Get the phone number order status aws chime-sdk-voice get-phone-number-order \ --phone-number-order-id abcd1234-5678-90ab-cdef-EXAMPLE55555 \ --region us-east-1
将订单编号替换为create-phone-number-order
命令返回的订单编号。
例 : 在库存中列出电话号码
要查看库存中的所有电话号码,请执行以下操作:
# List all phone numbers aws chime-sdk-voice list-phone-numbers \ --region us-east-1
要查找可用于 SIP 规则的未分配电话号码,请执行以下操作:
# List unassigned phone numbers aws chime-sdk-voice list-phone-numbers \ --region us-east-1 \ --query "PhoneNumbers[?Status=='Unassigned'].E164PhoneNumber"
创建用于呼叫处理的 Lambda 函数
现在,让我们创建一个用于处理来电的 Lambda 函数。该函数将接收来自 PSTN 音频服务的事件,并以如何处理呼叫的说明进行响应。
例 : 为 Lambda 创建 IAM 角色
在创建 Lambda 函数之前,您需要创建一个授予必要权限的 IAM 角色。
cat > lambda-trust-policy.json << EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } EOF
aws iam create-role --role-name ChimeSDKLambdaRole \ --assume-role-policy-document file://lambda-trust-policy.json
aws iam attach-role-policy --role-name ChimeSDKLambdaRole \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
这些命令创建一个 IAM 角色,允许 Lambda 代入该角色并附加基本执行策略,该策略为 Lambda 提供写入日志的权限。 CloudWatch
例 创建 Lambda 函数:
现在,创建一个用于处理来电的简单 Lambda 函数。
mkdir -p lambda cat > lambda/index.js << EOF exports.handler = async (event) => { console.log('Received event:', JSON.stringify(event, null, 2)); // Simple call handling logic const response = { SchemaVersion: '1.0', Actions: [ { Type: 'Speak', Parameters: { Engine: 'neural', Text: 'Hello! This is a test call from Amazon Chime SDK PSTN Audio.', VoiceId: 'Joanna' } }, { Type: 'Hangup', Parameters: { SipResponseCode: '200' } } ] }; return response; }; EOF
cd lambda zip -r function.zip index.js cd ..
# Get your AWS account ID ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) aws lambda create-function \ --function-name ChimeSDKCallHandler \ --runtime nodejs18.x \ --role arn:aws:iam::${ACCOUNT_ID}:role/ChimeSDKLambdaRole \ --handler index.handler \ --zip-file fileb://lambda/function.zip
此 Lambda 函数用语音消息回应来电,然后挂断电话。
例 : 为亚马逊 Chime 软件开发工具包添加 Lambda 权限
向 Amazon Chime 软件开发工具包服务授予调用您的 Lambda 函数的权限。
# Get your AWS account ID ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) aws lambda add-permission \ --function-name ChimeSDKCallHandler \ --statement-id ChimeSDK \ --action lambda:InvokeFunction \ --principal voiceconnector.chime.amazonaws.com \ --source-account ${ACCOUNT_ID}
此命令允许 Amazon Chime SDK 语音连接器服务调用您的 Lambda 函数。
创建 SIP 媒体应用程序
SIP 媒体应用程序将您的 Lambda 函数连接到 PSTN 音频服务。在本节中,您将创建一个使用您的 Lambda 函数的 SIP 媒体应用程序。
例 : 创建 SIP 媒体应用程序
# Get your Lambda function ARN LAMBDA_ARN=$(aws lambda get-function --function-name ChimeSDKCallHandler --query Configuration.FunctionArn --output text) aws chime-sdk-voice create-sip-media-application \ --aws-region us-east-1 \ --name "MyCallHandlerApp" \ --endpoints "[{\"LambdaArn\":\"${LAMBDA_ARN}\"}]"
SIP 媒体应用程序充当 PSTN 音频服务和您的 Lambda 函数之间的桥梁。
例 : 获取 SIP 媒体应用程序 ID
创建 SIP 媒体应用程序后,您需要检索其 ID 以供本教程的后面部分使用。
SIP_MEDIA_APP_ID=$(aws chime-sdk-voice list-sip-media-applications \ --query "SipMediaApplications[?Name=='MyCallHandlerApp'].SipMediaApplicationId" \ --output text) echo "SIP Media Application ID: ${SIP_MEDIA_APP_ID}"
记下此命令返回的 SIP 媒体应用程序 ID,因为在创建 SIP 规则时需要它。
使用 SIP 规则设置呼叫路由
SIP 规则决定如何将来电路由到您的 SIP 媒体应用程序。您可以根据电话号码或语音连接器主机名创建规则。
例 : 使用电话号码触发器创建 SIP 规则
要根据电话号码路由呼叫,请使用以下命令:
# Get an unassigned phone number from your inventory PHONE_NUMBER=$(aws chime-sdk-voice list-phone-numbers \ --query "PhoneNumbers[?Status=='Unassigned'].E164PhoneNumber | [0]" \ --output text) # If no unassigned phone number is found, you'll need to provision one if [ -z "$PHONE_NUMBER" ] || [ "$PHONE_NUMBER" == "None" ]; then echo "No unassigned phone numbers found. Please provision a phone number first." exit 1 fi echo "Using phone number: ${PHONE_NUMBER}" aws chime-sdk-voice create-sip-rule \ --name "IncomingCallRule" \ --trigger-type ToPhoneNumber \ --trigger-value "${PHONE_NUMBER}" \ --target-applications "[{\"SipMediaApplicationId\":\"${SIP_MEDIA_APP_ID}\",\"Priority\":1}]"
此命令创建一个 SIP 规则,用于将拨打您电话号码的呼叫路由到您的 SIP 媒体应用程序。
例 : 使用请求 URI 主机名触发器创建 SIP 规则
或者,您可以根据传入的语音连接器 SIP 呼叫的请求 URI 来路由呼叫:
# Replace with your Voice Connector hostname VOICE_CONNECTOR_HOST="
example
.voiceconnector.chime.aws" aws chime-sdk-voice create-sip-rule \ --name "VoiceConnectorRule" \ --trigger-type RequestUriHostname \ --trigger-value "${VOICE_CONNECTOR_HOST}" \ --target-applications "[{\"SipMediaApplicationId\":\"${SIP_MEDIA_APP_ID}\",\"Priority\":1}]"
将主机名替换为语音连接器的出站主机名。
使用多个 SIP 媒体应用程序设置冗余
为了实现冗余和故障转移,您可以在同一 AWS 区域创建多个 SIP 媒体应用程序并指定其优先顺序。
例 : 创建备份 Lambda 函数
首先,在同一区域创建备份 Lambda 函数。
cat > lambda/backup-index.js >< EOF exports.handler = async (event) => { console.log('Received event in backup handler:', JSON.stringify(event, null, 2)); // Simple call handling logic for backup const response = { SchemaVersion: '1.0', Actions: [ { Type: 'Speak', Parameters: { Engine: 'neural', Text: 'Hello! This is the backup handler for Amazon Chime SDK PSTN Audio.', VoiceId: 'Matthew' } }, { Type: 'Hangup', Parameters: { SipResponseCode: '200' } } ] }; return response; }; EOF
cd lambda zip -r backup-function.zip backup-index.js cd ..
# Get your AWS account ID ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) aws lambda create-function \ --function-name ChimeSDKBackupHandler \ --runtime nodejs18.x \ --role arn:aws:iam::${ACCOUNT_ID}:role/ChimeSDKLambdaRole \ --handler backup-index.handler \ --zip-file fileb://lambda/backup-function.zip
例 : 在备份功能中添加 Amazon Chime 软件开发工具包的 Lambda 权限
# Get your AWS account ID ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) aws lambda add-permission \ --function-name ChimeSDKBackupHandler \ --statement-id ChimeSDK \ --action lambda:InvokeFunction \ --principal voiceconnector.chime.amazonaws.com \ --source-account ${ACCOUNT_ID}
例 : 创建备份 SIP 媒体应用程序
# Get your backup Lambda function ARN BACKUP_LAMBDA_ARN=$(aws lambda get-function --function-name ChimeSDKBackupHandler --query Configuration.FunctionArn --output text) aws chime-sdk-voice create-sip-media-application \ --aws-region us-east-1 \ --name "BackupCallHandlerApp" \ --endpoints "[{\"LambdaArn\":\"${BACKUP_LAMBDA_ARN}\"}]" # Get the backup SIP media application ID BACKUP_SIP_MEDIA_APP_ID=$(aws chime-sdk-voice list-sip-media-applications \ --query "SipMediaApplications[?Name=='BackupCallHandlerApp'].SipMediaApplicationId" \ --output text)
例 : 获取 SIP 规则 ID
SIP_RULE_ID=$(aws chime-sdk-voice list-sip-rules \ --query "SipRules[?Name=='IncomingCallRule'].SipRuleId" \ --output text)
例 : 更新 SIP 规则以包括两个具有优先级的应用程序
aws chime-sdk-voice update-sip-rule \ --sip-rule-id ${SIP_RULE_ID} \ --target-applications "[{\"SipMediaApplicationId\":\"${SIP_MEDIA_APP_ID}\",\"Priority\":1},{\"SipMediaApplicationId\":\"${BACKUP_SIP_MEDIA_APP_ID}\",\"Priority\":2}]"
此命令更新 SIP 规则,使其包括主 SIP 媒体应用程序和备份 SIP 媒体应用程序及其各自的优先级。
创建出站呼叫
您还可以使用 API 创建调用您的 Lambda 函数的出站调用。CreateSIPMediaApplicationCall
# Use a phone number from your inventory for outbound calling FROM_PHONE_NUMBER=${PHONE_NUMBER} TO_PHONE_NUMBER="
+12065550102
" # Replace with a valid destination number aws chime-sdk-voice create-sip-media-application-call \ --from-phone-number "${FROM_PHONE_NUMBER}" \ --to-phone-number "${TO_PHONE_NUMBER}" \ --sip-media-application-id ${SIP_MEDIA_APP_ID}
将目标电话号码替换为有效的号码。您需要在库存中包含电话号码才能拨打真实电话。
在激活的呼叫期间触发 Lambda
您可以使用 API 在活动调用期间触发您的 Lambda 函数。UpdateSIPMediaApplicationCall
# Replace with an actual transaction ID from an active call TRANSACTION_ID="
txn-3ac9de3f-6b5a-4be9-9e7e-EXAMPLE33333
" aws chime-sdk-voice update-sip-media-application-call \ --sip-media-application-id ${SIP_MEDIA_APP_ID} \ --transaction-id ${TRANSACTION_ID} \ --arguments '{"action":"custom-action"}'
当调用处于活动状态时,将在发送给您的 Lambda 函数的事件数据中提供交易 ID。
清理资源
完成本教程后,应删除自己创建的资源,以免产生额外费用。
例 : 删除 SIP 规则
# Get the SIP rule ID if you don't have it SIP_RULE_ID=$(aws chime-sdk-voice list-sip-rules \ --query "SipRules[?Name=='IncomingCallRule'].SipRuleId" \ --output text) aws chime-sdk-voice delete-sip-rule --sip-rule-id ${SIP_RULE_ID}
例 : 删除 SIP 媒体应用程序
# Get SIP media application IDs if you don't have them SIP_MEDIA_APP_ID=$(aws chime-sdk-voice list-sip-media-applications \ --query "SipMediaApplications[?Name=='MyCallHandlerApp'].SipMediaApplicationId" \ --output text) BACKUP_SIP_MEDIA_APP_ID=$(aws chime-sdk-voice list-sip-media-applications \ --query "SipMediaApplications[?Name=='BackupCallHandlerApp'].SipMediaApplicationId" \ --output text) aws chime-sdk-voice delete-sip-media-application --sip-media-application-id ${SIP_MEDIA_APP_ID} aws chime-sdk-voice delete-sip-media-application --sip-media-application-id ${BACKUP_SIP_MEDIA_APP_ID}
例 : 删除 Lambda 函数
aws lambda delete-function --function-name ChimeSDKCallHandler aws lambda delete-function --function-name ChimeSDKBackupHandler
例 : 删除 IAM 角色
aws iam detach-role-policy --role-name ChimeSDKLambdaRole \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole aws iam delete-role --role-name ChimeSDKLambdaRole
例 : 发布电话号码
如果您不再需要电话号码,可以将其释放:
# List phone numbers aws chime-sdk-voice list-phone-numbers # Delete a specific phone number aws chime-sdk-voice delete-phone-number --phone-number-id ${PHONE_NUMBER}
请注意,电话号码会在 7 天内进入 ReleaseInProgress “” 状态,然后才会完全发布。在此期间,如果需要,您可以使用restore-phone-number
命令恢复它们。
投入生产
本教程演示了使用 Amazon Chime SDK PSTN 音频将调用路由到 Lambda 函数的基本功能。但是,对于生产环境,您应该考虑以下最佳实践:
安全性注意事项
实现最低权限权限。创建仅授予您的 Lambda 函数所需的特定权限的自定义 IAM 策略。
在 Lambda 权限中添加源 ARN 条件。限制哪些 SIP 媒体应用程序可以调用您的 Lambda 函数。
实现输入验证。为您的 Lambda 函数添加验证,确保它们仅处理有效事件。
考虑部署 VPC。为了增强安全性,请在具有相应安全组的 VPC 内部署 Lambda 函数。
加密敏感数据。 AWS Key Management Service 用于加密应用程序使用的任何敏感数据。
架构注意事项
实现监控和日志记录。设置 CloudWatch 警报和日志以监控应用程序的运行状况和性能。
添加错误处理。在您的 Lambda 函数中实现全面的错误处理。
考虑缩放限制。如果呼叫量大,请注意服务配额和请求的增加。
实现基础架构即代码。使用 AWS CloudFormation 或 AWS CDK 来部署您的基础架构。
设置 CI/CD 管道。为您的 Lambda 函数实施持续集成和部署。
有关构建生产就绪应用程序的更多信息,请参阅:
后续步骤
现在,您已经学习了如何使用 Amazon Chime SDK PSTN 音频将调用路由到 Lambda 函数,您可以探索更多高级功能:
与 Amazon Lex 集成,以管理智能代理场景的对话交互。有关更多信息,请参阅 创建用于 Amazon Chime SDK 消息传递的 Amazon Lex V2 机器人。
设置语音分析以从您的通话中获取见解。有关更多信息,请参阅 针对 Amazon Chime SDK 使用呼叫分析从呼叫中生成见解。
探索高级呼叫控制操作以构建复杂的呼叫流程。有关更多信息,请参阅 针对 Amazon Chime SDK 使用呼叫分析配置。