トラフィック管理ステアリング・ポリシーAPIガイド

Oracle Cloud Infrastructure DNS REST APIを使用して、トラフィック管理ポリシーを構築および構成します。

DNS REST APIを使用してポリシーを構築する方法について説明します。

認証と認可

Oracle Cloud Infrastructureの各サービスは、すべてのインタフェース(コンソール、SDKまたはCLI、およびREST API)の認証および認可のためにIAMと統合されています。

組織の管理者は、どのユーザーがどのサービスとリソースにアクセスできるか、およびアクセスのタイプを制御する、グループコンパートメントおよびポリシーを設定する必要があります。たとえば、ポリシーは、新規ユーザーの作成、クラウド・ネットワークの作成と管理、インスタンスの起動、バケットの作成、オブジェクトのダウンロードなどを実行できるユーザーを制御します。詳細は、ポリシーの開始を参照してください。異なる各サービスに対するポリシーの記述の詳細は、ポリシー・リファレンスを参照してください。

会社が所有するOracle Cloud Infrastructureリソースを使用する必要がある通常のユーザー(管理者ではない)の場合は、ユーザーIDを設定するよう管理者に連絡してください。管理者は、使用する必要があるコンパートメントを確認できます。

トラフィック管理ステアリング・ポリシー・コンポーネント

次のリストでは、トラフィック管理ステアリング・ポリシーの構築に使用されるコンポーネントについて説明します。

ステアリング・ポリシー
ゾーンに対するトラフィック管理動作を定義するためのフレームワーク全体。ステアリング・ポリシーには、DNS回答のインテリジェント機能に役立つルールが含まれます。
アタッチメント
ステアリング・ポリシーをゾーンにリンクできます。ステアリング・ポリシーのゾーンへのアタッチメントでは、対象レコード・タイプのドメインのすべてのレコードが遮断され、DNSレスポンスはそうしたドメインのレコードではなく、ステアリング・ポリシーから作成されます。ドメインには、特定のレコード・タイプをカバーするアタッチメントを1つのみ指定できます。
ルール
リクエストのジオロケーションやエンドポイントのヘルスなど、DNSリクエストのプロパティに基づいて回答をフィルタするためにステアリング・ポリシーが使用するガイドライン。
回答
回答には、ステアリング・ポリシーで処理されるDNSレコード・データとメタデータが含まれます。
テンプレート
テンプレートは、ポリシー・タイプとその意図した動作を作成する事前定義済のルール・シーケンスです。例: FAILOVERテンプレートは、最初にFILTER ルールに対してDNS問合せを確認し、次に連続してHEALTHPRIORITYおよびLIMITルールを確認することによって回答を提供します。これにより、ドメインに動的フェイルオーバー機能が与えられます。CUSTOM以外のポリシーでtemplate フィールドを定義するポリシーは、そのポリシー・タイプについて概説されているルール順序に従う必要があります。そうしないと、ポリシーの作成時に400 ステータス・コード・エラーが返されます。
ケース
ルールには、特定のDNS問合せに対する処理中にその動作を実行する方法に関する代替構成を定義する一連のケースをオプションで含めることができます。ルールにケースのシーケンスがない場合は、常に処理中に同じ構成で評価されます。ルールのケース・シーケンスが空の場合は、常に処理中に無視されます。ルールに空でないシーケンスのケースがある場合、処理中のその動作は、シーケンス内の最初の一致ケースによって構成されます。caseConditionのないルール・ケースは常に一致します。caseConditionを含むルール・ケースが一致するのは、その式が特定の問合せに対してtrueと評価された場合のみです。

テンプレートを使用したステアリング・ポリシーの作成

次の項では、ステアリング・ポリシー・テンプレートの各タイプのルール構成を説明し、その後に各テンプレートの構成方法を示すPOSTリクエスト(CreateSteeringPolicy)の例を示します。

フェイルオーバー

回答をポリシーで提供する順序(たとえば、プライマリおよびセカンダリ)を優先するユーザー・フェイルオーバー・ポリシー。Oracle Cloud Infrastructure Health Checksのモニターやオンデマンド・プローブは、ポリシー内の回答の健全性を評価するために利用されます。プライマリの回答が異常であることが判明すると、DNSトラフィックは自動的にセカンダリ・アンサーに渡されます。FAILOVERテンプレートを使用する際は、次の各ルールをリクエスト本文のrulesフィールドで指定された順序で定義する必要があります:

ルール 制限事項 コメント
1 FILTER
  • ケースは許可されません。
  • 回答データは、次のJSONを使用してdefaultAnswerDataで定義する必要があります。

    
    {
      "answerCondition": "answer.isDisabled != true",
      "shouldKeep": true
    }			
 
