新しいプロジェクトのデフォルトとしてゾーン DNS を設定する


このドキュメントでは、新しいプロジェクトでゾーン DNS を使用するように内部 DNS ポリシーを更新する方法について説明します。ゾーン DNS は、ゾーン内の停止を分離し、インスタンスの作成や自動修復などの重要なサービスの中断を防ぐことで、アプリケーションの信頼性を向上させます。

始める前に

  • まだ設定していない場合は、認証を設定します。認証とは、サービスと API にアクセスするために ID を確認するプロセスです。 Google Cloud ローカル開発環境からコードまたはサンプルを実行するには、次のいずれかのオプションを選択して Compute Engine に対する認証を行います。

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.
    3. REST

      このページの REST API サンプルをローカル開発環境で使用するには、gcloud CLI に指定した認証情報を使用します。

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      詳細については、 Google Cloud 認証ドキュメントの REST を使用して認証するをご覧ください。

必要なロール

組織全体の内部 DNS の使用状況を表示し、デフォルト ポリシーを更新するために必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。

  • デフォルトのグローバル DNS ポリシーを確認する: フォルダまたは組織の組織のポリシー管理者 roles/orgpolicy.policyAdmin
  • フォルダがゾーン DNS に移行する準備ができているかどうかを判断する: フォルダまたは組織の参照者roles/browser

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

これらの事前定義ロールには、組織全体の内部 DNS の使用状況を表示し、デフォルト ポリシーを更新するために必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。

必要な権限

組織全体の内部 DNS の使用状況を表示し、デフォルト ポリシーを更新するには、次の権限が必要です。

  • 組織のポリシーの制約を設定する: orgpolicy.*
  • フォルダをゾーン DNS に移行する準備ができているかどうかを判断する:
    • resourcemanager.folders.get
    • resourcemanager.folders.list
    • resourcemanager.organizations.get
    • resourcemanager.projects.get
    • resourcemanager.projects.list
  • グローバル DNS 名と VM メタデータを確認する: compute.projects.get

カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。

構成の概要

デフォルトの内部 DNS タイプをオーバーライドするように組織のポリシーを設定すると、新しく作成されたプロジェクトはデフォルトでゾーン DNS を使用します。この組織のポリシーは、Compute Engine API がすでに有効になっている既存のプロジェクトには影響しません。既存のプロジェクトをゾーン DNS に切り替えるには、既存のプロジェクトのゾーン DNS への切り替えをご覧ください。

ゾーン DNS ポリシーは組織レベルで適用することをおすすめします。このアプローチにより、組織内で作成されるすべての新しいプロジェクトでゾーン DNS が使用されるため、信頼性と復元性が向上します。ただし、一部のフォルダをこの組織全体のポリシーから除外する必要がある場合があります。フォルダを除外するのは、フォルダ内の新しいプロジェクトが、ゾーン DNS と互換性のない既存のプロジェクトに依存している場合です。

組織レベルでゾーン DNS ポリシーを適用するプロセスには、次の手順が含まれます。

  1. プロジェクトとフォルダのリストを収集する: 組織内のすべてのプロジェクトとそれに関連付けられたフォルダのリストをコンパイルします。
  2. 除外するフォルダを特定する: 手順 1 で特定した互換性のないプロジェクトを含むフォルダを特定します。これらのフォルダは、ゾーン DNS ポリシーから一時的に除外する必要があります。
  3. 組織のポリシーを設定する: ゾーン DNS ポリシーを組織レベルで適用します。
  4. 特定のフォルダを除外する: 手順 3 で特定したフォルダに除外を適用します。これにより、プロジェクト内の互換性のないプロジェクトに対処しながら、グローバル DNS を引き続き使用できます。

このアプローチでは、新しいプロジェクトでゾーン DNS を使用して信頼性を強化し、すぐに移行できない古いプロジェクトに対する既存の依存関係にも対応します。

制限事項

