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

HTTPDNS:Node.js SDK との統合

最終更新日:Nov 26, 2025

このトピックでは、Node.js アプリケーションで HTTPDNS を統合して使用する方法について説明します。

Node.js は、Chrome V8 エンジン上に構築された JavaScript ランタイム環境です。サーバーサイド開発、API 構築、マイクロサービスモデルの実装に広く使用されています。

Alibaba Cloud は、Node.js 環境向けに @alicloud-emas/httpdns ソフトウェア開発キット (SDK) を提供しています。Node.js のベストプラクティスに従って、SDK を Node.js アプリケーションに統合し、HTTPDNS の機能を使用できます。

以降のセクションでは、SDK の使用方法とベストプラクティスの概要について説明します。

クイックスタート

1.1 サービスの有効化

クイックスタートをご参照のうえ、HTTPDNS を有効化してください。

1.2 設定の取得

開発設定をご参照のうえ、EMAS コンソールの開発設定セクションから AccountId、SecretKey、およびその他の情報を取得してください。この情報は SDK の初期化に必要です。

インストール

npm を使用して SDK をインストールします:

npm install @alicloud-emas/httpdns

統合例:

サンプルコードとドキュメントについては、「GitHub」リポジトリをご参照ください。

設定と使用方法

3.1 構成の初期化

アプリケーションの起動後に SDK を初期化して、HTTPDNS 機能を使用します。初期化中に、AccountId、SecretKey、および機能のスイッチを設定する必要があります。次のコードは例です:

import { createClient } from '@alicloud-emas/httpdns';

const client = createClient({
  accountId: 'your-account-id',
  secretKey: 'your-secret-key',
  enableExpiredIP: true,
  enableHTTPS: true,
});
重要

enableHTTPS パラメーターを true に設定すると、課金コストが増加します。詳細については、製品の課金ドキュメントをご参照ください。

3.1.1 ログ設定

アプリケーション開発中に HTTPDNS ログを出力するには、初期化中にロガーを設定します。次のコードは例です:

const client = createClient({
  ...,
  logger: console
});

3.2 ドメイン名前解決

3.2.1 同期非ブロッキング名前解決 (推奨)

同期非ブロッキング名前解決メソッドを使用します。このメソッドは、プログラムの実行をブロックすることなく、キャッシュされた結果を即座に返します。次のコードは例です:

function resolve() {
  const result = client.getHttpDnsResultForHostSyncNonBlocking('www.aliyun.com');
  if (result) {
    console.log('Resolution result:', result.ipv4);
    console.log('Domain name:', result.domain);
    console.log('IPv6:', result.ipv6);
  } else {
    console.log('Cache miss. Asynchronous resolution in progress...');
    // 非同期名前解決がバックグラウンドで開始されました。次回の呼び出しで結果が返されます。
  }
}

3.2.2 同期名前解決

名前解決の結果を確実に受け取るには、同期名前解決メソッドを使用します。このメソッドは、名前解決が完了するまで待機してから次に進みます。次のコードは例です:

async function resolve() {
  try {
    const result = await client.getHttpDnsResultForHostSync('www.aliyun.com');
    console.log('Domain name:', result.domain);
    console.log('IPv4:', result.ipv4);
    console.log('IPv6:', result.ipv6);
  } catch (error) {
    console.error('Resolution failed:', error);
  }
}

Node.js のベストプラクティス

4.1 仕組み

  1. アプリケーションでカスタム DNS ルックアップ関数を作成します。

  2. HTTPDNS を使用して解決する必要があるリクエストについては、カスタムルックアップ関数を使用するように設定します。

  3. ルックアップ関数で、リクエストされたドメイン名を取得し、HTTPDNS を使用して IP アドレスに解決します。

  4. ルックアップ関数で、解決された IP アドレスを返して実際のリクエストを開始します。このプロセスにより、ローカル DNS を使用した名前解決が回避されます。

4.2 ネットワークライブラリの統合

4.2.1 Axios の統合

エージェントを使用して Axios を統合します。主な手順は次のとおりです:

ステップ 1: カスタムルックアップ関数の作成

const dns = require('dns');

