本文介紹自訂解析函數的出入參數,以及如何編寫自訂解析函數。
自訂解析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 | 替換實際解析的網域名稱,僅限 |
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會在解析的過程中,在指定的階段執行由客戶編寫的Function Compute(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: "",
});
}
};
如何在Function Compute服務建立函數服務,請查看 添加Function Compute策略。