编写自定义解析函数

本文介绍自定义解析函数的出入参数,以及如何编写自定义解析函数。

自定义解析函数计算策略运行机制介绍

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参数包含五种类型:cmccunicomchinanetbgpunknown,以上代码中以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_CACHEBEFORE_WRITE_CACHE阶段有效。

hookResult

执行完hook函数是否立即返回结果:

  • 0:继续执行,默认行为。

  • 1:立即返回结果不再执行下一阶段。

仅限

BEFORE_READ_CACHEBEFORE_WRITE_CACHE阶段有效。

出参示例

{
    "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)的函数逻辑,并提供以下能力:

  1. 获取客户IP所在的地域及运营商信息。

  2. 修改域名解析结果及TTL时间。

  3. 添加自定义的数据输出,与解析结果一起返回。

函数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: "",
    });
  }
};

如何在函数计算服务新建函数服务,请查看 添加函数计算策略