华为云用户手册

  • 设置Exchange持久化 在RabbitMQ WebUI页面设置Exchange持久化。 创建Exchange时,设置“durable”为“true”,如图1所示。 图1 设置Exchange持久化(WebUI) 设置成功后如图2所示。 图2 持久化的Exchange(WebUI) 在RabbitMQ实例控制台设置Exchange持久化。 创建Exchange时,设置Exchange持久化,如图3所示。 图3 设置Exchange持久化(控制台) 设置成功后如图4所示。 图4 持久化的Exchange(控制台)
  • 分布式消息服务RabbitMQ版计费模式概述 分布式消息服务RabbitMQ版提供包年/包月和按需计费两种计费模式,以满足不同场景下的用户需求。如您需要快速了解分布式消息服务RabbitMQ版的具体计费模式对应的具体价格,请参见分布式消息服务RabbitMQ版价格详情。 包年/包月:一种预付费模式,即先付费再使用,按照订单的购买周期进行结算。购买周期越长,享受的折扣越大。一般适用于业务需求量长期稳定的成熟业务。 按需计费:一种后付费模式,即先使用再付费,按照RabbitMQ实例实际使用时长计费,秒级计费,按小时结算。按需计费模式允许您根据实际业务需求灵活地调整资源使用,无需提前预置资源,从而降低预置过多或不足的风险。一般适用于电商抢购等业务需求量瞬间大幅波动的场景。 表1列出了两种计费模式的区别。 表1 计费模式 计费模式 包年/包月 按需计费 付费方式 预付费 按照订单的购买周期结算。 后付费 按照RabbitMQ实例实际使用时长计费。 计费周期 按订单的购买周期计费。 秒级计费,按小时结算。 适用计费项 实例费用、存储空间费用 实例费用、存储空间费用 变更计费模式 支持变更为按需计费模式。 但包年/包月资费模式到期后,按需的资费模式才会生效。 支持变更为包年/包月计费模式。 变更规格 支持变更实例规格。 支持变更实例规格。 回收站中实例是否计费 开启回收站策略的包年/包月实例,退订后会存入回收站中,此时不收取实例费用,但是会按需收取存储空间费用。 从回收站中恢复的包年/包月实例,计费模式会变为按需计费。 开启回收站策略的按需实例,删除后会存入回收站中,此时不收取实例费用,按需收取存储空间费用。 适用场景 适用于可预估资源使用周期的场景,价格比按需计费模式更优惠。对于长期使用者,推荐该方式。 适用于资源需求波动的场景,可以随时开通,随时删除。 父主题: 计费模式
  • 云桌面 支持哪些华为云会议视频画面功能? 不同规格的华为云桌面,可支持的华为云会议视频画面功能如下表所示。 表1 不同规格云桌面的会议视频画面功能 云桌面规格 2U 4U 8U 8U以上 云会议视频发送最大分辨率 不支持 不支持 360P 1080P 云会议视频接收最大分辨率 360P 360P 360P 1080P 云会议视频画面最大数量 4画面 9画面 9画面 25画面 会议中开启摄像头 不支持 不支持 支持 支持 云会议视频画面发送帧率(帧/秒) 不支持 不支持 15 15 云会议视频画面接收帧率(帧/秒) 15 15 15 15 云会议共享画面发送帧率(帧/秒) 15 15 15 15 云会议共享画面接收帧率(帧/秒) 1-15 1-15 1-15 1-15 父主题: 产品规格
  • 上行短信和下行短信分别是什么?如何关联? 上行短信是指短信接收方收到短信后,回复的短信。 下行短信是指调用发送短信API,通过运营商下发到短信接收方手机的短信。 通过接收手机号+通道号组合,可以关联下行短信和上行短信,示例如下: 下行短信接收号码收到短信并直接回复时,可以实现下行短信与上行短信的关联;如果更换其他号码回复短信,即下行短信接收号码和上行短信发送号码不一致时,则无法实现关联。 针对同一个通道号,同一个下行短信接收号码,仅有一条下行短信时,可以实现下行短信与上行短信的关联;如果存在多条下行短信,则无法实现一对一关联。 如果您对下行短信和上行短信的关联有明确要求,请联系华为云客服,报备业务场景,申请通道号支持自定义扩展码。 数据项 1.客户发送下行短信 2.响应消息 3.用户回复短信 4.上行短信通知 通道号 from from (上行短信) to 模板ID templateId - - 下行短信接收号码(上行短信发送号码) to originTo from 下行短信ID - smsMsgId - 用户回复的短信内容 - - body 上行短信ID - - smsMsgId 父主题: 其他问题
  • 签名规范 格式规范 签名名称区分英文大小写,如:“ABC001”和“abc001”是两个不同的签名名称。 申请签名时只需填写签名名称,系统会自动为您加上【】。 长度规范 签名名称要求2~16个字符(只能包含中文、数字、字母,不能为纯数字,单个中文、数字、字母都按一个字计算)。 内容规范 不支持中性化签名,需能辨别所属公司或公司归属的网站、产品、APP,建议为签名来源的全称或简称。 签名不能含有黄赌毒及其他违反法律法规的内容。
  • 签名审核驳回原因及处理建议是什么? 一级问题 二级问题 处理建议 材料或来源错误 提交资料与公众号/小程序、APP等主体不一致 检查是否填错了签名(错别字、同音字等)。 检查是否提交错材料,如本来需要提交A营业执照,结果上传时误选了B营业执照。 未查询到相关小程序或公众号 检查是否填错了签名(错别字、同音字等)。 确认小程序/公众号是否已上线。 签名与企业名称不一致 签名并非企业全称或简称,而是公司产品,可在申请说明中提供官网产品介绍链接。 若签名为公司商标、APP等,请选择合适的签名来源。 选择签名来源为APP应用而未提供相关下载链接 请在“APP应用下载地址”输入框中填写带有开发者信息的APP下载链接。 未查询到商标 检查是否填错了签名(错别字、同音字等)。 可到“中国商标网”核实商标信息。 资料图片无法显示 可能是由于上传时文件损坏导致不显示,一般确保文件格式正确,重新上传即可。 网站取名工信部备案网站 域名 未查询到的 看是否为提供的域名填错。 可到信息备案管理系统自检。 签名来源为电商店铺名,未提供所属电商平台 请在“电商平台店铺地址”输入框中填写电商平台店铺链接。 自建商城的可填写商城链接以供核实。 涉及第三方,上传的营业执照是申请方的 涉及第三方权益的签名,需提供的是签名归属方的营业执照。 业务类型不支持 推广、通知签名属于不支持的行业 有些行业并不支持发送所有类型的短信,详情可参照模板规范和变量规范。 格式错误 签名名称要求2~16个字,只能包含中文、数字、字母,不能为纯数字 国内短信尽可能使用中文签名,若签名为公司英文名等,可提供一下公司的官网链接等以便查证。 中性签名,签名不能很好的辨别企事业单位或公司产品、APP等 建议严格按照所选签名来源拟定签名,在有较多相似名称产品时,使用全称。 父主题: 故障排除
  • 签名规范 格式规范 签名名称区分英文大小写,如:“ABC001”和“abc001”是两个不同的签名名称。 申请签名时只需填写签名名称,系统会自动为您加上【】。 长度规范 签名名称要求2~16个字符(只能包含中文、数字、字母,不能为纯数字,单个中文、数字、字母都按一个字计算)。 内容规范 不支持中性化签名,需能辨别所属公司或公司归属的网站、产品、APP,建议为签名来源的全称或简称。 签名不能含有黄赌毒及其他违反法律法规的内容。
  • “呼叫状态通知API”代码样例 /** * 呼叫事件通知 * 客户平台收到RTC业务平台的呼叫事件通知的接口通知 */ //呼叫事件通知样例 var jsonBody = JSON.stringify({ 'eventType': 'callout', 'statusInfo': { 'sessionId': '1201_612_4294967295_20190124030424@callenabler245.huaweicaas.com', 'timestamp': '2019-01-24 03:04:24', 'caller': '+8613800000022', 'called': '+8613800000021' } }); console.log('jsonBody:', jsonBody); /** * 呼叫事件通知 * @brief 详细内容以接口文档为准 * @param jsonBody */ function onCallEvent(jsonBody) { var jsonObj = JSON.parse(jsonBody); //将通知消息解析为jsonObj var eventType = jsonObj.eventType; //通知事件类型 if ('fee' === eventType) { console.log('EventType error:', eventType); return; } if (!jsonObj.hasOwnProperty('statusInfo')) { console.log('param error: no statusInfo.'); return; } var statusInfo = jsonObj.statusInfo; //呼叫状态事件信息 console.log('eventType:', eventType); //打印通知事件类型 //callout:呼出事件 if ('callout' === eventType) { /** * Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 * * 'timestamp': 该呼叫事件发生时RTC业务平台的UNIX时间戳 * 'userData': 用户附属信息 * 'sessionId': 通话链路的标识ID * 'caller': 主叫号码 * 'called': 被叫号码 */ if (statusInfo.hasOwnProperty('sessionId')) { console.log('sessionId:', statusInfo.sessionId); } return; } //alerting:振铃事件 if ('alerting' === eventType) { /** * Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 * * 'timestamp': 该呼叫事件发生时RTC业务平台的UNIX时间戳 * 'userData': 用户附属信息 * 'sessionId': 通话链路的标识ID * 'caller': 主叫号码 * 'called': 被叫号码 */ if (statusInfo.hasOwnProperty('sessionId')) { console.log('sessionId:', statusInfo.sessionId); } return; } //answer:应答事件 if ('answer' === eventType) { /** * Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 * * 'timestamp': 该呼叫事件发生时RTC业务平台的UNIX时间戳 * 'userData': 用户附属信息 * 'sessionId': 通话链路的标识ID * 'caller': 主叫号码 * 'called': 被叫号码 */ if (statusInfo.hasOwnProperty('sessionId')) { console.log('sessionId:', statusInfo.sessionId); } return; } //collectInfo:放音收号结果事件,仅应用于语音通知场景 if ('collectInfo' === eventType) { /** * Example: 此处以解析digitInfo为例,请按需解析所需参数并自行实现相关处理 * * 'timestamp': 该呼叫事件发生时RTC业务平台的UNIX时间戳 * 'sessionId': 通话链路的标识ID * 'digitInfo': 放音收号场景中,RTC业务平台对开发者进行放音收号操作的结果描述 */ if (statusInfo.hasOwnProperty('digitInfo')) { console.log('digitInfo:', statusInfo.digitInfo); } return; } //disconnect:挂机事件 if ('disconnect' === eventType) { /** * Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 * * 'timestamp': 该呼叫事件发生时RTC业务平台的UNIX时间戳 * 'userData': 用户附属信息 * 'sessionId': 通话链路的标识ID * 'caller': 主叫号码 * 'called': 被叫号码 * 'partyType': 挂机的用户类型,仅在语音回呼场景携带 * 'stateCode': 通话挂机的原因值 * 'stateDesc': 通话挂机的原因值的描述 */ if (statusInfo.hasOwnProperty('sessionId')) { console.log('sessionId:', statusInfo.sessionId); } return; } } //呼叫事件处理 onCallEvent(jsonBody);
  • “语音通知场景API”代码样例 /*jshint esversion: 6 */ var https = require('https'); var data = require('./data.js'); var util = require('./reqUtil.js'); /** * voiceNotifyAPI * @param displayNbr * @param calleeNbr * @param playInfoList * @returns */ function voiceNotifyAPI(displayNbr, calleeNbr, playInfoList) { if(displayNbr === undefined || displayNbr === null || calleeNbr === undefined || calleeNbr === null) { return; } if(playInfoList === undefined || playInfoList === null) { return; } var method = 'POST'; var uri = '/rest/httpsessions/callnotify/v2.0'; //v1.0 or v2.0 var xaksk = util.buildAKSKHeader(data.data.callnotify_appid, data.data.callnotify_secret); var options = util.createOptions(method, uri, null, xaksk); var body = { /* 必填参数 */ 'displayNbr': displayNbr,//主叫用户手机终端的来电显示号码。 'calleeNbr': calleeNbr,//被叫用户终端的来电显示号码。 'playInfoList': playInfoList//播放信息列表,最大支持5个,每个播放信息携带的参数都可以不相同。 /* 选填参数 */ // 'bindNbr': '+86123456789', //CallEnabler业务号码,即绑定号码 // 'statusUrl': 'aHR0cDovLzIxOC40LjMzLjU1Ojg4ODgvdGVzdA==', //要获取通话状态需要在请求中加入statusUrl // 'feeUrl': 'aHR0cDovLzIxOC40LjMzLjU1Ojg4ODgvdGVzdA==', //要获取话单需要在请求中加入feeUrl // 'returnIdlePort': 'false', //指示是否需要返回平台空闲呼叫端口数量 // 'userData': 'customerId123' //设置用户的附属信息 }; var req = https.request(options, function (res) { var resHeaders = JSON.stringify(res.headers); res.setEncoding('utf8'); res.on('data', function (chunk) { console.log(chunk); }); }); req.on('error', function(e) { console.error('problem with request: ' + e); }); console.log(JSON.stringify(body)); req.write(JSON.stringify(body)); req.end(); } /** * getPlayInfoList * @param notifyVoice * @param templateId * @param templateParas * @returns */ function getPlayInfoList(notifyVoice, templateId, templateParas) { var playInfoList = [{ 'notifyVoice': notifyVoice,//通知语音的放音文件名 'templateId': templateId,//语音通知模板ID,用于唯一标识语音通知模板。 'templateParas': templateParas,//语音通知模板的变量值列表,用于依次填充templateId参数指定的模板内容中的变量。 // 'collectInd': 0, //是否进行收号 // 'replayAfterCollection': 'false', //设置是否在收号后重新播放notifyVoice或templateId指定的放音 // 'collectContentTriggerReplaying': '1' //设置触发重新放音的收号内容 }]; return playInfoList; } var playInfoList = getPlayInfoList('notifyvoice.wav', 'xxxxxx', ['3', '人民公园正门']); voiceNotifyAPI('+8653159511234', '+8613500000001', playInfoList);
  • “呼叫状态通知API”代码样例 # -*- coding: utf-8 -*- ''' 呼叫事件通知 客户平台收到语音通话平台的呼叫事件通知的接口通知 ''' import json #呼叫事件通知样例 jsonBody = json.dumps({ 'eventType': 'callout', 'statusInfo': { 'sessionId': '1201_612_4294967295_20190124030424@callenabler245.huaweicaas.com', 'timestamp': '2019-01-24 03:04:24', 'caller': '+86138*******2', 'called': '+86138*******1', 'userData': 'customerId123' } }).encode('ascii') print(jsonBody) ''' 呼叫事件通知 @see: 详细内容以接口文档为准 @param param: jsonBody @return: ''' def onCallEvent(jsonBody): jsonObj = json.loads(jsonBody) #将通知消息解析为jsonObj eventType = jsonObj['eventType'] #通知事件类型 if ('fee' == eventType): print('EventType error: ' + eventType) return if ('statusInfo' not in jsonObj): print('param error: no statusInfo.') return statusInfo = jsonObj['statusInfo'] #呼叫状态事件信息 print('eventType: ' + eventType) #打印通知事件类型 #callout:呼出事件 if ('callout' == eventType): ''' Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 'timestamp': 该呼叫事件发生时语音通话平台的UNIX时间戳 'userData': 用户附属信息 'sessionId': 通话链路的标识ID 'caller': 主叫号码 'called': 被叫号码 ''' if ('sessionId' in statusInfo): print('sessionId: ' + statusInfo['sessionId']) return #alerting:振铃事件 if ('alerting' == eventType): ''' Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 'timestamp': 该呼叫事件发生时语音通话平台的UNIX时间戳 'userData': 用户附属信息 'sessionId': 通话链路的标识ID 'caller': 主叫号码 'called': 被叫号码 ''' if ('sessionId' in statusInfo): print('sessionId: ' + statusInfo['sessionId']) return #answer:应答事件 if ('answer' == eventType): ''' Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 'timestamp': 该呼叫事件发生时语音通话平台的UNIX时间戳 'userData': 用户附属信息 'sessionId': 通话链路的标识ID 'caller': 主叫号码 'called': 被叫号码 ''' if ('sessionId' in statusInfo): print('sessionId: ' + statusInfo['sessionId']) return #collectInfo:放音收号结果事件,仅应用于语音通知场景 if ('collectInfo' == eventType): ''' Example: 此处以解析digitInfo为例,请按需解析所需参数并自行实现相关处理 'timestamp': 该呼叫事件发生时语音通话平台的UNIX时间戳 'sessionId': 通话链路的标识ID 'digitInfo': 放音收号场景中,语音通话平台对开发者进行放音收号操作的结果描述 ''' if ('digitInfo' in statusInfo): print('digitInfo: ' + statusInfo['digitInfo']) return #disconnect:挂机事件 if ('disconnect' == eventType): ''' Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 'timestamp': 该呼叫事件发生时语音通话平台的UNIX时间戳 'userData': 用户附属信息 'sessionId': 通话链路的标识ID 'caller': 主叫号码 'called': 被叫号码 'partyType': 挂机的用户类型,仅在语音回呼场景携带 'stateCode': 通话挂机的原因值 'stateDesc': 通话挂机的原因值的描述 ''' if ('sessionId' in statusInfo): print('sessionId: ' + statusInfo['sessionId']) return if __name__ == '__main__': onCallEvent(jsonBody) #呼叫事件处理
  • “呼叫状态通知API”代码样例 # -*- coding: utf-8 -*- ''' 呼叫事件通知 客户平台收到语音通话平台的呼叫事件通知的接口通知 ''' import json #呼叫事件通知样例 jsonBody = json.dumps({ 'eventType': 'callout', 'statusInfo': { 'sessionId': '1201_612_4294967295_20190124030424@callenabler245.huaweicaas.com', 'timestamp': '2019-01-24 03:04:24', 'caller': '+86138*******2', 'called': '+86138*******1', 'userData': 'customerId123' } }).encode('ascii') print(jsonBody) ''' 呼叫事件通知 @see: 详细内容以接口文档为准 @param param: jsonBody @return: ''' def onCallEvent(jsonBody): jsonObj = json.loads(jsonBody) #将通知消息解析为jsonObj eventType = jsonObj['eventType'] #通知事件类型 if ('fee' == eventType): print('EventType error: ' + eventType) return if ('statusInfo' not in jsonObj): print('param error: no statusInfo.') return statusInfo = jsonObj['statusInfo'] #呼叫状态事件信息 print('eventType: ' + eventType) #打印通知事件类型 #callout:呼出事件 if ('callout' == eventType): ''' Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 'timestamp': 该呼叫事件发生时语音通话平台的UNIX时间戳 'userData': 用户附属信息 'sessionId': 通话链路的标识ID 'caller': 主叫号码 'called': 被叫号码 ''' if ('sessionId' in statusInfo): print('sessionId: ' + statusInfo['sessionId']) return #alerting:振铃事件 if ('alerting' == eventType): ''' Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 'timestamp': 该呼叫事件发生时语音通话平台的UNIX时间戳 'userData': 用户附属信息 'sessionId': 通话链路的标识ID 'caller': 主叫号码 'called': 被叫号码 ''' if ('sessionId' in statusInfo): print('sessionId: ' + statusInfo['sessionId']) return #answer:应答事件 if ('answer' == eventType): ''' Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 'timestamp': 该呼叫事件发生时语音通话平台的UNIX时间戳 'userData': 用户附属信息 'sessionId': 通话链路的标识ID 'caller': 主叫号码 'called': 被叫号码 ''' if ('sessionId' in statusInfo): print('sessionId: ' + statusInfo['sessionId']) return #collectInfo:放音收号结果事件,仅应用于语音通知场景 if ('collectInfo' == eventType): ''' Example: 此处以解析digitInfo为例,请按需解析所需参数并自行实现相关处理 'timestamp': 该呼叫事件发生时语音通话平台的UNIX时间戳 'sessionId': 通话链路的标识ID 'digitInfo': 放音收号场景中,语音通话平台对开发者进行放音收号操作的结果描述 ''' if ('digitInfo' in statusInfo): print('digitInfo: ' + statusInfo['digitInfo']) return #disconnect:挂机事件 if ('disconnect' == eventType): ''' Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 'timestamp': 该呼叫事件发生时语音通话平台的UNIX时间戳 'userData': 用户附属信息 'sessionId': 通话链路的标识ID 'caller': 主叫号码 'called': 被叫号码 'partyType': 挂机的用户类型,仅在语音回呼场景携带 'stateCode': 通话挂机的原因值 'stateDesc': 通话挂机的原因值的描述 ''' if ('sessionId' in statusInfo): print('sessionId: ' + statusInfo['sessionId']) return if __name__ == '__main__': onCallEvent(jsonBody) #呼叫事件处理
  • 语音验证码 表4 语音验证码需准备的资源 资源项 对应接口参数 用途 获取方式 APP_Key X-AKSK X-AKSK鉴权所需参数。 登录管理控制台,从“应用管理”页面获取。 创建应用,请参考添加应用。 APP_Secret APP接入地址 - API调用的基地址。 访问URI - 语音验证码场景API的接口访问URI。 从语音验证码场景API获取。 被叫用户端显示的号码 displayNbr 用户接收到平台来电时的显示号码。可申请多个。 从订购号码页面申请。 号码下发后在号码管理页面获取。 放音文件 preTone 播放语音验证码之前播放的放音文件。 登录管理控制台,从“放音文件管理”页面获取。 上传放音文件,请参考添加放音文件。 具体制作方法参见制作放音文件。 放音文件(可选) posTone 播放语音验证码之后播放的放音文件。 若使用个性化放音,可提交该资源。 若不申请,平台将在语音验证码播放完毕后结束通话。 呼叫状态通知URL(可选) statusUrl 接收呼叫过程中状态信息(振铃、应答、挂机等)的服务器地址。若需订阅呼叫状态通知,可提交该资源。 提前准备可用的服务器地址,创建应用时填写,或调用接口时填写。 创建应用,请参考添加应用。 话单通知URL(可选) feeUrl 接收呼叫结束后产生话单的服务器地址。若需订阅话单通知,可提交该资源。 准备的数据与语音验证码API请求参数关联关系如下:
  • 语音通知 表3 语音通知需准备的资源 资源项 对应接口参数 用途 获取方式 APP_Key X-AKSK X-AKSK鉴权所需参数。 登录管理控制台,从“应用管理”页面获取。 创建应用,请参考添加应用。 APP_Secret APP接入地址 - API调用的基地址。 访问URI - 语音通知API的接口访问URI。 从语音通知API获取。 被叫用户端显示的号码 displayNbr 用户接收到平台来电时的显示号码。可申请多个。 从订购号码页面申请。 号码下发后在号码管理页面获取。 放音文件 notifyVoice 音频文件,用户接听平台来电后的语音通知内容。 登录管理控制台,从“放音文件管理”页面获取。 上传放音文件,请参考添加放音文件。 具体制作方法参见制作放音文件。 语音通知模板ID(可选) templateId 仅接口版本为v2.0时需申请。 语音通知模板唯一标识。 语音通知模板为文本格式,平台将其转化为用户接听来电后的语音通知。可申请多个语音通知模板。 登录管理控制台,从“语音模板管理”页面获取。 添加语音通知模板,请参考添加语音模板。 呼叫状态通知URL(可选) statusUrl 接收呼叫过程中状态信息(振铃、应答、挂机等)的服务器地址。若需订阅呼叫状态通知,可提交该资源。 提前准备可用的服务器地址,创建应用时填写,或调用接口时填写。 创建应用,请参考添加应用。 话单通知URL(可选) feeUrl 接收呼叫结束后产生话单的服务器地址。若需订阅话单通知,可提交该资源。 准备的数据与语音通知API请求参数关联关系如下:
  • 语音回呼 表1 语音回呼需准备的资源 资源项 对应接口参数 用途 获取方式 APP_Key X-AKSK X-AKSK鉴权所需参数。 登录管理控制台,从“应用管理”页面获取。 创建应用,请参考添加应用。 APP_Secret APP接入地址 - API调用的基地址。 访问URI - 语音回呼场景API的接口访问URI。 从语音回呼场景API获取。 主叫端显示的号码 displayNbr 主叫端接收到平台来电时的显示号码。可申请多个。该号码可以与displayCalleeNbr配置为同一个号码,也可以配置为不同号码。 从订购号码页面申请。 号码下发后在号码管理页面获取。 被叫端显示的号码 displayCalleeNbr 被叫端接收到平台来电时的显示号码。该号码可以与displayNbr配置为同一个号码,也可以配置为不同号码。 放音文件(可选) lastMinVoice 若设置了最大通话时长,平台会于最后一分钟时进行放音提示。 若需使用个性化放音,可提交该资源。 若不提交,使用默认放音“本次通话时长还剩1分钟”。 登录管理控制台,从“放音文件管理”页面获取。 上传放音文件,请参考添加放音文件。 具体制作方法参见制作放音文件。 waitVoice 主叫接听平台来电后的等待音。 若需使用个性化放音,可提交该资源。 若不提交,使用默认回铃音,例如:“嘟...嘟...”。 呼叫状态通知URL(可选) statusUrl 接收呼叫过程中状态信息(振铃、应答、挂机等)的服务器地址。若需订阅呼叫状态通知,可提交该资源。 提前准备可用的服务器地址,创建应用时填写,或调用接口时填写。 创建应用,请参考添加应用。 话单通知URL(可选) feeUrl 接收呼叫结束后产生话单的服务器地址。若需订阅话单通知,可提交该资源。 准备的数据与语音回呼场景API请求参数关联关系如下: 表2 语音回呼录音功能需准备的资源 资源项 对应接口参数 用途 获取方式 放音文件(可选) recordHintTone 平台会于录音前放音,提示通话用户。 若需使用个性化放音,可提交该资源。 若不提交,使用默认放音。 登录管理控制台,从“放音文件管理”页面获取。 上传放音文件,请参考添加放音文件。 具体制作方法参见制作放音文件。 获取录音文件 录音文件名 fileName 下载录音文件时使用。 通过“话单通知API”的recordObjectName参数获取。 录音文件存储的服务器域名 recordDomain 通过“话单通知API”的recordDomain参数获取。 使用录音功能,需在添加应用时开通。 使用录音功能必须订阅话单通知。不订阅话单通知,则无法获取下载录音文件的关键参数。
  • “呼叫状态通知API”代码样例 /** * 呼叫事件通知 * 客户平台收到RTC业务平台的呼叫事件通知的接口通知 */ //呼叫事件通知样例 var jsonBody = JSON.stringify({ 'eventType': 'callout', 'statusInfo': { 'sessionId': '1201_612_4294967295_20190124030424@callenabler245.huaweicaas.com', 'timestamp': '2019-01-24 03:04:24', 'caller': '+8613800000022', 'called': '+8613800000021' } }); console.log('jsonBody:', jsonBody); /** * 呼叫事件通知 * @brief 详细内容以接口文档为准 * @param jsonBody */ function onCallEvent(jsonBody) { var jsonObj = JSON.parse(jsonBody); //将通知消息解析为jsonObj var eventType = jsonObj.eventType; //通知事件类型 if ('fee' === eventType) { console.log('EventType error:', eventType); return; } if (!jsonObj.hasOwnProperty('statusInfo')) { console.log('param error: no statusInfo.'); return; } var statusInfo = jsonObj.statusInfo; //呼叫状态事件信息 console.log('eventType:', eventType); //打印通知事件类型 //callout:呼出事件 if ('callout' === eventType) { /** * Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 * * 'timestamp': 该呼叫事件发生时RTC业务平台的UNIX时间戳 * 'userData': 用户附属信息 * 'sessionId': 通话链路的标识ID * 'caller': 主叫号码 * 'called': 被叫号码 */ if (statusInfo.hasOwnProperty('sessionId')) { console.log('sessionId:', statusInfo.sessionId); } return; } //alerting:振铃事件 if ('alerting' === eventType) { /** * Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 * * 'timestamp': 该呼叫事件发生时RTC业务平台的UNIX时间戳 * 'userData': 用户附属信息 * 'sessionId': 通话链路的标识ID * 'caller': 主叫号码 * 'called': 被叫号码 */ if (statusInfo.hasOwnProperty('sessionId')) { console.log('sessionId:', statusInfo.sessionId); } return; } //answer:应答事件 if ('answer' === eventType) { /** * Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 * * 'timestamp': 该呼叫事件发生时RTC业务平台的UNIX时间戳 * 'userData': 用户附属信息 * 'sessionId': 通话链路的标识ID * 'caller': 主叫号码 * 'called': 被叫号码 */ if (statusInfo.hasOwnProperty('sessionId')) { console.log('sessionId:', statusInfo.sessionId); } return; } //collectInfo:放音收号结果事件,仅应用于语音通知场景 if ('collectInfo' === eventType) { /** * Example: 此处以解析digitInfo为例,请按需解析所需参数并自行实现相关处理 * * 'timestamp': 该呼叫事件发生时RTC业务平台的UNIX时间戳 * 'sessionId': 通话链路的标识ID * 'digitInfo': 放音收号场景中,RTC业务平台对开发者进行放音收号操作的结果描述 */ if (statusInfo.hasOwnProperty('digitInfo')) { console.log('digitInfo:', statusInfo.digitInfo); } return; } //disconnect:挂机事件 if ('disconnect' === eventType) { /** * Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 * * 'timestamp': 该呼叫事件发生时RTC业务平台的UNIX时间戳 * 'userData': 用户附属信息 * 'sessionId': 通话链路的标识ID * 'caller': 主叫号码 * 'called': 被叫号码 * 'partyType': 挂机的用户类型,仅在语音回呼场景携带 * 'stateCode': 通话挂机的原因值 * 'stateDesc': 通话挂机的原因值的描述 */ if (statusInfo.hasOwnProperty('sessionId')) { console.log('sessionId:', statusInfo.sessionId); } return; } } //呼叫事件处理 onCallEvent(jsonBody);
  • “获取录音文件下载地址API”代码样例 /*jshint esversion: 6 */ var https = require('https'); var util = require('./reqUtil.js'); var querystring = require('querystring'); /** * Get the download link of record file. * @param fileName record file name * @param recordDomain domain name of record file restore server * @returns */ function getRecordLinkAPI(fileName, recordDomain, xaksk) { if(fileName === undefined || fileName === null || recordDomain === undefined || recordDomain === null){ return; } if(xaksk === undefined || xaksk === null){ return; } var location; var method = 'GET'; var uri = '/rest/provision/voice/record/v1.0'; var queryParams = querystring.stringify({'fileName': fileName, 'recordDomain': recordDomain}); var options = util.createOptions(method, uri, queryParams, xaksk); var req = https.request(options, function (res) { if(301 === res.statusCode){ location = Object.getOwnPropertyDescriptor(res.headers, 'location').value; } var resHeaders = JSON.stringify(res.headers); res.setEncoding('utf8'); res.on('data', function (chunk) { console.log('resp:', chunk); //打印响应数据 }); }); req.on('error', function(e) { console.error('problem with request: ' + e); //打印错误信息 }); req.end(); //结束请求 return location; } module.exports = { getRecordLinkAPI };
  • “语音回呼场景API”代码样例 /*jshint esversion: 6 */ var https = require('https'); var data = require('./data.js'); var util = require('./reqUtil.js'); var record = require('./getRecordLink.js'); /** * voiceCallAPI * @param displayNbr * @param callerNbr * @param displayCalleeNbr * @param calleeNbr * @returns */ function voiceCallAPI(displayNbr, callerNbr, displayCalleeNbr, calleeNbr) { if(displayNbr === undefined || displayNbr === null || callerNbr === undefined || callerNbr === null) { return; } if(displayCalleeNbr === undefined || displayCalleeNbr === null || calleeNbr === undefined || calleeNbr === null) { return; } var method = 'POST'; var uri = '/rest/httpsessions/click2Call/v2.0'; var xaksk = util.buildAKSKHeader(data.data.click2call_appid, data.data.click2call_secret); var options = util.createOptions(method, uri, null, xaksk); var body = { /* 必填参数 */ 'displayNbr': displayNbr,//主叫用户手机终端的来电显示号码。 'callerNbr': callerNbr,//发起呼叫时所使用的主叫号码。 'displayCalleeNbr': displayCalleeNbr,//被叫用户终端的来电显示号码。 'calleeNbr': calleeNbr//发起呼叫时所拨打的被叫号码。 /* 选填参数 */ // 'bindNbr': '+86123456789', //CallEnabler业务号码,即绑定号码 // 'maxDuration': 0, //允许单次通话进行的最长时间 // 'lastMinVoice': 'lastmin_voice1.wav', //最后一分钟放音提示音 // 'lastMinToUE': 'both', //最后一分钟放音的播放对象 // 'playPreVoice': 'false', //设置主叫(callerNbr)应答语音回呼后,呼叫被叫(calleeNbr)前,是否向主叫(callerNbr)播放提示音 // 'preVoice': 'pre_voice1.wav', //设置主叫(callerNbr)应答语音回呼后,呼叫被叫(calleeNbr)前向主叫播放的提示音 // 'waitVoice': 'wait_voice1.wav', //设置主叫应答语音回呼后的等待音 // 'calleeMedia': 'all', //指定被叫的媒体音播放方式 // 'statusUrl': 'aHR0cDovLzIxOC40LjMzLjU1Ojg4ODgvdGVzdA==', //要获取通话状态需要在请求中加入statusUrl // 'feeUrl': 'aHR0cDovLzIxOC40LjMzLjU1Ojg4ODgvdGVzdA==', //要获取话单需要在请求中加入feeUrl // 'recordFlag': 'false', //与调测信息中的recordFlag保持一致 // 'recordHintTone': 'recordhint_voice1.wav', //设置使用录音功能的提示音 // 'partyTypeRequiredInDisconnect': 'false', //disconnect状态是否需要携带通话主动挂机的用户类型 // 'returnIdlePort': 'false', //指示是否需要返回平台空闲呼叫端口数量 // 'userData': 'customerId123' //设置用户的附属信息 }; var req = https.request(options, function (res) { var resHeaders = JSON.stringify(res.headers); res.setEncoding('utf8'); res.on('data', function (chunk) { console.log(chunk); }); }); req.on('error', function(e) { console.error('problem with request: ' + e); }); console.log(JSON.stringify(body)); req.write(JSON.stringify(body)); req.end(); } voiceCallAPI('+8653159511234', '+8613500000001', '+8653159511234', '+8613500000002'); var xaksk = util.buildAKSKHeader(data.data.click2call_appid, data.data.click2call_secret); var location = record.getRecordLinkAPI('1200_366_0_20161228102743.wav', 'ostor.huawei.com', xaksk); console.log('The record file download link is: ' + location);
  • “呼叫状态通知API”代码样例 # -*- coding: utf-8 -*- ''' 呼叫事件通知 客户平台收到语音通话平台的呼叫事件通知的接口通知 ''' import json #呼叫事件通知样例 jsonBody = json.dumps({ 'eventType': 'callout', 'statusInfo': { 'sessionId': '1201_612_4294967295_20190124030424@callenabler245.huaweicaas.com', 'timestamp': '2019-01-24 03:04:24', 'caller': '+86138*******2', 'called': '+86138*******1', 'userData': 'customerId123' } }).encode('ascii') print(jsonBody) ''' 呼叫事件通知 @see: 详细内容以接口文档为准 @param param: jsonBody @return: ''' def onCallEvent(jsonBody): jsonObj = json.loads(jsonBody) #将通知消息解析为jsonObj eventType = jsonObj['eventType'] #通知事件类型 if ('fee' == eventType): print('EventType error: ' + eventType) return if ('statusInfo' not in jsonObj): print('param error: no statusInfo.') return statusInfo = jsonObj['statusInfo'] #呼叫状态事件信息 print('eventType: ' + eventType) #打印通知事件类型 #callout:呼出事件 if ('callout' == eventType): ''' Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 'timestamp': 该呼叫事件发生时语音通话平台的UNIX时间戳 'userData': 用户附属信息 'sessionId': 通话链路的标识ID 'caller': 主叫号码 'called': 被叫号码 ''' if ('sessionId' in statusInfo): print('sessionId: ' + statusInfo['sessionId']) return #alerting:振铃事件 if ('alerting' == eventType): ''' Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 'timestamp': 该呼叫事件发生时语音通话平台的UNIX时间戳 'userData': 用户附属信息 'sessionId': 通话链路的标识ID 'caller': 主叫号码 'called': 被叫号码 ''' if ('sessionId' in statusInfo): print('sessionId: ' + statusInfo['sessionId']) return #answer:应答事件 if ('answer' == eventType): ''' Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 'timestamp': 该呼叫事件发生时语音通话平台的UNIX时间戳 'userData': 用户附属信息 'sessionId': 通话链路的标识ID 'caller': 主叫号码 'called': 被叫号码 ''' if ('sessionId' in statusInfo): print('sessionId: ' + statusInfo['sessionId']) return #collectInfo:放音收号结果事件,仅应用于语音通知场景 if ('collectInfo' == eventType): ''' Example: 此处以解析digitInfo为例,请按需解析所需参数并自行实现相关处理 'timestamp': 该呼叫事件发生时语音通话平台的UNIX时间戳 'sessionId': 通话链路的标识ID 'digitInfo': 放音收号场景中,语音通话平台对开发者进行放音收号操作的结果描述 ''' if ('digitInfo' in statusInfo): print('digitInfo: ' + statusInfo['digitInfo']) return #disconnect:挂机事件 if ('disconnect' == eventType): ''' Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 'timestamp': 该呼叫事件发生时语音通话平台的UNIX时间戳 'userData': 用户附属信息 'sessionId': 通话链路的标识ID 'caller': 主叫号码 'called': 被叫号码 'partyType': 挂机的用户类型,仅在语音回呼场景携带 'stateCode': 通话挂机的原因值 'stateDesc': 通话挂机的原因值的描述 ''' if ('sessionId' in statusInfo): print('sessionId: ' + statusInfo['sessionId']) return if __name__ == '__main__': onCallEvent(jsonBody) #呼叫事件处理
  • “呼叫状态通知API”代码样例 /** * 呼叫事件通知 * 客户平台收到RTC业务平台的呼叫事件通知的接口通知 */ //呼叫事件通知样例 var jsonBody = JSON.stringify({ 'eventType': 'callout', 'statusInfo': { 'sessionId': '1201_612_4294967295_20190124030424@callenabler245.huaweicaas.com', 'timestamp': '2019-01-24 03:04:24', 'caller': '+8613800000022', 'called': '+8613800000021' } }); console.log('jsonBody:', jsonBody); /** * 呼叫事件通知 * @brief 详细内容以接口文档为准 * @param jsonBody */ function onCallEvent(jsonBody) { var jsonObj = JSON.parse(jsonBody); //将通知消息解析为jsonObj var eventType = jsonObj.eventType; //通知事件类型 if ('fee' === eventType) { console.log('EventType error:', eventType); return; } if (!jsonObj.hasOwnProperty('statusInfo')) { console.log('param error: no statusInfo.'); return; } var statusInfo = jsonObj.statusInfo; //呼叫状态事件信息 console.log('eventType:', eventType); //打印通知事件类型 //callout:呼出事件 if ('callout' === eventType) { /** * Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 * * 'timestamp': 该呼叫事件发生时RTC业务平台的UNIX时间戳 * 'userData': 用户附属信息 * 'sessionId': 通话链路的标识ID * 'caller': 主叫号码 * 'called': 被叫号码 */ if (statusInfo.hasOwnProperty('sessionId')) { console.log('sessionId:', statusInfo.sessionId); } return; } //alerting:振铃事件 if ('alerting' === eventType) { /** * Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 * * 'timestamp': 该呼叫事件发生时RTC业务平台的UNIX时间戳 * 'userData': 用户附属信息 * 'sessionId': 通话链路的标识ID * 'caller': 主叫号码 * 'called': 被叫号码 */ if (statusInfo.hasOwnProperty('sessionId')) { console.log('sessionId:', statusInfo.sessionId); } return; } //answer:应答事件 if ('answer' === eventType) { /** * Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 * * 'timestamp': 该呼叫事件发生时RTC业务平台的UNIX时间戳 * 'userData': 用户附属信息 * 'sessionId': 通话链路的标识ID * 'caller': 主叫号码 * 'called': 被叫号码 */ if (statusInfo.hasOwnProperty('sessionId')) { console.log('sessionId:', statusInfo.sessionId); } return; } //collectInfo:放音收号结果事件,仅应用于语音通知场景 if ('collectInfo' === eventType) { /** * Example: 此处以解析digitInfo为例,请按需解析所需参数并自行实现相关处理 * * 'timestamp': 该呼叫事件发生时RTC业务平台的UNIX时间戳 * 'sessionId': 通话链路的标识ID * 'digitInfo': 放音收号场景中,RTC业务平台对开发者进行放音收号操作的结果描述 */ if (statusInfo.hasOwnProperty('digitInfo')) { console.log('digitInfo:', statusInfo.digitInfo); } return; } //disconnect:挂机事件 if ('disconnect' === eventType) { /** * Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理 * * 'timestamp': 该呼叫事件发生时RTC业务平台的UNIX时间戳 * 'userData': 用户附属信息 * 'sessionId': 通话链路的标识ID * 'caller': 主叫号码 * 'called': 被叫号码 * 'partyType': 挂机的用户类型,仅在语音回呼场景携带 * 'stateCode': 通话挂机的原因值 * 'stateDesc': 通话挂机的原因值的描述 */ if (statusInfo.hasOwnProperty('sessionId')) { console.log('sessionId:', statusInfo.sessionId); } return; } } //呼叫事件处理 onCallEvent(jsonBody);
  • “语音验证码场景API”代码样例 /*jshint esversion: 6 */ var https = require('https'); var data = require('./data.js'); var util = require('./reqUtil.js'); /** * voiceVerificationCodeAPI * @param displayNbr * @param calleeNbr * @param languageType * @param preTone * @param verifyCode * @returns */ function voiceVerificationCodeAPI(displayNbr, calleeNbr, languageType, preTone, verifyCode) { if(displayNbr === undefined || displayNbr === null || calleeNbr === undefined || calleeNbr === null) { return; } if(languageType === undefined || languageType === null || preTone === undefined || preTone === null) { return; } if(languageType === verifyCode || languageType === verifyCode) { return; } var method = 'POST'; var uri = '/rest/httpsessions/callVerify/v1.0'; var xaksk = util.buildAKSKHeader(data.data.callverify_appid, data.data.callverify_secret); var options = util.createOptions(method, uri, null, xaksk); var body = { /* 必填参数 */ 'displayNbr': displayNbr,//主叫用户手机终端的来电显示号码。 'calleeNbr': calleeNbr,//被叫用户终端的来电显示号码。 'languageType': languageType,//验证码播放的语言类型。 'preTone': preTone,//播放语音验证码之前需要播放的放音文件名 'verifyCode': verifyCode//验证码:只支持0~9的数字,最大8位。 /* 选填参数 */ // 'bindNbr': '+86123456789', //CallEnabler业务号码,即绑定号码 // 'posTone': 'postone.wav', //播放语音验证码之后需要播放的放音文件名 // 'times': 3, //播放次数:0~9 // 'statusUrl': 'aHR0cDovLzIxOC40LjMzLjU1Ojg4ODgvdGVzdA==', //要获取通话状态需要在请求中加入statusUrl // 'feeUrl': 'aHR0cDovLzIxOC40LjMzLjU1Ojg4ODgvdGVzdA==', //要获取话单需要在请求中加入feeUrl // 'returnIdlePort': 'false', //指示是否需要返回平台空闲呼叫端口数量 // 'userData': 'customerId123' //设置用户的附属信息 }; var req = https.request(options, function (res) { var resHeaders = JSON.stringify(res.headers); res.setEncoding('utf8'); res.on('data', function (chunk) { console.log(chunk); }); }); req.on('error', function(e) { console.error('problem with request: ' + e); }); console.log(JSON.stringify(body)); req.write(JSON.stringify(body)); req.end(); } voiceVerificationCodeAPI('+8653159511234', '+8613500000001', 2, 'test.wav', '1234');
  • 云应用模型(Cloud Application Model)是一个面向终态的应用交付自动化服务,包含应用模型与执行引擎两部分。 开发者通过应用模型描述应用交付三个阶段的内容: 资源编排 、应用发布、应用运维;执行引擎解析模板、编排并执行任务,实现应用交付自动化。 本示例通过使用CAM内置系统模板“简易应用模板(E CS )”,自动创建ECS实例,并绑定EIP,快速完成Ngnix搭建,供您体验CAM部署功能。 目前仅“华南-广州”区域支持该功能。
  • 前提条件 注册华为云并实名认证。 如果您已有一个华为账户,请跳到下一个任务。如果您还没有华为账户,请参考以下步骤创建。 打开华为云官网,单击“注册”。 根据提示信息完成注册,详细操作请参见如何注册华为云管理控制台的用户?。 注册成功后,系统会自动跳转至您的个人信息界面。 参考实名认证完成个人或企业账号实名认证。 为账户充值。 使用ServiceStage服务的云应用模型功能,会产生额外费用,您需要确保账户有足够金额。 关于ServiceStage服务的价格,请参见应用管理与运维平台价格详情。 关于充值,请参见如何给华为账户充值。 为用户添加操作权限。 如果您是以主账号登录华为云,请跳到下一个任务。 如果您是以 IAM 用户登录华为云,需要联系管理员(主账号或admin用户组中的用户)对IAM用户授予ServiceStage FullAccess权限和RF FullAccess权限。授权方法请参见给IAM用户授权。 CAM作为ServiceStage服务的扩展功能,需要授予ServiceStage服务权限。 CAM内部基于RF(Resource Formation)提供的能力部署实例, RF是一个用于编排系统资源及服务资源的IaC(Infrastructure as Code)系统。
  • 操作步骤 通过名称过滤,快速找到待添加连接的企业路由器。 您可以通过以下两种操作入口,进入企业路由器的“连接”页签。 在企业路由器右上角区域,单击“管理连接”。 单击企业路由器名称,并选择“连接”页签。 在连接列表中,单击目标连接对应的“连接资源”超链接。 进入VPC“基本信息”页面。 在“网络互通概览”区域,单击子网对应的数字。 进入“子网”页面。 单击子网对应的路由表名称。 进入路由表详情页面。 在“基本信息”页签下,单击“添加路由”。 弹出“添加路由”对话框。 根据界面提示,配置VPC到企业路由器的路由信息,如表1所示。 表1 配置VPC到企业路由器的路由信息-参数说明 参数名称 参数说明 取值样例 目的地址类型 目的地址类型支持“IP地址”,您可以设置单个IP地址或者IP网段。 IP地址 目的地址 目的地址需要确保该VPC的流量可以访问到其他接入企业路由器的VPC,请您根据组网的实际规划进行配置,支持修改。 为了方便配置以及后续的网络扩展,建议您目的地址配置成VPC网段或者子网的地址。 不建议在VPC路由表中将ER的路由配置为默认路由网段0.0.0.0/0,如果VPC内的ECS绑定了EIP,会在ECS内增加默认网段的策略路由,并且优先级高于ER路由,此时会导致流量转发至EIP,无法抵达ER。 10.0.0.0/8 下一跳类型 选择“企业路由器”,支持修改。 企业路由器 下一跳 根据名称选择目标企业路由器,支持修改。 er-test-01 描述 该条路由的描述信息,支持修改。 - 路由信息设置完成后,单击“确定”。 返回路由列表页面,可以看到添加的路由。 重复执行3~8,为其他VPC配置ER的路由信息。
  • 操作步骤 进入企业路由器列表页面。 通过名称过滤,快速找到待添加连接的企业路由器。 您可以通过以下两种操作入口,进入企业路由器的“连接”页签。 在企业路由器右上角区域,单击“管理连接”。 单击企业路由器名称,并选择“连接”页签。 在“连接”页签下,单击“添加连接”。 弹出“添加连接”对话框。 根据界面提示,配置连接的基本信息,如表1所示。 表1 添加连接-参数说明 参数名称 参数说明 取值样例 名称 “虚拟私有云(VPC)”连接的名称,支持修改。 er-attach-01 连接类型 选择“虚拟私有云(VPC)”,不支持修改。 虚拟私有云(VPC) 连接资源 连接类型选择完成后,在下拉列表中选择待接入企业路由器的虚拟私有云,不支持修改。 虚拟私有云选择完成后,在下拉列表中选择待接入企业路由器的子网,不支持修改。 虚拟私有云:vpc-demo-01 子网:subnet-demo-01 配置连接侧路由 如果您在创建连接时开启“配置连接侧路由”选项,则不用手动在VPC路由表中配置静态路由,系统会在VPC的所有路由表中自动添加指向ER的路由,目的地址固定为10.0.0.0/8,172.16.0.0/12,192.168.0.0/16。 如果VPC路由表中的路由与这三个固定网段冲突,则会添加失败。此时建议您不要开启“配置连接侧路由”选项,并在连接创建完成后,手动添加路由。 不建议在VPC路由表中将ER的路由配置为默认路由网段0.0.0.0/0,如果VPC内的ECS绑定了EIP,会在ECS内增加默认网段的策略路由,并且优先级高于ER路由,此时会导致流量转发至EIP,无法抵达ER。 开启 描述 该连接的描述信息,支持修改。 - 标签 为连接绑定标签,用来标识资源,支持修改。 “标签键”:test “标签值”:01 基本信息设置完成后,单击“立即创建”。 返回连接列表页面。 在连接列表页面,查看连接状态。 待状态由“创建中”变为“正常”,表示连接创建成功。 重复执行3~7,在企业路由器中添加其他“虚拟私有云(VPC)”连接。 由于本示例创建ER时,开启“默认路由表关联”和“默认路由表传播”,因此添加完“虚拟私有云(VPC)”连接后,系统会自动在ER路由表做如下配置: 将“虚拟私有云(VPC)”连接关联至ER路由表。 在ER路由表中为“虚拟私有云(VPC)”连接创建传播,自动学习VPC网段。
  • 如何选择组网方案? 方案一是将业务VPC直接接入企业路由器,方案二是使用中转VPC,结合VPC对等连接和企业路由器共同构建组网。相比方案一,方案二可以降低成本,并且免去一些限制,详细说明如下: 相比方案一,使用方案二可以降低流量费用和连接费用,详细说明如下: 业务VPC之间的流量通过VPC对等连接转发,而不再需要经过ER转发,省去部分流量费用。 您只需要将一个中转VPC接入ER,相比接入多个业务VPC,省去部分连接费用。 当前将业务VPC直接接入ER,针对业务VPC有部分使用限制。由于方案二中您只需要将中转VPC接入ER,则可以解决以下针对业务VPC的限制: 当业务VPC下存在共享型弹性负载均衡、 VPC终端节点 私网NAT网关 、分布式缓存服务时,请提交工单联系华为云客服,确认服务的兼容性,并优先考虑使用中转VPC组网方案。 若您在弹性负载均衡、VPC终端节点以及分布式缓存服务场景下,直接将业务VPC接入ER,则当ER处于容灾切换、弹性扩缩容、升级等业务可靠性保障过程中,可能造成长连接会话闪断,请您确保业务客户端具有重连机制,在闪断情况下可以自动重连。 当接入ER的VPC存在以下情况时,则不建议您在VPC路由表中将下一跳为ER的路由配置成默认路由0.0.0.0/0,那样会导致部分业务流量无法转发至ER。 VPC内的ECS绑定了EIP。 VPC被ELB(独享型或者共享型)、NAT网关、VPCEP、DCS服务占用。 当接入ER的VPC关联NAT网关,并配置SNAT或者DNAT规则的“使用场景”选择“云专线/云连接”,则网络不通。
  • 操作流程 本文档介绍如何通过企业路由器构建同区域VPC互通组网,流程如图2所示。 图2 构建同区域VPC互通组网流程图 表1 构建同区域VPC互通组网流程说明 步骤 说明 准备工作 使用云服务前,您需要 注册华为账号 并开通华为云、完成实名认证、为账户充值。 步骤一:规划组网和资源 规划组网和资源,包括资源数量及网段信息等。 步骤二:创建企业路由器 创建1个企业路由器,构建一个同区域组网只需要1个企业路由器。 步骤三:(可选) 创建VPC和ECS资源 创建4个 虚拟私有云VPC 和4个弹性 云服务器ECS 。此处资源数量和规格均为示例,您可以根据实际情况调整。 如果您已有资源,不用执行本章节操作。 步骤四:在企业路由器中添加VPC连接 将4个VPC分别接入企业路由器中。 步骤五:(可选)在VPC路由表中配置路由 在VPC路由表中配置到企业路由器的路由信息。 如果您在创建连接时开启“配置连接侧路由”选项,则不用手动在VPC路由表中配置静态路由,系统会在VPC的所有路由表中自动添加指向ER的路由,目的地址固定为10.0.0.0/8,172.16.0.0/12,192.168.0.0/16。 如果VPC路由表中的路由与这三个固定网段冲突,则会添加失败。此时建议您不要开启“配置连接侧路由”选项,并在连接创建完成后,手动添加路由。 步骤六:验证网络互通情况 登录ECS,执行ping命令,验证网络互通情况。
  • 方案架构 XX企业在华为云区域A内部署了4个虚拟私有云VPC,这4个VPC之间需要互相访问。 在区域A内创建一个企业路由器ER,将VPC接入ER内,ER可以在4个VPC之间路由流量,实现网络互通。 图1 同区域VPC互通组网 本文档指导用户通过企业路由器快速构建同区域组网,实现同区域VPC互通。 您可以使用企业路由器的共享功能,将不同账号下的虚拟私有云添加至同一个企业路由器中构建组网。 企业路由器可以和云专线、云连接、NAT网关组合使用构建不同组网,具体请参见企业路由器最佳实践。
  • 如何使用 在客户端安装节点,把以上程序打包成AddDoublesUDF.jar,并上传到HDFS指定目录下(例如“/user/hive_examples_jars”)。 创建函数的用户与使用函数的用户都需要具有该文件的可读权限。 示例语句: hdfs dfs -put ./hive_examples_jars /user/hive_examples_jars hdfs dfs -chmod 777 /user/hive_examples_jars 判断集群的认证模式。 安全模式,需要使用一个具有Hive管理权限的用户登录beeline客户端,执行如下命令: kinit Hive业务用户 beeline set role admin; 普通模式,执行如下命令: beeline -n Hive业务用户 在Hive Server中定义该函数,以下语句用于创建永久函数: CREATE FUNCTION addDoubles AS 'com.xxx.bigdata.hive.example.udf.AddDoublesUDF' using jar 'hdfs://hacluster/user/hive_examples_jars/AddDoublesUDF.jar'; 其中addDoubles是该函数的别名,用于SELECT查询中使用;xxx通常为程序开发的组织名称。 以下语句用于创建临时函数: CREATE TEMPORARY FUNCTION addDoubles AS 'com.xxx.bigdata.hive.example.udf.AddDoublesUDF' using jar 'hdfs://hacluster/user/hive_examples_jars/AddDoublesUDF.jar'; addDoubles是该函数的别名,用于SELECT查询中使用。 关键字TEMPORARY说明该函数只在当前这个Hive Server的会话过程中定义使用。 在Hive Server中使用该函数,执行SQL语句: SELECT addDoubles(1,2,3); 如果重新连接客户端再使用函数出现[Error 10011]的错误,可执行reload function;命令后再使用该函数。 在Hive Server中删除该函数,执行SQL语句: DROP FUNCTION addDoubles;
  • 如何使用 在客户端安装节点,把以上程序打包成AddDoublesUDF.jar,并上传到HDFS指定目录下(例如“/user/hive_examples_jars”)。 创建函数的用户与使用函数的用户都需要具有该文件的可读权限。 示例语句: hdfs dfs -put ./hive_examples_jars /user/hive_examples_jars hdfs dfs -chmod 777 /user/hive_examples_jars 判断集群的认证模式。 安全模式,需要使用一个具有Hive管理权限的用户登录beeline客户端,执行如下命令: kinit Hive业务用户 beeline set role admin; 普通模式,执行如下命令: beeline -n Hive业务用户 在Hive Server中定义该函数,以下语句用于创建永久函数: CREATE FUNCTION addDoubles AS 'com.xxx.bigdata.hive.example.udf.AddDoublesUDF' using jar 'hdfs://hacluster/user/hive_examples_jars/AddDoublesUDF.jar'; 其中addDoubles是该函数的别名,用于SELECT查询中使用;xxx通常为程序开发的组织名称。 以下语句用于创建临时函数: CREATE TEMPORARY FUNCTION addDoubles AS 'com.xxx.bigdata.hive.example.udf.AddDoublesUDF' using jar 'hdfs://hacluster/user/hive_examples_jars/AddDoublesUDF.jar'; addDoubles是该函数的别名,用于SELECT查询中使用。 关键字TEMPORARY说明该函数只在当前这个Hive Server的会话过程中定义使用。 在Hive Server中使用该函数,执行SQL语句: SELECT addDoubles(1,2,3); 若重新连接客户端再使用函数出现[Error 10011]的错误,可执行reload function;命令后再使用该函数。 在Hive Server中删除该函数,执行SQL语句: DROP FUNCTION addDoubles;
  • 操作场景 使用云连接实例实现不同账号之间的VPC跨区域互通。 云连接实例支持区域,请参见云连接实例支持区域。 应用场景如图1所示。 图1 场景示意 A账号:被授权账号。创建云连接实例,获得由B账号授权的VPC2并加载至云连接实例中。 B账号:授权账号。发起授权动作,将VPC2授权给A账号的云连接实例进行加载。 如果B账号下有多个区域之间的VPC需要互通,可将需要互通的VPC都授权给A账号的云连接实例进行管理。 B账号将VPC2授权给A账号后,A账号加载网络实例(VPC1和VPC2)至云连接实例中,实现VPC1和VPC2互通。B账号无需创建云连接实例、购买带宽包、配置域间带宽。
共100000条