組織全体でゾーン DNS 名を有効にすると、次のような他のサービスのインスタンスにもゾーン DNS 設定が適用されます。

アプリケーションでこれらのサービスが使用されているかどうかを確認し、それらのアプリケーションに関連付けられているフォルダとプロジェクトのクエリ分析を使用して、ゾーン DNS との互換性の問題を特定します。

組織でグローバル DNS をデフォルトで使用しているかどうかを確認する

組織のデフォルトの DNS 設定は、次の 2 つの要因によって異なります。

  • 組織の作成日:

    • 2018 年 9 月 6 日以降に作成された場合: 組織ではデフォルトでゾーン DNS が使用されます。特に対応は必要ありません。
    • 2018 年 9 月 6 日より前に作成された場合: 組織ではデフォルトでグローバル DNS が使用されます。ゾーン DNS への移行を検討する必要があります。
  • 組織のポリシーの制約の存在と適用:

    組織が 2018 年 9 月 6 日より前に作成された場合でも、管理者が組織内で作成されるすべての新しいプロジェクトでゾーン DNS を使用するポリシーを適用している可能性があります。このようなポリシーが存在するかどうかを確認するには、Google Cloud コンソールまたは Google Cloud CLI を使用します。

コンソール

  1. コンソールで [IAM と管理] > [ID と組織] ページに移動します。

    [ID と組織] に移動

  2. 組織の登録日を確認します。

    登録の完了日が表示されている [ID と組織] コンソール ページのスクリーンショット。

  3. 組織が 2018 年 9 月 6 日より前に作成された場合は、組織のポリシーの制約により、新しく作成されるすべてのプロジェクトのデフォルト DNS タイプがゾーン DNS に設定されているかどうかを確認します。

    1. Google Cloud コンソールで [IAM と管理] > [組織のポリシー] ページに移動します。
    2. [フィルタ] フィールドに「constraints/compute.setNewProjectDefaultToZonalDNSOnly」と入力します。
    3. 制約が構成されている場合は、[新しいプロジェクトの内部 DNS 設定をゾーン DNS のみに設定する] の名前をクリックします。
    4. [ポリシーの詳細] ページで [ステータス] を確認します。
      • ステータスが [適用済み] の場合、デフォルトの内部 DNS タイプは、組織内で作成されるすべての新しいプロジェクトでゾーン DNS です。
      • それ以外の場合、プロジェクトのデフォルトの DNS タイプは組織がいつ作成されたかによって決まります。
    5. 組織に対して制約が構成されていない場合、プロジェクトのデフォルトの DNS タイプは組織の作成日によって決まります。

gcloud

organizations describe コマンドresource-manager org-policies list コマンドを使用して、組織のデフォルトの DNS タイプを指定します。

  1. 組織の creationTime メタデータ値を確認します。

    gcloud organizations describe ORGANIZATION_ID
    

    ORGANIZATION_ID は、組織 ID 番号または組織のドメイン名に置き換えます。

  2. 組織が 2018 年 9 月 6 日より前に作成された場合は、新しく作成されるすべてのプロジェクトのデフォルトの DNS タイプをゾーン DNS に設定するように組織のポリシーの制約が構成されているかどうかを判断します。

    gcloud resource-manager org-policies list --organization=ORGANIZATION_ID \
       --filter="constraints/compute"
    

    出力で constraints/compute.setNewProjectDefaultToZonalDNSOnly を探します。

    1. 制約が存在し、StatusEnforced の場合、組織内で新しく作成されるすべてのプロジェクトはデフォルトでゾーン DNS を使用します。
    2. 制約が存在しない場合、または適用されていない場合、デフォルトの DNS タイプは組織の作成日によって決まります(最初の手順を参照)。

フォルダまたは組織内のどのプロジェクトがグローバル DNS を使用しているかを特定する