2 HEALTH
  • ケースは許可されません。
healthCheckMonitorIdがポリシーに対して定義されている場合のみ含まれます。
3 PRIORITY
  • ケースは許可されません。
  • 回答データは、ルールのdefaultAnswerDataプロパティで定義する必要があります。
  • すべての回答にプール・プロパティが必要です。

  • defaultAnswerDataの制限:
    • 回答は、answerCondition式で名前プロパティで参照できず、プール・プロパティで参照する必要があります。
    • すべての回答プールは、一度だけ参照する必要があります。
    • すべての回答プールには一意の値プロパティが必要です。
    • 各アンサー・プール参照は、ポリシーのアンサー・リストに定義されている1つ以上のアンサーのプール・プロパティと一致する必要があります。
 
4 LIMIT
  • ケースは許可されません。
 

FAILOVERテンプレートを使用したPOST /steeringPoliciesポリシーの例:

{
  "compartmentId": "ocid1...",
  "displayName": "failover between endpoints",
  "ttl": 30,
  "healthCheckMonitorId": "ocid1...",
  "template": "FAILOVER",
  "answers": [
    {
      "name": "server-primary",
      "rtype": "A",
      "rdata": "192.168.0.2",
      "pool": "primary"
    },
    {
      "name": "server-secondary",
      "rtype": "A",
      "rdata": "192.168.0.3",
      "pool": "secondary"
    }
  ],
  "rules": [
    {
      "ruleType": "FILTER",
      "defaultAnswerData": [
        {
          "answerCondition": "answer.isDisabled != true",
          "shouldKeep": true
        }
      ]
    },
    {
      "ruleType": "HEALTH"
    },
    {
      "ruleType": "PRIORITY",
      "defaultAnswerData": [
        {
          "answerCondition": "answer.pool == 'primary'",
          "value": 1
        },
        {
          "answerCondition": "answer.pool == 'secondary'",
          "value": 99
        }
      ]
    },
    {
      "ruleType": "LIMIT",
      "defaultCount": 1
    }
  ]
}

LOAD_BALANCE

ロード・バランサ・ポリシーは、多くのエンドポイント間でトラフィックを分散します。エンドポイントに等しい重みを割り当てて、エンドポイント間でトラフィックを均等に分散したり、比率ロード・バランシングにカスタムの重みを割り当てたりできます。Oracle Cloud Infrastructure Health Checksのモニターやオンデマンド・プローブは、エンドポイントのヘルスを評価するために利用されます。DNSトラフィックは、エンドポイントが異常であることが判明した場合、他のエンドポイントに自動的に分散されます。 LOAD_BALANCEテンプレートを使用する際は、次の各ルールをリクエスト本文のrulesフィールドで指定された順序で定義する必要があります:

ルール 制限事項 コメント
1 FILTER
  • ケースは許可されません。
  • 回答データは、次のJSONを使用してdefaultAnswerDataで定義する必要があります。

    
    {
      "answerCondition": "answer.isDisabled != true",
      "shouldKeep": true
    }			
 
2 HEALTH
  • ケースは許可されません。
healthCheckMonitorIdがポリシーに対して定義されている場合のみ含まれます。
3 WEIGHTED
  • ケースは許可されません。
  • 回答データは、ルールのdefaultAnswerDataプロパティで定義する必要があります。
  • 回答は、answerCondition式のプール・プロパティで参照できません。アンサーは、名前プロパティで参照する必要があります。
 
4 LIMIT
  • ケースは許可されません。
 

LOAD_BALANCEテンプレートを使用したPOST /steeringPoliciesポリシーの例:

{
  "compartmentId": "ocid1...",
  "displayName": "Weighted load balance for a set of answers with health checks",
  "ttl": 30,
  "healthCheckMonitorId": "ocid1...",
  "template": "LOAD_BALANCE",
  "answers": [
    {
      "name": "server1",
      "rtype": "A",
      "rdata": "192.168.0.2"
    },
    {
      "name": "server2",
      "rtype": "A",
      "rdata": "192.168.0.3"
    }
  ],
  "rules": [
    {
      "ruleType": "FILTER",
      "defaultAnswerData": [
        {
          "answerCondition": "answer.isDisabled != true",
          "shouldKeep": true
        }
      ]
    },
    {
      "ruleType": "HEALTH"
    },
    {
      "ruleType": "WEIGHTED",
      "defaultAnswerData": [
        {
          "answerCondition": "answer.name == 'server1'",
          "value": 99
        },
        {
          "answerCondition": "answer.name == 'server2'",
          "value": 1
        }
      ]
    },
    {
      "ruleType": "LIMIT",
      "defaultCount": 1
    }
  ]
}

