全部產品
Search
文件中心

HTTPDNS:編寫自訂解析函數

更新時間:Jan 04, 2025

本文介紹自訂解析函數的出入參數,以及如何編寫自訂解析函數。

自訂解析Function Compute策略運行機制介紹

HTTPDNS運行過程分為以下幾個階段,軟體定義程式解析(SDNS)允許使用者在這些執行階段之間插入由使用者編寫的Function Compute(FC)的函數邏輯,允許使用者改變HTTPDNS的運行行為以實現一些自訂的功能。

運行機制

各執行階段自訂解析函數能力如下表所示。

階段名

說明

BEFORE_READ_CACHE

1. 替換實際解析的網域名稱。

2. 根據上下文,替換預設緩衝key。

BEFORE_WRITE_CACHE

1. 在寫緩衝前,修改遞迴解析的結果。

2. 根據上下文,替換預設緩衝key。

BEFORE_WRITE_RESPONSE

在最終返迴響應前,最後一次修改響應內容(此階段無論是否命中緩衝,一定會被執行)。

SDNS函數輸入輸出

HTTPDNS會將運行時上下文輸入給Function Compute(FC)的函數,允許客戶定義邏輯來處理這些資料,並將處理後的結果合并回HTTPDNS解析流程中。

入參格式

HTTPDNS會將運行時上下文通過一個固定的JSON結構傳給Function Compute的入參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"
   }
}

出參格式

Function Compute中的函數需要將處理的結果按照如下格式返回給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會在解析的過程中,在指定的階段執行由客戶編寫的Function Compute(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: "",
    });
  }
};

如何在Function Compute服務建立函數服務,請查看 添加Function Compute策略