グローバル DNS を使用しているプロジェクトを確認するには、BigQuery を使用して、組織の相対プロジェクトとそのメタデータを一覧表示するテーブルを作成することをおすすめします。このテーブルを使用してクエリを実行できます。

  1. BigQuery データセットを作成します。
  2. 組織のアセット メタデータを BigQuery テーブルにエクスポートします

    1. Cloud Asset Inventory API が有効になっていることを確認します。
    2. Cloud Asset Inventory API の使用に必要な権限を構成します。
    3. 次の gcloud CLI コマンドを使用して、compute.googleapis.com/Project アセットをエクスポートします。

      gcloud asset export \
         --content-type resource \
         --organization 'ORGANIZATION_ID' \
         --bigquery-table 'projects/PROJECT_ID/datasets/DATASET_ID/tables/TABLE_NAME' \
         --asset-types='compute.googleapis.com/Project' \
         --output-bigquery-force
      

      次のように置き換えます。

      • ORGANIZATION_ID: 組織 ID 番号
      • PROJECT_ID: プロジェクト ID
      • DATASET_ID: BigQuery データセットの名前
      • TABLE_NAME: メタデータのエクスポート先のテーブル。テーブルが存在しない場合は、BigQuery によってテーブルが作成されます。
  3. Google Cloud コンソールの [BigQuery] ページに移動します。

  4. [ クエリを新規作成] を選択します。

  5. クエリエディタのテキスト領域に次の GoogleSQL クエリを入力して、[ 実行] をクリックします。

    SELECT
      JSON_VALUE(SAFE.PARSE_JSON(resource.data).vmDnsSetting) AS vmDnsSetting,
      count(*) as project_count
    FROM PROJECT_ID.DATASET_ID.TABLE_NAME
    GROUP BY 1
    

    次のように置き換えます。

    • PROJECT_ID: プロジェクト ID
    • DATASET_ID: BigQuery データセットの名前
    • TABLE_NAME: 手順 2 でエクスポートされたメタデータを含むテーブル。

    vmDnsSetting の値が ZONAL_ONLY のプロジェクトにはゾーン DNS が構成されています。それ以外の場合、プロジェクトはデフォルトでグローバル DNS を使用します。

  6. 省略可: 個々のプロジェクトの vmDnsSetting の詳細を表示するには、次の GoogleSQL クエリを入力して、[ 実行] をクリックします。

    SELECT
      SUBSTR(name,35) as project_id,
      JSON_VALUE(SAFE.PARSE_JSON(resource.data).vmDnsSetting) AS vmDnsSetting
    FROM PROJECT_ID.DATASET_ID.TABLE_NAME
    

フォルダの移行の準備状況を判断する

この手順では、bash スクリプトと前のセクションで作成した BigQuery テーブルを使用して、フォルダの移行準備状況を判断します。

  • すべてのプロジェクトで過去 30 日間にゾーン DNS と互換性のないクエリが行われていない場合、フォルダの準備はできています。
  • フォルダが移行の準備ができていない場合、スクリプトは、移行の準備ができていない原因となっているフォルダ内のプロジェクト ID を返します。この結果リスト内のプロジェクトはまだゾーン DNS と互換性がないので、追加の操作が必要になります。

次の手順を完了します。

  1. フォルダ ID を取得します。フォルダ ID がわからない場合は、次の操作を行います。
    1. Google Cloud コンソールで、[マネージド リソース] ページに移動します。
    2. フィルタ Name:FOLDER_NAME を適用してフォルダ ID を取得します。
  2. エクスポートされた compute.Project assets データを使用して、BigQuery テーブルにクエリを実行します。

    BigQuery テーブルの作成手順については、フォルダまたは組織内のどのプロジェクトがグローバル DNS を使用しているかを特定するをご覧ください。

    次の GoogleSQL クエリを入力して、[ 実行] をクリックします。

    SELECT
      SUBSTR(name,35) AS project_id,
    FROM PROJECT_ID.DATASET_ID.TABLE_NAME
    WHERE CONTAINS_SUBSTR(ancestors, 'FOLDER_NUMBER')
    

    次のように置き換えます。

    • PROJECT_ID: プロジェクト ID
    • DATASET_ID: BigQuery データセットの名前
    • TABLE_NAME: エクスポートされたメタデータを含むテーブル
    • FOLDER_NUMBER: フォルダ ID 番号
  3. プロジェクト ID のリストをコピーして、ファイルに保存します。

  4. 次の bash スクリプトを実行します。このスクリプトは、保存されたファイルに含まれるプロジェクト ID に対して反復処理を行い、フォルダが移行する準備ができているかどうかを判断します。

