HTTPDNS运行机制介绍
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{} | 客户端IP对应的地域及运营商信息。 |
hookType | 当前函数的运行阶段,阶段名请参考上文“各执行阶段自定义解析函数能力”表格。 |
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",
"location": {
"continent": "asia",
"country": "china",
"isp": "bgp",
"province": "zhejiang"
},
"ips": ["192.168.1.3"],
"ttl": 60,
"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 | 替换实际解析的域名,仅限BEFORE_READ_CACHE阶段有效。 |
cacheKey | 替换默认缓存key,限制为[a-z0-9-]{1,32},仅限BEFORE_READ_CACHE、BEFORE_WRITE_CACHE阶段有效。 |
hookResult | 执行完hook函数是否立即返回结果:1:立即返回结果不再执行下一阶段;0:继续执行。 |
出参示例
{
"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阶段有效
}
SDNS函数能力
HTTPDNS会在解析的过程中,在指定的阶段执行由客户编写的函数计算(FC)的函数逻辑,并提供以下能力:
获取客户IP所在的所在地域及运营商信息。
修改域名解析结果及TTL时间。
添加自定义的数据输出,与解析结果一起返回。
函数demo
此demo编程语言为nodejs6或者nodejs8。
'use strict';
exports.handler = function (event, context, callback) {
// 解析传入的入参
event = JSON.parse(event.toString());
// callback 第一个参数是exception,第二个参数是出参,会被自动JSON化
callback(null, {
ips: event.ips.concat(['192.168.1.1']),
ttl: event.ttl * 2,
extra: "some-thing-send-to-user"
});
};
函数计算(FC)函数操作参考
函数不能配置HTTP类型的触发器,否则HTTPDNS将无法引用该函数。
实践中,应用于HTTPDNS的函数一般为专用函数,无需添加其他触发器。
如果您的函数执行出错,或运行时间超过2秒,HTTPDNS会直接返回空解析结果,即
ips=[]
。如果函数返回的数据有误,则该字段会被丢弃。
在函数计算(FC)控制台直接测试
您可以在函数计算(FC)控制台直接进行测试,具体步骤如下:
选择您想要测试的函数,默认进入函数代码页签。
选择测试函数 > 配置测试参数,在右侧配置测试函数页面,输入事件名称,并将入参示例中的JSON文件粘贴进弹窗中,并单击确定。
单击测试函数,测试函数出参是否符合文档要求。