すべてのプロダクト
Search
ドキュメントセンター

HTTPDNS:ユーザー定義の解決関数の記述

最終更新日:Feb 15, 2025

このトピックでは、ユーザー定義の解決関数の入力パラメーターと出力パラメーター、およびユーザー定義の解決関数の記述方法について説明します。

ユーザー定義の解決関数の計算ポリシーの解決メカニズム

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

実際に解決されるドメイン名。このフィールドは、BEFORE_READ_CACHE ステージでのみ有効です。

cacheKey

デフォルトのキャッシュキー。このフィールドの値には、小文字、数字、およびハイフンを含めることができ、長さは 1 ~ 32 文字である必要があります。

このフィールドは、BEFORE_READ_CACHE ステージと BEFORE_WRITE_CACHE ステージで有効です。

hookResult

フック関数が実行された後、すぐに結果を返すかどうかを示します。有効な値:

  • 0: 結果はすぐには返されず、次のステージが必要です。これはデフォルト値です。

  • 1: 結果はすぐに返され、次のステージは必要ありません。

このフィールドは、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 ステージでのみ有効です。
 }

関数の機能

Function Compute で作成した解決関数を HTTPDNS 解決プロセスの特定のステージで呼び出すことができます。また、次の機能も使用できます。

  1. クライアントの IP アドレスに対応するリージョンと ISP に関する情報を取得します。

  2. DNS 解決結果と TTL 値を変更します。

  3. カスタム出力を追加し、カスタム出力を解決結果とともに返します。

関数のデモ

デモのプログラミング言語は、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 ポリシーを追加する」をご参照ください。