#!/bin/bash
inaccessible_projects=()
unready_projects=()

for project in $(cat ~/FILENAME | tr '\n' ' '); do
  echo -e "Checking project $project..."
  ERROR=`curl -s --request POST "https://monitoring.googleapis.com/v3/projects/$project/timeSeries:query"   -H "Authorization: Bearer $(gcloud auth print-access-token)"   -H "Accept: application/json"   -H "Content-Type: application/json"   --data '{"query":"fetch compute.googleapis.com/Location | metric '"'"'compute.googleapis.com/global_dns/request_count'"'"' | filter metric.zonal_dns_readiness = '"'"'zonal_dns_risky'"'"' | every 30d | within 30d"}'   --compressed | jq --raw-output '.error'`
  if ! [[ "$ERROR" -eq "null" ]]; then
    inaccessible_projects+=($project)
    continue
  fi
  QUERY_COUNT=`curl -s --request POST "https://monitoring.googleapis.com/v3/projects/$project/timeSeries:query"   -H "Authorization: Bearer $(gcloud auth print-access-token)"   -H "Accept: application/json"   -H "Content-Type: application/json"   --data '{"query":"fetch compute.googleapis.com/Location | metric '"'"'compute.googleapis.com/global_dns/request_count'"'"' | filter metric.zonal_dns_readiness = '"'"'zonal_dns_risky'"'"' | every 30d | within 30d"}'   --compressed | jq --raw-output '.timeSeriesData[0].pointData[0].values[0].int64Value'`
  if [[ "$QUERY_COUNT" -ne "null" ]] && [[ "$QUERY_COUNT" -ne "0" ]]; then
    unready_projects+=($project)
  fi
done