ROUTE_BY_GEO

ジオロケーション・ベースのステアリング・ポリシーは、エンド・ユーザーのロケーションに基づいてDNSトラフィックを異なるエンドポイントに分散します。顧客は、開始元の大陸、国または州/地域(北アメリカ)で構成される地理的なリージョンを定義し、リージョンごとに個別のエンドポイントまたはエンドポイントのセットを定義できます。ROUTE_BY_GEOテンプレートを使用する際は、次の各ルールを、リクエスト本文のrulesフィールドで指定された順序で定義する必要があります:

ルール 制限事項 コメント
1 FILTER
  • ケースは許可されません。
  • 回答データは、次のJSONを使用してdefaultAnswerDataで定義する必要があります。

    
    {
      "answerCondition": "answer.isDisabled != true",
      "shouldKeep": true
    }			
 
2 HEALTH
  • ケースは許可されません。
healthCheckMonitorIdがポリシーに対して定義されている場合のみ含まれます。
3 PRIORITY
  • defaultAnswerDataプロパティは、このルールでは使用できません。
  • 少なくとも1つのケースを定義する必要があります。多数のケースがある場合は、最後のケースで「catch-all」ケースを提供できます。
  • ケースのcaseConditionプロパティは、条件式でのみquery.client.geoKeyを使用できます。
  • 回答は、 answerCondition式で名前プロパティで参照できず、プール・プロパティで参照する必要があります。
  • すべての回答には、プール・プロパティが必要です。
  • ケースのanswerDataごとに、次の手順を実行します。

    • すべての回答プールは、一度だけ参照する必要があります。
    • すべての回答プールには、一意の値プロパティが必要です(その場合)。
    • 各アンサー・プール参照は、ポリシーのアンサー・リストに定義されている1つ以上のアンサーのプール・プロパティと一致する必要があります。
 
4 LIMIT
  • ケースは許可されません。
 

ROUTE_BY_GEOテンプレートを使用したPOST /steeringPoliciesリクエスト本文の例:

{
  "compartmentId": "ocid1...",
  "displayName": "Geolocations mapped to answer pools",
  "ttl": 30,
  "healthCheckMonitorId": "ocid1...",
  "template": "ROUTE_BY_GEO",
  "answers": [
    {
      "name": "US Server 1",
      "rtype": "A",
      "rdata": "192.168.0.2",
      "pool": "US"
    },
    {
      "name": "US Server 2",
      "rtype": "A",
      "rdata": "192.168.0.3",
      "pool": "US"
    },
    {
      "name": "EU Server 1",
      "rtype": "A",
      "rdata": "192.168.0.4",
      "pool": "EU"
    },
    {
      "name": "EU Server 2",
      "rtype": "A",
      "rdata": "192.168.0.5",
      "pool": "EU"
    },
    {
      "name": "rest of world 1",
      "rtype": "A",
      "rdata": "203.0.113.2",
      "pool": "Global"
    },
    {
      "name": "rest of world 2",
      "rtype": "A",
      "rdata": "203.0.113.3",
      "pool": "Global"
    }
  ],
  "rules": [
    {
      "ruleType": "FILTER",
      "defaultAnswerData": [
        {
          "answerCondition": "answer.isDisabled != true",
          "shouldKeep": true
        }
      ]
    },
    {
      "ruleType": "HEALTH"
    },
    {
      "ruleType": "PRIORITY",
      "cases": [
        {
          "caseCondition": "query.client.geoKey in (geoKey '6255149')",
          "answerData": [
            {
              "answerCondition": "answer.pool == 'US'",
              "value": 1
            },
            {
              "answerCondition": "answer.pool == 'EU'",
              "value": 2
            },
            {
              "answerCondition": "answer.pool == 'Global'",
              "value": 3
            }
          ]
        },
        {
          "caseCondition": "query.client.geokey in (geokey '6255148')",
          "answerData": [
            {
              "answerCondition": "answer.pool == 'EU'",
              "value": 1
            },
            {
              "answerCondition": "answer.pool == 'US'",
              "value": 2
            },
            {
              "answerCondition": "answer.pool == 'Global'",
              "value": 3
            }
          ]
        },
        {
          "answerData": [
            {
              "answerCondition": "answer.pool == 'Global'",
              "value": 1
            },
            {
              "answerCondition": "answer.pool == 'US'",
              "value": 2
            },
            {
              "answerCondition": "answer.pool == 'EU'",
              "value": 3
            }
          ]
        }
      ]
    },
    {
      "ruleType": "LIMIT",
      "defaultCount": 1
    }
  ]
}

