编写自定义解析函数

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阶段。

入参示例

{
  "domainName": "www.aliyun.com",
  "clientIp": "192.168.1.4",
  "location": {
    "continent": "asia",
    "country": "china",
    "isp": "bgp",  // <cmcc|unicom|chinanet|bgp|unknown>
    "city": "zhejiang"
  },
  "ips": ["192.168.1.3"],
  "ttl": 60,
  "hookType": "BEFORE_WRITE_CACHE"
}

出参格式

函数计算中的函数需要将处理的结果按照如下格式返回给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阶段有效。

出参示例

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

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

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

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

函数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=[]

  • 如果函数返回的数据有误,则该字段会被丢弃。

  1. 登录函数计算控制台

  2. 创建服务

  3. 创建函数

    1. 函数模板选择:根据喜好选择对应的开发语言,模板选择“空白函数”

    2. 触发器配置:选择触发器类型为“不创建触发器”

    3. 角色选择:无需添加

  4. 编写函数代码

  5. 发布服务

  6. 前往HTTPDNS控制台配置软件定义解析。

在函数计算(FC)控制台直接测试

您可以在函数计算(FC)控制台直接进行测试,具体步骤如下:

  1. 选择您想要测试的函数,并进入到代码执行标签页。

  2. 单击触发事件,并将入参示例中的json文件粘贴进弹窗中,并单击确定

  3. 单击执行,测试函数出参是否符合文档要求。