將可用區 DNS 設為新專案的預設值


本文說明如何更新內部 DNS 政策,以便新專案使用可用區 DNS。區域 DNS 可隔離區域內的服務中斷情形,避免執行個體建立和自動修復等重要服務受到影響,進而提升應用程式可靠性。

事前準備

  • 如果尚未設定驗證,請先完成設定。 「驗證」是指驗證身分的程序,確認您有權存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,請選取下列其中一個選項,向 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. After installing the Google Cloud CLI, initialize it by running the following command:

        gcloud init

        If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

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

        如要在本機開發環境中使用本頁的 REST API 範例,請使用您提供給 gcloud CLI 的憑證。

          After installing the Google Cloud CLI, initialize it by running the following command:

          gcloud init

          If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

        詳情請參閱 Google Cloud 驗證說明文件中的「Authenticate for using 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 設定取決於下列兩項因素:

  • 機構建立日期

    • 2018 年 9 月 6 日後建立:貴機構預設使用區域 DNS。因此無需採取進一步行動。
    • 在 2018 年 9 月 6 日前建立:貴機構預設使用全域 DNS。建議您改用可用區 DNS。
  • 機構政策限制的存在和強制執行:

    即使貴機構是在 2018 年 9 月 6 日前建立,管理員也可能已強制執行政策,規定機構內所有新專案都必須使用區域 DNS。如要檢查這類政策是否存在,可以使用 Google Cloud 控制台或 Google Cloud CLI。

主控台

  1. 前往控制台的「IAM & Admin」>「Identity & Organization」頁面。

    前往「身分識別與機構」

  2. 查看機構的註冊日期。

    「身分識別與機構」控制台頁面的螢幕截圖,顯示註冊完成日期。

  3. 如果貴機構是在 2018 年 9 月 6 日前建立,請檢查機構政策限制是否將所有新建立專案的預設 DNS 類型設為可用區 DNS。

    1. 前往 Google Cloud 控制台的「IAM & Admin」(IAM 與管理)>「Organization Policies」(機構政策) 頁面
    2. 在「Filter」(篩選器) 欄位中輸入 constraints/compute.setNewProjectDefaultToZonalDNSOnly
    3. 如果已設定限制,請按一下名稱「Sets the internal DNS setting for new projects to Zonal DNS Only」(將新專案的內部 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」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 控制台會在一或多個頁面上,顯示該資料夾的機構政策限制清單。

  4. 如要找出強制執行可用區 DNS 的機構政策限制:

    1. 按一下 [篩選]
    2. 選取「名稱」
    3. 將篩選器名稱設為「將新專案的內部 DNS 設定設為僅限可用區 DNS」
  5. 按一下機構政策限制名稱,開啟「政策詳細資料」頁面。

  6. 按一下 [編輯]

  7. 在「Edit」(編輯) 頁面選取 [Customize] (自訂)

  8. 在「Enforcement」(強制執行) 下方,選取「Off」(關閉),即可停用限制條件的強制執行功能。也就是說,資料夾中所有專案的預設內部 DNS 類型,取決於機構的建立日期。

  9. 按一下 [儲存]

如要進一步瞭解如何自訂機構政策限制,請參閱 Resource Manager 說明文件中的「自訂布林值限制條件的政策」一節。

為新專案強制預設使用可用區 DNS

請按照下列步驟,為資料夾或機構設定機構政策。

  1. 以 Google Workspace 或 Cloud Identity 超級管理員身分登入 Google Cloud 控制台。

  2. 前往控制台的「機構政策」頁面。

    前往「機構政策」

  3. 選取要檢視機構政策的資料夾或機構。 Google Cloud 控制台會顯示可用的機構政策限制清單。這份清單可能會有數頁之長。

  4. 如要尋找強制執行可用區 DNS 的政策,請按一下「篩選器」並選取「名稱」,然後將篩選器名稱設為「將新專案的內部 DNS 設定設為僅限可用區 DNS」

  5. 按一下政策名稱即可查看詳細資料

    政策詳細資料頁面會提供限制條件的相關資訊,以及限制條件的套用方式。

    根據預設,系統不會為資料夾或機構定義強制執行狀態。 不過,如果上層資料夾已定義強制執行設定,則會從最接近的上層資料夾繼承強制執行設定。詳情請參閱「瞭解階層評估」。

  6. 如要自訂機構政策,請按一下「編輯」

  7. 在編輯頁面中,選取「自訂」

  8. 在「Enforcement」(強制執行) 下方,選取 [On] (開啟)。

    這會將機構中所有新專案的預設內部 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」。

後續步驟