ROUTE_BY_ASN

ASNベースのステアリング・ポリシーにより、自律システム番号(ASN)に基づいてDNSトラフィックを調整できます。特定のASNまたはASNのセットから発生したDNS問合せは、指定のエンドポイントに渡すことができます。ROUTE_BY_ASNテンプレートを使用する際は、次の各ルールを、リクエスト本文のrulesフィールドで指定された順序で定義する必要があります:

ルール 制限事項 コメント
1 FILTER
  • ケースは許可されません。
  • 回答データは、次のJSONを使用してdefaultAnswerDataで定義する必要があります。

    
    {
      "answerCondition": "answer.isDisabled != true",
      "shouldKeep": true
    }			
 
2 HEALTH
  • ケースは許可されません。
healthCheckMonitorIdがポリシーに対して定義されている場合のみ含まれます。
3 PRIORITY
  • defaultAnswerDataプロパティは、このルールでは使用できません。
  • 少なくとも1つのケースを定義する必要があります。多数のケースがある場合は、最後のケースで「catch-all」ケースを提供できます。
  • caseのcaseConditionプロパティーは、条件式でのみquery.client.asnを使用できます。
  • 回答は、answerCondition式で名前プロパティで参照できず、プール・プロパティで参照する必要があります。
  • すべての回答にプール・プロパティが必要です。
  • ケースのanswerDataごとに、次の手順を実行します。

    • すべてのアンサー・プールは、一度のみ参照する必要があります。
    • すべての回答プールには一意の値プロパティが必要です(その場合)。
    • 各回答プール参照は、ポリシーの回答リストに定義されている1つ以上の回答のプール・プロパティと一致する必要があります。
 
4 LIMIT
  • ケースは許可されません。
 

ROUTE_BY_ASNテンプレートを使用したPOST /steeringPoliciesリクエスト本文の例:

{
  "compartmentId": "ocid1...",
  "displayName": "ASNs mapped to pools",
  "ttl": 30,
  "template": "ROUTE_BY_ASN",
  "answers": [
    {
      "name": "ABC Server",
      "rtype": "A",
      "rdata": "192.168.0.2",
      "pool": "ABC"
    },
    {
      "name": "DEF Server",
      "rtype": "A",
      "rdata": "192.168.0.3",
      "pool": "DEF"
    },
    {
      "name": "Other",
      "rtype": "A",
      "rdata": "203.0.113.2",
      "pool": "Other"
    }
  ],
  "rules": [
    {
      "ruleType": "FILTER",
      "defaultAnswerData": [
        {
          "answerCondition": "answer.isDisabled != true",
          "shouldKeep": true
        }
      ]
    },
    {
      "ruleType": "PRIORITY",
      "cases": [
        {
          "caseCondition": "query.client.asn == 3",
          "answerData": [
            {
              "answerCondition": "answer.pool == 'ABC'",
              "value": 1
            },
            {
              "answerCondition": "answer.pool == 'DEF'",
              "value": 2
            },
            {
              "answerCondition": "answer.pool == 'Other'",
              "value": 3
            }
          ]
        },
        {
          "caseCondition": "query.client.asn == 16591",
          "answerData": [
            {
              "answerCondition": "answer.pool == 'DEF'",
              "value": 1
            },
            {
              "answerCondition": "answer.pool == 'ABC'",
              "value": 2
            },
            {
              "answerCondition": "answer.pool == 'Other'",
              "value": 3
            }
          ]
        },
        {
          "answerData": [
            {
              "answerCondition": "answer.pool == 'Other'",
              "value": 1
            },
            {
              "answerCondition": "answer.pool == 'ABC'",
              "value": 2
            },
            {
              "answerCondition": "answer.pool == 'DEF'",
              "value": 3
            }
          ]
        }
      ]
    },
    {
      "ruleType": "LIMIT",
      "defaultCount": 1
    }
  ]
}

ROUTE_BY_IP

IP接頭辞ベースのステアリング・ポリシーでは、顧客は、開始元の問合せのIP接頭辞に基づいてDNSトラフィックを制御できます。ROUTE_BY_IPテンプレートを使用する際は、次の各ルールを、リクエスト本文のrulesフィールドで指定された順序で定義する必要があります:

ルール 制限事項 コメント
1 FILTER
  • ケースは許可されません。
  • 回答データは、次のJSONを使用してdefaultAnswerDataで定義する必要があります。

    
    {
      "answerCondition": "answer.isDisabled != true",
      "shouldKeep": true
    }		
 
2 HEALTH
  • ケースは許可されません。
