このトピックでは、Function Compute を使用してカスタム DNS 名前解決を設定する方法について説明します。
前提条件
カスタム DNS 名前解決を設定するドメイン名を追加する必要があります。詳細については、「ドメイン名の追加」をご参照ください。
1. サービスリンクロールへの権限付与
HTTPDNS が Function Compute を呼び出してカスタム DNS 名前解決を行う場合、HTTPDNS コンソールでサービスリンクロールに権限を付与する必要があります。この権限付与により、HTTPDNS は Function Compute にアクセスできるようになります。
操作手順
EMAS コンソールにログインします。
左側のナビゲーションウィンドウで、[DNS 管理] > [カスタム DNS] を選択します。
[カスタム DNS の追加] をクリックします。ポリシータイプを [Function Compute ポリシー] に設定し、必要な権限がない場合、権限付与メッセージが表示されます。[権限付与] をクリックします。
表示されたサービスリンクロールの権限付与ページで、[OK] をクリックして権限付与を完了します。この権限がないと、Function Compute ポリシー機能は使用できません。
Function Compute ポリシーを初めて使用する際には、権限を付与する必要があります。権限付与は、次の 2 つのシナリオでトリガーされます:
カスタム DNS レコードを作成し、Function Compute ポリシーを選択したとき。
ポリシー管理リストに移動したときに、権限付与を求めるプロンプトが表示されたとき。
2. カスタム DNS 名前解決関数の作成
まず、Alibaba Cloud Function Compute をアクティベートし、カスタム DNS 名前解決関数を開発する必要があります。関数の開発後、サービスと関数を公開し、正式バージョンまたはエイリアスを生成する必要があります。
HTTPDNS の Function Compute ポリシーのセキュリティと安定性を確保するため、ポリシーを設定する際は、デフォルトの LATEST バージョンを使用しないでください。公開済みのサービスと関数のバージョンを指定する必要があります。
HTTPDNS は FC 2.0 と FC 3.0 の両方をサポートしていますが、FC 2.0 は非推奨のため、FC 3.0 の使用を推奨します。両バージョンの違いについては、「バージョン 2.0 とバージョン 3.0 の違い」をご参照ください。
引き続き 2.0 の関数を作成する必要がある場合は、「2.0 関数の作成」をご参照ください。
3.0 関数の作成
Function Compute コンソールにログインします。トップメニューバーで、[リージョン] を選択します。
左側のナビゲーションウィンドウで、[関数] を選択します。関数リストページで、[関数の作成] をクリックします。

[関数の作成] ページで、[イベント関数] を選択し、必要に応じてパラメーターを設定します。「HTTPDNS カスタム DNS 名前解決」テンプレートを選択すると、コード例を使用できます。パラメーターを設定した後、[作成] をクリックして関数を作成します。

エディターが初期化されたら、関数コードを入力します。関数コードの設定方法の詳細については、「3. カスタム解析関数の記述」をご参照ください。「HTTPDNS カスタム解析」テンプレートを選択した場合は、このステップをスキップできます。
次に、関数をテストします。入力パラメーターの設定については、「3. カスタム解析関数の記述」をご参照ください。[関数のテスト] をクリックし、関数が正しく実行され、返されるデータが期待どおりであることを確認します。

テストが完了したら、[コードのデプロイ] をクリックし、コードがデプロイされたことを確認します。
[バージョン管理] をクリックし、説明を入力してバージョンを作成します。

3. カスタム解析関数の記述
関数コードの記述
関数エディターで、カスタム DNS 名前解決のロジックを入力します。この関数は、クライアント IP、リージョン、キャリアなど、HTTPDNS から渡されるコンテキストパラメーターを処理し、処理後の DNS 名前解決結果を返す必要があります。例:
この例では、プログラミング言語として
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: "", }); } };テスト入力パラメーターの設定
[関数のテスト] をクリックする前に、テストイベントにサンプルの入力パラメーターを設定して、関数の動作が期待どおりであることを確認します。テストイベントは、実際の HTTPDNS 呼び出しのフォーマットをシミュレートする必要があります。例:
{ "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"], // DNS 名前解決結果のリスト。この結果は BEFORE_READ_CACHE ステージでは利用できません。 "ttl": 60, // DNS 名前解決結果の TTL。この結果は BEFORE_READ_CACHE ステージでは利用できません。 "hookType": "BEFORE_WRITE_CACHE", // 関数が実行されるステージ "parameters":{ // 名前解決リクエストに含まれるパラメーターオブジェクト "param1":"p1", // URL 内の "sdns-param1=p1" パラメーターに対応 "param2":"p2" } }テストの実行と結果の検証
[関数のテスト] をクリックします。返された結果に、期待される ips、ttl、または extra フィールドが含まれ、正しいフォーマットであるかを確認します。以下のコードは、レスポンスのサンプルです:
{ "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 ステージでのみ有効 }説明カスタム DNS 名前解決関数の仕組み、および入力・レスポンスパラメーターフィールドの完全な説明については、「カスタム解析関数コードの記述」をご参照ください。
4. Function Compute 関数をドメイン名にアタッチ
カスタム DNS 名前解決が必要な各ドメイン名に対して、複数のリージョンで Function Compute サービスを設定できます。また、異なるドメイン名のポリシーに同じ Function Compute サービスを使用することもできます。
操作手順
EMAS コンソールにログインします。
左側のナビゲーションウィンドウで、[DNS 管理] > [カスタム DNS] を選択します。
[カスタム DNS の追加] をクリックし、ポリシータイプを [Function Compute ポリシー] に設定します。

以下のパラメーターを設定します。設定が完了したら、[OK] をクリックしてポリシーリストに戻ります。
パラメーター
説明
リージョン
必須。Function Compute サービスが所在するリージョンを選択します。例えば、上海リージョンで Function Compute サービスを作成した場合、上海を選択します。
FC バージョン
FC 2.0 と FC 3.0 の両方の関数がサポートされています。デフォルトは FC 3.0 であり、FC 3.0 の使用が推奨されます。
サービス
必須。指定されたリージョン内の Function Compute サービスを選択します。このフィールドは FC 2.0 でのみ利用可能です。
サービスバージョン/エイリアス
必須。サービスのバージョンまたはエイリアスを選択します。このフィールドは FC 2.0 でのみ利用可能です。
説明Function Compute の LATEST バージョンは使用しないでください。
BEFORE_READ_CACHE ステージのカスタム DNS 名前解決関数
HTTPDNS サーバーがキャッシュを読み取る前のフックステージに対して Function Compute 関数を設定します。この関数はオプションです。
BEFORE_WRITE_CACHE ステージのカスタム DNS 名前解決関数
HTTPDNS サーバーが再帰的名前解決を実行し、キャッシュに書き込む前のフックステージに対して Function Compute 関数を設定します。この関数はオプションです。
BEFORE_WRITE_RESPONSE フェーズのカスタム解析関数
HTTPDNS サーバーがキャッシュに書き込み、レスポンスを構築する前のフックステージに対して Function Compute 関数を設定します。この関数はオプションです。
フック関数の単体テスト
HTTPDNS サービスと Function Compute サービス間の接続性をテストします:
テスト成功:HTTPDNS サービスは設定された Function Compute サービスに接続できます。
テスト失敗:HTTPDNS サービスは設定された Function Compute サービスに接続できません。
次のステップ
Function Compute に基づくカスタム DNS 名前解決を設定した後、「全体のワークフロー」を参照して残りの手順を完了してください。