All Products
Search
Document Center

HTTPDNS:Menulis kode fungsi resolusi kustom

Last Updated:Dec 06, 2025

Topik ini menjelaskan parameter input dan output dari fungsi resolusi yang ditentukan pengguna serta cara menulis fungsi tersebut.

Mekanisme resolusi kebijakan komputasi untuk fungsi resolusi yang ditentukan pengguna

Proses resolusi HTTPDNS terdiri dari beberapa tahap. Software-Defined Name System (SDNS) memungkinkan Anda memanggil fungsi resolusi yang dibuat di Function Compute pada tahap-tahap tersebut, sehingga menambahkan tahap tambahan ke dalam proses dan mengubah alur resolusi HTTPDNS untuk menerapkan logika kustom.

运行机制

Tabel berikut menjelaskan kemampuan yang harus disampaikan oleh fungsi resolusi yang ditentukan pengguna berdasarkan tahap tambahan.

Stage Name

Deskripsi

BEFORE_READ_CACHE

1. Fungsi mengganti nama domain input dengan nama domain yang sebenarnya diselesaikan.

2. Fungsi mengganti kunci cache default berdasarkan konteks.

BEFORE_WRITE_CACHE

1. Fungsi memodifikasi hasil resolusi rekursif sebelum hasilnya disimpan dalam cache.

2. Fungsi mengganti kunci cache default berdasarkan konteks.

BEFORE_WRITE_RESPONSE

Sebelum respons DNS akhir dikembalikan, fungsi memodifikasi respons untuk terakhir kalinya. Fungsi dipanggil pada tahap ini terlepas dari apakah cache tercapai atau tidak.

Input dan output fungsi SDNS

HTTPDNS meneruskan konteks waktu proses ke fungsi Function Compute yang didefinisikan pengguna. Fungsi tersebut kemudian memproses konteks tersebut, dan hasil pemrosesannya digabungkan kembali ke dalam proses resolusi HTTPDNS.

Format parameter input

HTTPDNS meneruskan konteks waktu proses ke objek parameter input event fungsi FC dalam bentuk objek JSON dengan struktur tetap.

Bidang-bidang tersebut dijelaskan sebagai berikut:

Bidang

Subbidang

Deskripsi

domainName

Nama domain yang ingin Anda selesaikan.

clientIp

Alamat IP egress publik client. Selanjutnya disebut sebagai IP client.

location

benua

Benua tempat IP client berada:

  • africa: Africa

  • asia: Asia

  • north_america: North America

  • south_america: South America

  • europe: Europe

  • oceania: Oceania

  • antarctica: Antarctica

region

Kode negara atau wilayah (ISO 3166-1 alpha-2) untuk IP client. Kode tersebut dalam huruf kecil. Untuk informasi selengkapnya, lihat Kode negara atau wilayah.

isp

Penyedia layanan internet (ISP) tempat alamat IP klien berada. Bidang ini hanya valid untuk alamat IP klien di daratan Tiongkok. Nilai valid:

  • cmcc: China Mobile.

  • unicom: China Unicom.

  • chinanet: China Telecom.

  • bgp: Jalur BGP.

  • unknown: jalur tidak dikenal.

provinsi

Provinsi tempat alamat IP klien berada. Bidang ini hanya valid untuk alamat IP klien di daratan Tiongkok.

hookType

Fungsi dijalankan pada tahap-tahap berikut:

  • BEFORE_READ_CACHE

  • BEFORE_WRITE_CACHE

  • BEFORE_WRITE_RESPONSE

ips[]

Daftar alamat IP dari hasil penguraian hanya tersedia pada tahap BEFORE_WRITE_CACHE dan BEFORE_WRITE_RESPONSE.

ttl

Nilai time-to-live (TTL) dari hasil resolusi. Bidang ini valid di tahap BEFORE_WRITE_CACHE dan BEFORE_WRITE_RESPONSE.

parameters{}

Objek parameter SDNS yang ditentukan pengguna.

queryType

Jenis resolusi. Nilai 1 menunjukkan Rekaman A, yaitu alamat IPv4. Nilai 28 menunjukkan Rekaman AAAA, yaitu alamat IPv6.

Contoh parameter input