error_len=${#inaccessible_projects[@]}
unready_len=${#unready_projects[@]}

echo -e "$error_len projects were inaccessible"
echo -e "$unready_len projects were not ready for migration"

if [ $error_len -ne 0 ]; then
  echo "Unable to access the following projects:"
  for project in "${inaccessible_projects[@]}"; do
    echo "$project"
  done
fi
if [ $unready_len -ne 0 ]; then
  echo "The following projects are not ready for migration:"
  for project in "${unready_projects[@]}"; do
    echo "$project"
  done
fi

if (( $error_len + $unready_len > 0 )); then
  echo "This folder is NOT ready for gDNS -> zDNS migration."
else
  echo "This folder is ready for gDNS -> zDNS migration."
fi

FILENAME は、プロジェクト ID リストを保存したファイルの名前に置き換えます。

移行の準備状況の分析結果をプロジェクト オーナーに伝えます。

ゾーン DNS に移行する準備ができていないフォルダを除外する

組織のポリシーからフォルダを除外するには、次の手順に沿って、フォルダレベルのポリシーの適用オプションを Off に設定します。

  1. Google Workspace か Cloud Identity の特権管理者として Google Cloud コンソールにログインします。
  2. コンソールで [組織のポリシー] ページに移動します。

    [組織のポリシー] に移動

  3. [選択] をクリックして、組織のポリシーから除外するフォルダを選択します。

    Google Cloud コンソールに、そのフォルダに対する組織のポリシーの制約のリストが 1 つ以上のページに表示されます。

  4. ゾーン DNS を適用する組織のポリシーの制約を確認するには:

    1. [フィルタ] をクリックします。
    2. [名前] を選択します。
    3. フィルタ名を [新しいプロジェクトの内部 DNS 設定をゾーン DNS のみに設定する] に設定します。
  5. 組織のポリシーの制約名をクリックして、[ポリシーの詳細] ページを開きます。

  6. [編集] をクリックします。

  7. [編集] ページで、[カスタマイズ] を選択します。

  8. [適用] で [オフ] を選択して、制約の適用を無効にします。これにより、フォルダ内のすべてのプロジェクトのデフォルトの内部 DNS タイプは、組織の作成日によって決まります。

  9. [保存] をクリックします。

組織のポリシー制約のカスタマイズの詳細については、Resource Manager ドキュメントのブール型制約用のポリシーのカスタマイズをご覧ください。

新しいプロジェクトにデフォルトでゾーン DNS を適用する

フォルダや組織のポリシーを設定するには、次の手順に沿って操作します。

  1. Google Workspace か Cloud Identity の特権管理者として Google Cloud コンソールにログインします。

  2. コンソールで [組織のポリシー] ページに移動します。

    [組織のポリシー] に移動

  3. 組織のポリシーを表示するフォルダまたは組織を選択します。Google Cloud コンソールに、使用可能な組織のポリシー制約のリストが表示されます。このリストは複数のページにまたがっている場合があります。

  4. ゾーン DNS を適用するポリシーを見つけるには、[フィルタ] をクリックして [名前] を選択し、フィルタ名を [新しいプロジェクトの内部 DNS 設定をゾーン DNS のみに設定する] に設定します。

  5. ポリシー名をクリックして、その詳細を確認します。

    ポリシーの詳細ページには、制約に関する情報と、制約がどのように適用されているかが表示されます。

    デフォルトでは、フォルダまたは組織に対する適用は定義されていません。ただし、親フォルダに適用が定義されている場合は、適用を持つ最も近い親フォルダからその適用が継承されます。詳細については、階層評価についてをご覧ください。

  6. 組織のポリシーをカスタマイズするには、[編集] をクリックします。

  7. 編集ページで [カスタマイズ] を選択します。

  8. [適用] で [オン] を選択します。

    これにより、組織内のすべての新しいプロジェクトで、デフォルトの内部 DNS タイプがゾーン DNS に設定されます。

  9. [保存] をクリックします。

組織のポリシーの変更を確認するには、フォルダまたは組織のもとで新しいプロジェクトを作成して、VM インスタンスを作成して起動し、VM がゾーン DNS に対して有効になっているかどうかを確認します

ワークロードに組み込まれた DNS 名クエリを解決するためにグローバル DNS が必要な場合は、適用を無効にすることで、組織レベルまたはフォルダレベルでこの変更をロールバックできます。

組織またはフォルダでグローバル DNS を使用するように戻す

組織またはフォルダをグローバル DNS を使用するように戻すには、ゾーン DNS の組織のポリシーの適用を停止します。次の手順を実行します。

  1. 組織レベルまたはフォルダレベルで組織のポリシー constraints/compute.setNewProjectDefaultToZonalDNSOnly を無効にします。このポリシーを変更する方法については、新しいプロジェクトにデフォルトでゾーン DNS を適用するをご覧ください。

    [新しいプロジェクトの内部 DNS 設定をゾーン DNS のみに設定する] の適用を [オフ] に設定します。

  2. 組織全体でグローバル DNS を使用するように戻す場合は、組織内のどのフォルダも組織のポリシー constraints/compute.setNewProjectDefaultToZonalDNSOnly を適用していないことを確認します。

  3. プロジェクトとインスタンスにグローバル DNS が構成されていることを確認するには、フォルダまたは組織内のどのプロジェクトがグローバル DNS を使用しているかを特定するをご覧ください。

次のステップ