このトピックでは、ユーザー定義の解決関数の入力パラメーターと出力パラメーター、およびユーザー定義の解決関数の記述方法について説明します。
ユーザー定義の解決関数の計算ポリシーの解決メカニズム
HTTPDNS の解決プロセスは、いくつかの段階で構成されています。Software-Defined Name System (SDNS) を使用すると、これらの段階で Function Compute 内に作成した解決関数を呼び出すことができます。このようにして、追加の段階がプロセスに含まれ、HTTPDNS の解決プロセスが変更されて実装されます。
次の表は、ユーザー定義の解決関数が追加ステージで提供する必要がある機能について説明しています。
追加ステージ | 説明 |
BEFORE_READ_CACHE | 1. 関数は、入力ドメイン名を実際に解決されるドメイン名に置き換えます。 2. 関数は、コンテキストに基づいてデフォルトのキャッシュキーを置き換えます。 |
BEFORE_WRITE_CACHE | 1. 関数は、再帰的な解決の結果がキャッシュされる前に、結果を変更します。 2. 関数は、コンテキストに基づいてデフォルトのキャッシュキーを置き換えます。 |
BEFORE_WRITE_RESPONSE | 最終的な DNS 応答が返される前に、関数は最後に応答を変更します。関数は、キャッシュがヒットしたかどうかに関係なく、このステージで呼び出されます。 |
SDNS 関数の入力と出力
HTTPDNS は、実行時のコンテキストを、ビジネス要件に基づいて定義された Function Compute 関数に渡します。その後、関数は実行時のコンテキストを処理できます。処理された結果は、HTTPDNS 解決プロセスにマージされます。
入力パラメーターの形式
HTTPDNS は、ランタイムコンテキストを入力パラメーターとして Function Compute の関数に渡します。ランタイムコンテキストは、関数の event
オブジェクトであり、JSON 形式です。
次の表に、フィールドを示します。
フィールド | サブフィールド | 説明 |
domainName | 解決するドメイン名。 | |
clientIp | クライアントの IP アドレス。 | |
location | continent | クライアントの IP アドレスが属する大陸。 |
country | クライアントの IP アドレスが属する国。このフィールドは、中国本土のクライアントの IP アドレスに対してのみ有効です。 | |
isp | クライアントの IP アドレスが属するインターネットサービスプロバイダー (ISP)。このフィールドは、中国本土のクライアントの IP アドレスに対してのみ有効です。有効な値: cmcc: China Mobile。 unicom: China Unicom。 chinanet: China Telecom。 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 | 解決結果の生存時間 (TTL) 値。このフィールドは、BEFORE_WRITE_CACHE ステージと BEFORE_WRITE_RESPONSE ステージで有効です。 | |
parameters{} | ユーザー定義の SDNS パラメーターオブジェクト。 | |
queryType | 解決タイプ。値 1 は A レコード (IPv4 アドレス) を示します。値 28 は AAAA レコード (IPv6 アドレス) を示します。 |
入力パラメーターの例
{
"domainName": "www.aliyun.com", // 解決するドメイン名。
"clientIp": "192.168.1.4", // クライアントの IP アドレス。
"location": {
"continent": "asia", // クライアントの IP アドレスが属する大陸。
"country": "china", // クライアントの IP アドレスが属する国。
"isp": "bgp", // クライアントの IP アドレスが属する ISP。
"province": "zhejiang" // クライアントの IP アドレスが属する省。
},
"ips": ["192.168.1.3"], // ドメイン名が解決される IP アドレス。このフィールドは、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 | 解決結果の TTL 値。単位: 秒。このフィールドの値は、30 より大きく 3600 より小さい必要があります。 |
extra | クライアントに返される拡張情報。このフィールドの値は、最大 1,024 文字です。 |
domainName | 実際に解決されるドメイン名。このフィールドは、 |
cacheKey | デフォルトのキャッシュキー。このフィールドの値には、小文字、数字、およびハイフンを含めることができ、長さは 1 ~ 32 文字である必要があります。 このフィールドは、 |
hookResult | フック関数が実行された後、すぐに結果を返すかどうかを示します。有効な値:
このフィールドは、 |
出力パラメーターの例
{
"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 ステージでのみ有効です。
}
関数の機能
Function Compute で作成した解決関数を HTTPDNS 解決プロセスの特定のステージで呼び出すことができます。また、次の機能も使用できます。
クライアントの IP アドレスに対応するリージョンと ISP に関する情報を取得します。
DNS 解決結果と TTL 値を変更します。
カスタム出力を追加し、カスタム出力を解決結果とともに返します。
関数のデモ
デモのプログラミング言語は、Node.js 6
または Node.js 8
です。
'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') {
// 浙江省の China Telecom のユーザーがドメイン名にアクセスすると、指定された 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 ポリシーを追加する」をご参照ください。