{
  "domainName": "www.aliyun.com", // Nama domain yang sedang diresolusi.
  "clientIp": "192.168.1.4", // IP client.
  "location": {
    "continent": "asia", // Benua tempat IP client berada.
    "region": "cn", // Negara atau wilayah tempat IP client berada.
    "isp": "bgp", // Jalur carrier untuk IP client.
    "province": "zhejiang" // Provinsi tempat IP client berada.
  },
  "ips": ["192.168.1.3"], // Daftar alamat IP dari hasil resolusi. Bidang ini tidak tersedia pada tahap BEFORE_READ_CACHE.
  "ttl": 60, // TTL dari hasil resolusi. Bidang ini tidak tersedia pada tahap BEFORE_READ_CACHE.
  "hookType": "BEFORE_WRITE_CACHE", // Tahap eksekusi fungsi.
  "parameters":{ // Objek parameter yang dibawa dalam permintaan.
    "param1":"p1",   // Sesuai dengan parameter "sdns-param1=p1" dalam URL.
    "param2":"p2"
   }
}

Format parameter output

Fungsi FC harus mengembalikan hasil yang telah diproses ke HTTPDNS dalam format berikut. Semua bidang bersifat opsional. Jika suatu bidang tidak dikembalikan atau nilainya null, HTTPDNS mengasumsikan bahwa fungsi SDNS tidak perlu memodifikasi bidang tersebut.

Bidang

Deskripsi

ips[]

Alamat IP tempat nama domain diselesaikan.

ttl

Nilai TTL dari hasil resolusi. Unit: detik. Nilai bidang ini harus lebih besar dari 30 dan kurang dari 3600.

extra

Informasi tambahan yang dikembalikan ke klien. Nilai bidang ini bisa mencapai hingga 1.024 karakter.

domainName

Mengganti nama domain yang akan diresolusi. Bidang ini hanya berlaku pada tahap BEFORE_READ_CACHE.

cacheKey

Kunci cache default. Nilai bidang ini dapat berisi huruf kecil, angka, dan tanda hubung, dan harus memiliki panjang 1 hingga 32 karakter.

Berlaku pada tahap BEFORE_READ_CACHE dan BEFORE_WRITE_CACHE.

hookResult

Menunjukkan apakah akan segera mengembalikan hasil setelah fungsi hook dijalankan. Nilai valid:

  • 0: Lanjutkan eksekusi (perilaku default).

  • 1: Hasil segera dikembalikan dan tahap berikutnya tidak diperlukan.

Hanya

BEFORE_READ_CACHE dan BEFORE_WRITE_CACHE.

Contoh parameter output

{
    "ips": event.ips.concat(['192.168.1.2']),
    "ttl": event.ttl * 2,
    "extra": "some-thing-send-to-user"
    // ,"domainName": "www.alibabacloud.com" Bidang ini hanya valid di tahap BEFORE_READ_CACHE.
    // ,"cacheKey": "cache-key-001" Bidang ini hanya valid di tahap BEFORE_READ_CACHE dan BEFORE_WRITE_CACHE.
 }

Kemampuan fungsi

Anda dapat memanggil fungsi resolusi yang dibuat di Function Compute pada tahap tertentu dari proses resolusi HTTPDNS. Anda juga dapat menggunakan kemampuan berikut:

  1. Mendapatkan informasi tentang wilayah dan ISP yang sesuai dengan alamat IP klien.

  2. Memodifikasi hasil resolusi DNS dan nilai TTL.

  3. Menambahkan output kustom dan mengembalikan output kustom bersama dengan hasil resolusi.

Demo fungsi

Contoh ini menggunakan waktu proses nodejs6 atau nodejs8.

'use strict';
exports.handler = (event, context, callback) => {
  // Memformat parameter input menjadi objek.
  const eventObj = JSON.parse(event.toString());
  const {
    location, // Wilayah
    ips, // Hasil resolusi yang dikembalikan oleh server DNS otoritatif.
    ttl, // TTL asli.
  } = eventObj;

  if (location.province === 'zhejiang' && location.isp === 'chinanet') {
    // Ketika pengguna China Telecom di Zhejiang mengakses nama domain, kembalikan alamat IP yang ditentukan.
    callback(null, {
      ips: ips.concat(['1.1.X.X']), // Menambahkan alamat IP yang ditentukan ke dalam array alamat IP yang dikembalikan.
      ttl: event.ttl * 2, // Memodifikasi TTL.
      extra: "", // Parameter tambahan yang akan dikirim ke client.
    });
  } else {
    // Pengembalian default.
    callback(null, {
      ips,
      ttl,
      extra: "",
    });
  }
};

Untuk informasi selengkapnya tentang cara membuat layanan di Function Compute, lihat Konfigurasi resolusi DNS kustom menggunakan Function Compute.