function createHTTPDNSLookup(httpdnsClient) {
  return (hostname, options, callback) => {
    // パラメーターを標準化します
    if (typeof options === 'function') {
      callback = options;
      options = {};
    }
  
    // コールバックが存在することを確認します
    if (typeof callback !== 'function') {
      throw new Error('callback must be a function');
    }
  
    // HTTPDNS を使用してドメイン名を解決します
    const result = httpdnsClient.getHttpDnsResultForHostSyncNonBlocking(hostname);
  
    if (result) {
      const hasIPv4 = result.ipv4 && result.ipv4.length > 0;
      const hasIPv6 = result.ipv6 && result.ipv6.length > 0;
  
      if (hasIPv4 || hasIPv6) {
        if (options && options.all) {
          // すべての IP アドレスを返します
          const addresses = [
            ...(hasIPv4 ? result.ipv4.map(ip => ({ address: ip, family: 4 })) : []),
            ...(hasIPv6 ? result.ipv6.map(ip => ({ address: ip, family: 6 })) : [])
          ];
          console.log(`[DNS Lookup] HTTPDNS resolved successfully: ${hostname} -> Returning all IP addresses (${addresses.length})`);
          callback(null, addresses);
        } else {
          // IPv4 を優先し、次に IPv6 を使用します
          if (hasIPv4) {
            console.log(`[DNS Lookup] HTTPDNS resolved successfully: ${hostname} -> ${result.ipv4[0]} (IPv4)`);
            callback(null, result.ipv4[0], 4);
          } else {
            console.log(`[DNS Lookup] HTTPDNS resolved successfully: ${hostname} -> ${result.ipv6[0]} (IPv6)`);
            callback(null, result.ipv6[0], 6);
          }
        }
        return;
      }
    }
  
    console.log(`[DNS Lookup] No available IP from HTTPDNS. Falling back to system DNS for: ${hostname}`);
    dns.lookup(hostname, options, callback);
  };
}

ステップ 2: カスタムエージェントの作成

const https = require('https');
const httpsAgent = new https.Agent({
  lookup: createHTTPDNSLookup(httpdnsClient),
  keepAlive: true,
  maxSockets: 10
});

ステップ 3: Axios インスタンスの作成

const axios = require('axios');

const instance = axios.create({
  httpsAgent: httpsAgent,
  timeout: 10000
});

// 使用方法
const response = await instance.get('https://www.aliyun.com');

4.2.2 urllib の統合

エージェントを使用して urllib を統合します。主な手順は次のとおりです:

ステップ 1: カスタムルックアップ関数の作成

const dns = require('dns');

function createHTTPDNSLookup(httpdnsClient) {
  return (hostname, options, callback) => {
    // パラメーターを標準化します
    if (typeof options === 'function') {
      callback = options;
      options = {};
    }
  
    // コールバックが存在することを確認します
    if (typeof callback !== 'function') {
      throw new Error('callback must be a function');
    }
  
    // HTTPDNS を使用してドメイン名を解決します
    const result = httpdnsClient.getHttpDnsResultForHostSyncNonBlocking(hostname);
  
    if (result) {
      const hasIPv4 = result.ipv4 && result.ipv4.length > 0;
      const hasIPv6 = result.ipv6 && result.ipv6.length > 0;
  
      if (hasIPv4 || hasIPv6) {
        if (options && options.all) {
          // すべての IP アドレスを返します
          const addresses = [
            ...(hasIPv4 ? result.ipv4.map(ip => ({ address: ip, family: 4 })) : []),
            ...(hasIPv6 ? result.ipv6.map(ip => ({ address: ip, family: 6 })) : [])
          ];
          console.log(`[DNS Lookup] HTTPDNS resolved successfully: ${hostname} -> Returning all IP addresses (${addresses.length})`);
          callback(null, addresses);
        } else {
          // IPv4 を優先し、次に IPv6 を使用します
          if (hasIPv4) {
            console.log(`[DNS Lookup] HTTPDNS resolved successfully: ${hostname} -> ${result.ipv4[0]} (IPv4)`);
            callback(null, result.ipv4[0], 4);
          } else {
            console.log(`[DNS Lookup] HTTPDNS resolved successfully: ${hostname} -> ${result.ipv6[0]} (IPv6)`);
            callback(null, result.ipv6[0], 6);
          }
        }
        return;
      }
    }
  
    console.log(`[DNS Lookup] No available IP from HTTPDNS. Falling back to system DNS for: ${hostname}`);
    dns.lookup(hostname, options, callback);
  };
}

ステップ 2: カスタムエージェントの作成

const urllib = require('urllib');
const https = require('https');

const httpsAgent = new https.Agent({
  lookup: createHTTPDNSLookup(httpdnsClient),
  keepAlive: true,
  maxSockets: 10
});

ステップ 3:リクエストの送信

async function request(url, options = {}) {
  // URL タイプに基づいてエージェントを選択します
  if (url.startsWith('https://')) {
    options.httpsAgent = httpsAgent;
  } else {
    options.agent = httpAgent; // 同様に httpAgent を作成します
  }
  
  options.timeout = options.timeout || 10000;
  
  try {
    return await urllib.request(url, options);
  } catch (error) {
    // 自動リトライロジック
    if (isConnectionError(error) && !options._retried) {
      options._retried = true;
      delete options.httpsAgent; // システム DNS を使用してリトライします
      return await urllib.request(url, options);
    }
    throw error;
  }
}

