このトピックでは、ユーザー定義の解決関数の入力パラメーターと出力パラメーター、およびユーザー定義の解決関数の記述方法について説明します。
ユーザー定義の解決関数の計算ポリシーの解決メカニズム
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 は、FC 関数の event 入力パラメーターオブジェクトにランタイムコンテキストを渡します。コンテキストは、固定構造の JSON オブジェクトとして渡されます。
各フィールドの説明は次のとおりです:
フィールド | サブフィールド | 説明 |
domainName | 解決するドメイン名。 | |
clientIp | クライアントのパブリックアウトバウンド IP アドレス。以下、クライアント IP と呼びます。 | |
location | continent | クライアント IP が所在する大陸:
|
region | クライアント IP の国/地域コード (ISO 3166-1 alpha-2)。コードは小文字です。詳細については、「国/地域コード」をご参照ください。 | |
isp | クライアントの IP アドレスが属するインターネットサービスプロバイダー (ISP)。このフィールドは、中国本土のクライアントの IP アドレスに対してのみ有効です。有効な値:
| |
province | クライアントの IP アドレスが属する省。このフィールドは、中国本土のクライアントの IP アドレスに対してのみ有効です。 | |
hookType | 関数は次のフェーズで実行されます:
| |
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 が所在する大陸。
"region": "cn", // クライアント IP が所在する国/リージョン。
"isp": "bgp", // クライアント IP のキャリア回線。
"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"
}
}出力パラメーターの形式
FC 関数は、処理結果を次のフォーマットで 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 値を変更します。
カスタム出力を追加し、カスタム出力を解決結果とともに返します。
関数のデモ
この例では、nodejs6 または nodejs8 ランタイムを使用します。
'use strict';
exports.handler = (event, context, callback) => {
// 入力パラメーターをオブジェクトにフォーマットします。
const eventObj = JSON.parse(event.toString());
const {
location, // リージョン
ips, // 権威 DNS サーバーから返された名前解決結果。
ttl, // 元の TTL。
} = eventObj;
if (location.province === 'zhejiang' && location.isp === 'chinanet') {
// 浙江省の China Telecom ユーザーがドメイン名にアクセスした場合、指定された IP アドレスを返します。
callback(null, {
ips: ips.concat(['1.1.X.X']), // 返される IP アドレス配列に指定された IP アドレスを追加します。
ttl: event.ttl * 2, // TTL を変更します。
extra: "", // クライアントに送信する追加パラメーター。
});
} else {
// デフォルトの戻り値。
callback(null, {
ips,
ttl,
extra: "",
});
}
};
Function Compute でサービスを作成する方法の詳細については、「Function Compute を使用したカスタム DNS 解決の設定」をご参照ください。