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

HTTPDNS:カスタム名前解決関数のコードの作成

最終更新日:Dec 06, 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 は、FC 関数の event 入力パラメーターオブジェクトにランタイムコンテキストを渡します。コンテキストは、固定構造の JSON オブジェクトとして渡されます。

各フィールドの説明は次のとおりです:

フィールド

サブフィールド

説明

domainName

解決するドメイン名。

clientIp

クライアントのパブリックアウトバウンド IP アドレス。以下、クライアント IP と呼びます。

location

continent

クライアント IP が所在する大陸:

  • africa:アフリカ

  • asia:アジア

  • north_america:北米

  • south_america:南米

  • europe:ヨーロッパ

  • oceania:オセアニア

  • antarctica:南極

region

クライアント IP の国/地域コード (ISO 3166-1 alpha-2)。コードは小文字です。詳細については、「国/地域コード」をご参照ください。

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 が所在する大陸。
    "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

名前解決されるドメイン名を置き換えます。このフィールドは 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. カスタム出力を追加し、カスタム出力を解決結果とともに返します。

関数のデモ

この例では、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 解決の設定」をご参照ください。