API

5.1 初期化

アプリケーションの起動時に設定を初期化します。

const { createClient } = require('@alicloud-emas/httpdns');

const client = createClient({
  accountId: 'your-account-id',
  secretKey: 'your-secret-key',

  timeout: 5000,                              // 名前解決のタイムアウト (ミリ秒)
  maxRetries: 1,                              // 最大リトライ回数
  enableHTTPS: false,                         // HTTPS を使用するかどうかを指定します
  enableCache: true,                          // IP アドレスをキャッシュするかどうかを指定します
  enableExpiredIP: true,                      // 期限切れの IP アドレスの使用を許可するかどうかを指定します
});

パラメーター:

パラメーター

タイプ

必須

機能

accountId

String

必須パラメーター

AccountId

secretKey

String

オプションパラメーター

署名キー

bootstrapIPs

Array

オプションパラメーター

ブートストラップ IP アドレスのリスト

timeout

Number

オプションパラメーター

名前解決のタイムアウト

maxRetries

Number

オプションパラメーター

最大リトライ回数

enableHTTPS

Boolean

オプションパラメーター

HTTPS を使用するかどうかを指定します

enableCache

Boolean

オプションパラメーター

IP アドレスをキャッシュするかどうかを指定します

logger

Object

オプションパラメーター

ロガー

enableExpiredIP

Boolean

オプションパラメーター

期限切れの IP アドレスの使用を許可するかどうかを指定します

重要

enableHTTPS パラメーターを true に設定すると、課金コストが増加します。詳細については、製品の課金ドキュメントをご参照ください。

5.2 ドメイン名の事前解決

事前解決するドメイン名のリストを設定します。これにより、SDK が事前にそれらを解決し、後続の名前解決リクエストのレイテンシーを短縮できます。

// 事前解決リストを設定
client.setPreResolveHosts(['www.aliyun.com']);

5.3 同期非ブロッキング名前解決

指定されたドメイン名を解決します。このメソッドは、プロセスをブロックすることなく、キャッシュされた結果を即座に返します。

const result = client.getHttpDnsResultForHostSyncNonBlocking('www.aliyun.com');
if (result) {
  console.log('Cached result:', result.ipv4);
}

パラメーター:

パラメーター

タイプ

必須

特徴

domain

String

必須パラメーター

ドメイン名

options

Object

オプションパラメーター

名前解決オプション

返される JSON フィールドの説明:

フィールド

タイプ

機能

domain

String

ドメイン名

ipv4

Array

IPv4 アドレスのリスト

ipv6

Array

IPv6 アドレスのリスト

ipv4Ttl

Number

IPv4 の有効期限

ipv6Ttl

Number

IPv6 の有効期限

ipv4Timestamp

Date

IPv4 名前解決のタイムスタンプ

ipv6Timestamp

Date

IPv6 名前解決のタイムスタンプ

5.4 同期名前解決

指定されたドメイン名を同期的に解決します。

const result = await client.getHttpDnsResultForHostSync('www.aliyun.com');
console.log('Resolution result:', result);

5.5 クライアント管理

クライアントのステータスを取得し、クライアントのライフサイクルを管理します。

// クライアントのヘルスステータスを確認
const isHealthy = client.isHealthy();

// 現在のサービス IP アドレスのリストを取得
const serviceIPs = client.getServiceIPs();

// サービス IP アドレスを手動で更新
await client.updateServiceIPs();

// クライアントをシャットダウン
await client.close();

まとめ

このトピックでは、Node.js 環境で HTTPDNS SDK を使用する方法とベストプラクティスについて説明しました。エージェントを使用して SDK をネットワークライブラリと統合することで、パフォーマンス専有型で高可用性のドメイン名名前解決を実現できます。主な機能は次のとおりです:

  1. 使いやすさ:シンプルな API 操作を提供し、同期および同期非ブロッキングの両方の名前解決をサポートします。

  2. 高可用性: フェールオーバーおよびスペックダウンポリシーをサポートし、サービスの安定性を確保します。

  3. パフォーマンスの最適化: 組み込みのキャッシュ機構と接続の再利用により、名前解決の効率を向上させます。

  4. 安全性と信頼性:認証付き名前解決と HTTPS 通信をサポートし、データのセキュリティを確保します。

このトピックのベストプラクティスに従って、HTTPDNS サービスを Node.js アプリケーションに効率的に統合してください。