healthCheckMonitorIdがポリシーに対して定義されている場合のみ含まれます。
3 PRIORITY
  • defaultAnswerDataプロパティは、このルールでは使用できません。
  • 少なくとも1つのケースを定義する必要があります。多数のケースがある場合は、最後のケースで「catch-all」ケースを提供できます。
  • caseのcaseConditionプロパティは、条件式でのみquery.client.addressを使用できます。
  • 回答は、answerCondition式で名前プロパティで参照できず、プール・プロパティで参照する必要があります。
  • すべての回答にプール・プロパティが必要です。
  • ケースのanswerDataごとに、次の手順を実行します。

    • すべての回答プールは、一度だけ参照する必要があります。
    • すべての回答プールには一意の値プロパティが必要です(その場合)。
    • 各回答プール参照は、ポリシーの回答リストに定義されている1つ以上の回答のプール・プロパティと一致する必要があります。
 
4 LIMIT
  • ケースは許可されません。
 

ROUTE_BY_IPテンプレートを使用したPOST /steeringPoliciesリクエスト本文の例:

{
  "compartmentId": "ocid1...",
  "displayName": "IP subnets mapped to answer pools",
  "ttl": 30,
  "template": "ROUTE_BY_IP",
  "answers": [
    {
      "name": "ABC Server",
      "rtype": "A",
      "rdata": "192.168.0.2",
      "pool": "ABC"
    },
    {
      "name": "DEF Server",
      "rtype": "A",
      "rdata": "192.168.0.3",
      "pool": "DEF"
    },
    {
      "name": "Other",
      "rtype": "A",
      "rdata": "203.0.113.2",
      "pool": "Other"
    }
  ],
  "rules": [
    {
      "ruleType": "FILTER",
      "defaultAnswerData": [
        {
          "answerCondition": "answer.isDisabled != true",
          "shouldKeep": true
        }
      ]
    },
    {
      "ruleType": "PRIORITY",
      "cases": [
        {
          "caseCondition": "query.client.address in (subnet '10.0.3.0/24')",
          "answerData": [
            {
              "answerCondition": "answer.pool == 'ABC'",
              "value": 1
            },
            {
              "answerCondition": "answer.pool == 'DEF'",
              "value": 2
            },
            {
              "answerCondition": "answer.pool == 'Other'",
              "value": 3
            }
          ]
        },
        {
          "caseCondition": "query.client.address in (subnet '192.0.2.2/24')",
          "answerData": [
            {
              "answerCondition": "answer.pool == 'DEF'",
              "value": 1
            },
            {
              "answerCondition": "answer.pool == 'ABC'",
              "value": 2
            },
            {
              "answerCondition": "answer.pool == 'Other'",
              "value": 3
            }
          ]
        },
        {
          "answerData": [
            {
              "answerCondition": "answer.pool == 'Other'",
              "value": 1
            },
            {
              "answerCondition": "answer.pool == 'ABC'",
              "value": 2
            },
            {
              "answerCondition": "answer.pool == 'DEF'",
              "value": 3
            }
          ]
        }
      ]
    },
    {
      "ruleType": "LIMIT",
      "defaultCount": 1
    }
  ]
}

カスタム

カスタム・ポリシーを使用して、フェイルオーバー、ロード・バランシング、ジオロケーション、ASNおよびIP接頭辞ステアリングの機能を組み合せた複雑なポリシーを作成します。カスタム・テンプレートにはルール・シーケンスが必要ないので、カスタム・ポリシーを作成する前にOracle Cloud Infrastructureサポートに連絡することをお薦めします。

ルール・タイプ

フィルタ
回答に関連するブール・データが使用されます。この場合、回答はルールのshouldKeep値がtrueの場合にのみ保持されます。
ヘルス
OCI Health Checksモニターおよびオンデマンド・プローブを使用して、エンドポイントの状態を評価し、必要に応じてポリシーに回答を追加および削除します。ヘルス・チェック・モニターは、ポリシーに影響を与えるためにヘルス・ルールで参照される必要があります。ヘルス・チェックの詳細は、ヘルス・チェックを参照してください。
重み付け
0から255までの数値を使用して、他の回答との関連で回答を処理する頻度を評価します。値が高い回答が返される可能性が高くなります。
優先度
各回答に関連付けられた整数を使用して、回答を最小値から最大値の順にソートします。例:優先度が1の回答は、優先度の値が10の回答が回答リストに返される前に返されます。優先度の値が割り当てられていない回答は、回答リスト末に移動します。
制限
カウント・プロパティを使用して、リスト内の最初の回答以外のすべてにフィルタをかけることができます。