本文介绍自定义解析函数的出入参数,以及如何编写自定义解析函数。
自定义解析函数计算策略运行机制介绍
HTTPDNS运行过程分为以下几个阶段,软件定义解析(SDNS)允许用户在这些执行阶段之间插入由用户编写的函数计算(FC)的函数逻辑,允许用户改变HTTPDNS的运行行为以实现一些自定义的功能。
各执行阶段自定义解析函数能力如下表所示。
阶段名 | 说明 |
BEFORE_READ_CACHE | 1. 替换实际解析的域名。 2. 根据上下文,替换默认缓存key。 |
BEFORE_WRITE_CACHE | 1. 在写缓存前,修改递归解析的结果。 2. 根据上下文,替换默认缓存key。 |
BEFORE_WRITE_RESPONSE | 在最终返回响应前,最后一次修改响应内容(此阶段无论是否命中缓存,一定会被执行)。 |
SDNS函数输入输出
HTTPDNS会将运行时上下文输入给函数计算(FC)的函数,允许客户定义逻辑来处理这些数据,并将处理后的结果合并回HTTPDNS解析流程中。
入参格式
HTTPDNS会将运行时上下文通过一个固定的JSON结构传给函数计算的入参event
对象。
具体字段如下:
字段名 | 子字段名 | 含义 |
domainName | 当前正在解析的域名。 | |
clientIp | 客户端IP地址。 | |
location | continent | 客户端IP所属大洲 |
country | 客户端IP所属国家(仅国内客户端IP有) | |
isp | 客户端IP所属运营商线路,包含五种类型(仅国内客户端IP有): cmcc: 中国移动 unicom: 中国联通 chinanet: 中国电信 bgp:BGP线路 unknown:不明确线路 | |
province | 客户端IP所属省份(仅国内客户端IP有) | |
hookType | 当前函数的运行阶段,阶段名如下: BEFORE_READ_CACHE BEFORE_WRITE_CACHE BEFORE_WRITE_RESPONSE | |
ips[] | 解析结果IP列表,仅限BEFORE_WRITE_CACHE、BEFORE_WRITE_RESPONSE阶段。 | |
ttl | 解析结果过期时间,仅限BEFORE_WRITE_CACHE、BEFORE_WRITE_RESPONSE阶段。 | |
parameters{} | 用户自定义的SDNS参数对象。 | |
queryType | 解析类型,1代表IPv4类型解析(A记录),28代表IPv6类型解析(AAAA记录)。 |
入参示例
{
"domainName": "www.aliyun.com", // 当前正在解析的域名
"clientIp": "192.168.1.4", // 客户端 IP
"location": {
"continent": "asia", // 客户端IP所属大洲
"country": "china", // 客户端IP所属国家
"isp": "bgp", // 客户端IP所属运营商线路
"province": "zhejiang" // 客户端IP所属省份
},
"ips": ["192.168.1.3"], // 解析结果列表,BEFORE_READ_CACHE阶段没有此结果
"ttl": 60, // 解析结果 TTL,BEFORE_READ_CACHE阶段没有此结果
"hookType": "BEFORE_WRITE_CACHE", // 函数运行的阶段
"parameters":{ // 解析携带的参数对象
"param1":"p1", //对应URL中的参数"sdns-param1=p1"
"param2":"p2"
}
}
isp参数包含五种类型:cmcc、unicom、chinanet、bgp、unknown,以上代码中以bgp为例。
对于国内客户端IP,location提供省级精度的地理位置信息。对于国外的客户端IP,location只提供大洲级精度的地理位置信息。
HTTPDNS的自定义参数名需要添加"sdns-"前缀(HTTPDNS调用FC时会自动去除参数名前缀),否则HTTPDNS将会忽略该参数。
出参格式
函数计算中的函数需要将处理的结果按照如下格式返回给HTTPDNS,以便HTTPDNS进行解析。所有字段均为可选,当字段未返回,或返回为null
时,HTTPDNS将认为自定义解析(SDNS)函数无需修改该字段。
字段名 | 含义 |
ips[] | 解析结果IP列表。 |
ttl | 解析结果过期时间(秒),30<TTL<3600。 |
extra | 额外输出给客户端的扩展信息,最大长度1024个字符。 |
domainName | 替换实际解析的域名,仅限 |
cacheKey | 替换默认缓存key,限制为[a-z0-9-]{1,32},仅限
|
hookResult | 执行完hook函数是否立即返回结果:
仅限
|
出参示例
{
"ips": event.ips.concat(['192.168.1.2']),
"ttl": event.ttl * 2,
"extra": "some-thing-send-to-user"
// ,"domainName": "www.alibabacloud.com" 仅限BEFORE_READ_CACHE阶段有效
// ,"cacheKey": "cache-key-001" 仅限BEFORE_READ_CACHE、BEFORE_WRITE_CACHE阶段有效
}
函数能力介绍
HTTPDNS会在解析的过程中,在指定的阶段执行由客户编写的函数计算(FC)的函数逻辑,并提供以下能力:
获取客户IP所在的地域及运营商信息。
修改域名解析结果及TTL时间。
添加自定义的数据输出,与解析结果一起返回。
函数demo
此demo编程语言为nodejs6
或者nodejs8
。
'use strict';
exports.handler = (event, context, callback) => {
// 将传入的参数格式化成对象
const eventObj = JSON.parse(event.toString());
const {
location, // 地域
ips, // 权威返回的解析结果
ttl, // 原始ttl
} = eventObj;
if (location.province === 'zhejiang' && location.isp === 'chinanet') {
// 当 浙江电信 的用户访问该域名时,返回指定的IP
callback(null, {
ips: ips.concat(['1.1.1.1']), // 将指定的IP加入返回的IP数组中
ttl: event.ttl * 2, // 修改ttl
extra: "", // 携带给客户端额外的参数
});
} else {
// 默认返回
callback(null, {
ips,
ttl,
extra: "",
});
}
};
如何在函数计算服务新建函数服务,请查看 添加函数计算策略。