透過端點存取全域 Google API
本文說明如何使用 Private Service Connect 端點連線至全域 Google API。您可以將 API 要求傳送至端點的內部 IP 位址,而非傳送至服務端點 (例如 storage.googleapis.com) 的公開 IP 位址。
您也可以使用 Private Service Connect 存取其他虛擬私有雲網路中的服務,以及發布服務。
必要的角色
如要取得管理存取全域 Google API 的端點所需的權限,請要求管理員授予您下列 IAM 角色:
-
建立、查看及刪除端點:專案的 Compute 網路管理員 (
roles/compute.networkAdmin) -
自動或手動設定端點的 DNS 項目:
- 專案的 DNS 管理員 (
roles/dns.admin) - 專案的 Service Directory 編輯者 (
roles/servicedirectory.editor)
- 專案的 DNS 管理員 (
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
這些預先定義的角色具備管理端點所需的權限,可存取全域 Google API。如要查看確切的必要權限,請展開「Required permissions」(必要權限) 部分:
所需權限
必須具備下列權限,才能管理存取全域 Google API 的端點:
-
如要建立、查看及刪除端點,請執行下列操作:
-
專案的
compute.networks.use -
專案的
compute.subnetworks.use -
專案的
compute.addresses.createInternal -
專案的
compute.addresses.deleteInternal -
專案的
compute.addresses.get -
專案的
compute.addresses.list -
專案的
compute.addresses.use -
專案的
compute.forwardingRules.create -
專案的
compute.forwardingRules.delete -
專案的
compute.forwardingRules.get -
專案的
compute.forwardingRules.list -
專案的
compute.forwardingRules.pscCreate -
專案的
compute.forwardingRules.pscDelete -
專案的
compute.regionOperations.get -
專案的
servicedirectory.namespaces.create -
專案的
servicedirectory.namespaces.delete -
專案的
servicedirectory.services.create -
專案的
servicedirectory.services.delete
-
專案的
-
如要自動或手動設定端點的 DNS 項目,請按照下列步驟操作:
-
專案的
dns.managedZones.create -
專案的
dns.managedZones.delete -
專案的
dns.networks.bindPrivateDNSZone -
專案的
servicedirectory.namespaces.associatePrivateZone
-
專案的
-
如要在 Google Cloud 控制台中存取「Private Service Connect」頁面,請按照下列步驟操作:
-
專案的
compute.forwardingRules.list -
專案的
compute.globalForwardingRules.list -
專案的
compute.networkEndpointGroups.list -
專案的
compute.regionNetworkEndpointGroups.list -
專案的
compute.urlMaps.list -
專案的
compute.backendService.list -
專案的
compute.regionBackendService.list -
專案的
compute.backendBucket.list -
專案的
compute.targetHttpProxy.list -
專案的
compute.targetHttpsProxy.list -
專案的
compute.regionTargetTcpProxy.list -
專案的
compute.targetTcpProxy.list -
專案的
compute.targetSslProxy.list -
專案的
compute.sslCertificate.list -
專案的
compute.sslPolicy.list -
專案的
compute.regionHealthCheck.list -
專案的
compute.healthCheck.list -
專案的
compute.httpHealthCheck.list -
專案的
compute.httpsHealthCheck.list
-
專案的
事前準備
如要進一步瞭解如何使用端點連線至 Google API,包括 DNS 設定和限制,請參閱「關於使用端點連線至 Google API」。
專案必須啟用下列 API:
如果 Google Cloud 控制台的 API 程式庫頁面顯示「Manage」(管理) 按鈕,表示 API 已啟用。如果看到「Enable」(啟用) 按鈕,表示 API 尚未啟用,必須點選「Enable」(啟用) 按鈕才能啟用。
您必須選擇要用於端點的 IP 位址。如要瞭解可使用的 IP 位址,請參閱「IP 位址規定」。
輸出防火牆規則必須允許流量傳送至端點。虛擬私有雲網路的預設防火牆設定含有默示允許輸出規則,因此會允許這類流量。確認您未建立優先順序較高的輸出規則,封鎖流量。
如果虛擬機器 (VM) 執行個體未獲派外部 IP 位址,則必須使用已啟用 Private Google Access 的子網路,才能透過端點存取 Google API 和服務。
即使子網路停用 Private Google Access,具有外部 IP 位址的 VM 仍可使用端點存取 Google API 和服務。與端點的連線會保留在 Google 網路中。
如果虛擬私有雲網路不含任何端點,請檢查
p.googleapis.com是否有 Cloud DNS 私人區域。如果區域已存在,請先刪除,再建立端點。如果不刪除,就無法建立用於 Private Service Connect 的 Service Directory DNS 區域。詳情請參閱「疑難排解」。無法從對接的虛擬私有雲網路存取端點。
為子網路啟用 Private Google Access
如果 VM 未指派外部 IP 位址,則必須連線至已啟用 Private Google Access 的子網路,才能使用端點存取 Google API 和服務。
如果 VM 有多個介面,請連結已設定預設路由的介面 (通常是 nic0)。
從 VM 傳送的封包,其來源 IP 位址必須與 VM 介面的主要內部 IPv4 位址,或別名 IP 範圍內的內部 IPv4 位址相符。
如要在子網路上啟用 Private Google Access,請按照下列步驟操作。
控制台
前往 Google Cloud 控制台的「VPC Networks」(虛擬私有雲網路) 頁面。
針對您需要啟用私人 Google 存取權的子網路,按一下包含該子網路的網路名稱。
按一下子網路的名稱,系統隨即會顯示「Subnet details」(子網路詳細資料) 頁面。
按一下 [編輯]。
在「私人 Google 存取權」區段中,選取 [開啟]。
按一下 [儲存]。
gcloud
確定子網路的名稱和地區。如要列出特定網路的子網路,請使用下列指令:
gcloud compute networks subnets list --filter=NETWORK_NAME
執行下列指令,啟用私人 Google 存取權:
gcloud compute networks subnets update SUBNET_NAME \ --region=REGION \ --enable-private-ip-google-access
執行下列指令,確認已啟用 Private Google Access:
gcloud compute networks subnets describe SUBNET_NAME \ --region=REGION \ --format="get(privateIpGoogleAccess)"
更改下列內容:
SUBNET_NAME:子網路名稱REGION:子網路的區域NETWORK_NAME:子網路所在的虛擬私有雲網路名稱
Terraform
您可以使用 Terraform 資源,在子網路上啟用 Private Google Access。
如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。
建立端點
選擇符合規定的 IP 位址後,即可建立端點。
端點會使用全域轉送規則,連線至 Google API 和服務。每項轉送規則都會計入 Private Service Connect 的各虛擬私有雲網路配額。
Google API 和服務的端點建立後即無法更新。如要更新 Google API 和服務的端點,請刪除端點,然後建立新的端點。
控制台
前往 Google Cloud 控制台的「Private Service Connect」頁面。
按一下「Connected endpoints」(已連結的端點) 分頁標籤。
按一下「連結端點」。
在「Target」(目標) 部分,選取要使用的目標 API 套件:
- 所有 Google API
- VPC-SC
在「Endpoint name」(端點名稱) 部分,輸入端點名稱。
選取端點的「網路」。
選取端點的「IP Address」(IP 位址)。
IP 位址必須符合這些規定。
如需新的 IP 位址,可以建立一個:
- 按一下「建立 IP 位址」。
- 輸入 IP 位址的「名稱」和「說明」。
- 輸入要使用的 IP 位址,然後按一下「儲存」。
如果這個虛擬私有雲網路尚未設定「Service Directory region」(Service Directory 區域),請選取要使用的區域。
在特定虛擬私有雲網路中,用於存取 Google API 和服務的所有端點,都會使用相同的 Service Directory 區域。
如果這個虛擬私有雲網路尚未設定 Service Directory 命名空間,請設定要使用的命名空間:
如要使用自動指派的命名空間,請按一下「Namespace」(命名空間) 選單,然後選取自動指派的命名空間。
如要選取其他網路使用的現有命名空間,請按一下「Namespace」(命名空間) 下拉式選單,然後從清單中選取命名空間。清單會顯示專案中的所有命名空間。您必須選取僅用於存取 Google API 的端點命名空間。
如要建立新的命名空間,請按一下「Namespace」(命名空間) 下拉式選單,然後點選「Create namespace」(建立命名空間)。輸入命名空間,然後按一下「Create」(建立)。
在特定虛擬私有雲網路中,您用來存取 Google API 和服務的所有端點,都會使用相同的 Service Directory 命名空間。
按一下「新增端點」。
gcloud
保留要指派給端點的全域內部 IP 位址。
gcloud compute addresses create ADDRESS_NAME \ --global \ --purpose=PRIVATE_SERVICE_CONNECT \ --addresses=ENDPOINT_IP \ --network=NETWORK_NAME更改下列內容:
ADDRESS_NAME:要指派給預留 IP 位址的名稱。ENDPOINT_IP:要為端點保留的 IP 位址。IP 位址必須符合這些規定。
NETWORK_NAME:端點的虛擬私有雲網路名稱。
建立轉送規則,將端點連線至 Google API 和服務。
--service-directory-registration旗標為選用項目。如果省略,系統會重複使用現有命名空間,如果沒有現有命名空間,則會指派系統產生的命名空間。gcloud compute forwarding-rules create ENDPOINT_NAME \ --global \ --network=NETWORK_NAME \ --address=ADDRESS_NAME \ --target-google-apis-bundle=API_BUNDLE \ --service-directory-registration=REGION_NAMESPACE_URI更改下列內容:
ENDPOINT_NAME:要指派給端點的名稱。名稱必須是 1 到 20 個字元的字串,且只能包含小寫字母和數字。名稱開頭須為英文字母。NETWORK_NAME:端點的虛擬私有雲網路名稱。ADDRESS_NAME:相關聯網路上保留位址的名稱。API_BUNDLE:要透過端點提供的 API 組合。請參閱支援的 API 清單。使用
all-apis授予所有支援 API 的存取權。使用
vpc-sc限制存取支援 VPC Service Controls 的 Google API。
REGION_NAMESPACE_URI:要使用的 Service Directory 區域或命名空間 URI。這個 URI 必須參照您建立端點的專案。您只能使用
projects/PROJECT_NAME/locations/REGION定義區域。您可以使用
projects/PROJECT_NAME/locations/REGION/namespaces/NAMESPACE定義區域和命名空間。如果完全省略
--service-directory-registration,或設定沒有命名空間的區域,會發生以下情況:如果這個虛擬私有雲網路已設定區域或命名空間,系統會使用這些預設值。
如未設定區域,系統會將區域設為
us-central1。如未設定命名空間,系統會指派產生的命名空間。
API
保留要指派給端點的全域內部 IP 位址。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/addresses
{ "name": ADDRESS_NAME, "address": ENDPOINT_IP, "addressType": "INTERNAL", "purpose": PRIVATE_SERVICE_CONNECT, "network": NETWORK_URL }更改下列內容:
PROJECT_ID:您的專案 ID。ADDRESS_NAME:要指派給預留 IP 位址的名稱。ENDPOINT_IP:要為端點保留的 IP 位址。IP 位址必須符合這些規定。
NETWORK_URL:端點的虛擬私有雲網路。
建立轉送規則,將端點連線至 Google API 和服務。
serviceDirectoryRegistrations物件為選用項目。如果省略,系統會重複使用現有命名空間,如果沒有現有命名空間,則會指派系統產生的命名空間。POST https://compute.googleapis.com/compute/v1/projects/PROJECT/global/forwardingRules
{ "name": "ENDPOINT_NAME", "IPAddress": "projects/PROJECT/global/addresses/ADDRESS_NAME", "network": "projects/PROJECT/global/networks/NETWORK", "target": "API_BUNDLE", "serviceDirectoryRegistrations": [ { "service_directory_region": REGION, "namespace": "NAMESPACE" } ], }更改下列內容:
PROJECT:您的專案 ID。ENDPOINT_NAME:要指派給端點的名稱。名稱必須是 1 到 20 個字元的字串,且只能包含小寫英文字母和數字。名稱開頭須為英文字母。NETWORK:端點的虛擬私有雲網路。ADDRESS_NAME:相關聯網路上保留位址的名稱。API_BUNDLE:要透過端點提供的 API 組合。請參閱支援的 API 清單。使用
all-apis授予所有支援 API 的存取權。使用
vpc-sc限制存取支援 VPC Service Controls 的 Google API。
REGION:要使用的 Service Directory 區域。例如:us-central1。如果省略REGION,且這個虛擬私有雲網路已設定區域,系統就會使用該區域。如未設定區域,則會設為us-central1。NAMESPACE:要使用的 Service Directory 命名空間名稱。如果省略NAMESPACE,且這個虛擬私有雲網路已設定命名空間,系統就會使用該命名空間。如未設定命名空間,系統會指派產生的命名空間。
Terraform
您可以使用下列 Terraform 資源建立端點:
確認端點運作正常
在已設定 Private Service Connect 的虛擬私有雲網路中,建立 VM 執行個體。在 VM 上執行下列指令,確認 Private Service Connect 端點是否正常運作。端點不會回應連線偵測 (ICMP) 要求。
curl -v ENDPOINT_IP/generate_204
將 ENDPOINT_IP 替換為端點的 IP 位址。
如果端點正常運作,您會看到 HTTP 204 回應代碼。
列出端點
您可以列出所有已設定的端點。
控制台
前往 Google Cloud 控制台的「Private Service Connect」頁面。
按一下「Connected endpoints」(已連結的端點) 分頁標籤。
系統隨即會顯示端點。
gcloud
gcloud compute forwarding-rules list \ --filter target="(all-apis OR vpc-sc)" --global
輸出結果會與下列內容相似:
NAME REGION IP_ADDRESS IP_PROTOCOL TARGET RULE IP TCP all-apis
取得端點相關資訊
您可以查看端點的所有設定詳細資料。
控制台
前往 Google Cloud 控制台的「Private Service Connect」頁面。
按一下「Connected endpoints」(已連結的端點) 分頁標籤。
系統會顯示端點。
按一下要查看詳細資料的端點。
gcloud
gcloud compute forwarding-rules describe \
ENDPOINT_NAME --global
為端點加上標籤
您可以管理端點的標籤。詳情請參閱標籤資源。
刪除端點
您可以刪除端點。
控制台
前往 Google Cloud 控制台的「Private Service Connect」頁面。
按一下「Connected endpoints」(已連結的端點) 分頁標籤。
選取要刪除的端點,然後按一下「Delete」(刪除)。
gcloud
gcloud compute forwarding-rules delete \
ENDPOINT_NAME --global
將 ENDPOINT_NAME 替換為要刪除的端點名稱。
使用端點
如要使用端點,請將要求傳送至 DNS 主機名稱,該名稱會解析為端點的 IP 位址。
如果可以將用戶端設為使用自訂端點,且已為要使用的 API 和服務建立
p.googleapis.comDNS 記錄,則可使用自動建立的p.googleapis.comDNS 名稱。詳情請參閱「使用p.googleapis.comDNS 名稱」。舉例來說,如果端點名稱為
xyz,系統會為storage-xyz.p.googleapis.com、compute-xyz.p.googleapis.com和 API 套件中其他常用的 API 建立 DNS 記錄。如果您使用的用戶端未設為使用自訂端點,或要使用的服務沒有
p.googleapis.comDNS 記錄,則可使用預設 DNS 名稱建立 DNS 記錄。詳情請參閱「使用預設 DNS 名稱建立 DNS 記錄」。例如,為
*.googleapis.com或*.pkg.dev建立 DNS 記錄。
使用 p.googleapis.com DNS 名稱
建立端點時,Service Directory 會為可透過端點使用的常用 API 和服務建立 DNS 記錄。系統只會為預設 DNS 名稱結尾為 googleapis.com 的 API 和服務建立 DNS 記錄,且僅限部分 API 和服務。
DNS 記錄是在 p.googleapis.com 私人區域中建立。記錄會指向端點 IP 位址,並使用以下格式:SERVICE-ENDPOINT.p.googleapis.com。
舉例來說,如果端點名稱為 xyz,系統會為 storage-xyz.p.googleapis.com、compute-xyz.p.googleapis.com 和其他支援的 API 建立 DNS 記錄。
如果用戶端可設為使用自訂端點,則可透過 p.googleapis.com DNS 名稱將要求傳送至端點。
請參閱用戶端或用戶端程式庫的說明文件,瞭解如何設定使用自訂端點。例如:
Python:您可以在用戶端選項中設定
api_endpoint。Go:您可以在 ClientOptions 中設定
WithEndpoint。.NET:您可以在用戶端的建構工具類別中設定
Endpoint。Java:您可以在用戶端的設定類別中設定
setEndpoint。gcloud:您可以在 gcloud CLI 中設定
api_endpoint_overrides。
使用預設 DNS 名稱建立 DNS 記錄
在下列情況下,您必須建立 DNS 記錄,將 API 和服務的預設 DNS 名稱導向端點:
用戶端或應用程式無法設定為使用
p.googleapis.comDNS 名稱。您需要存取支援的服務,但該服務沒有自動建立的
p.googleapis.comDNS 名稱。
如要建立指向 Private Service Connect 端點的 DNS 記錄,請按照下列指示操作:
為您要使用的網域 (例如
googleapis.com或pkg.dev) 建立 DNS 區域。建議您為此建立 Cloud DNS 私人區域。在這個 DNS 區域中:
為網域 (區域) 名稱本身建立
A記錄,例如googleapis.com或pkg.dev。將這筆A記錄指向端點的 IP 位址。如果您使用 Cloud DNS,請參閱「新增記錄」。使用星號和點號,後面加上網域 (區域) 名稱,為所有額外網域可能的主機名稱建立
CNAME記錄;例如*.googleapis.com或*.pkg.dev。將這筆CNAME記錄指向同一區域中的A記錄。例如,將*.googleapis.com指向googleapis.com,或將*.pkg.dev指向pkg.dev。
透過混合式網路存取端點
如果網路透過 Cloud Interconnect 或 Cloud VPN 通道的 VLAN 連結連線至 Google Cloud ,則該網路中的用戶端可以連線至 Private Service Connect 端點。
Private Service Connect 端點必須位於連線至其他網路的虛擬私有雲網路中。
另一個網路必須有端點的適當路由。設定 Cloud Router 自訂路由 advertisement,在管理 Cloud VPN 通道或 VLAN 連結路由的 BGP 工作階段中,公告端點的路由。
- 如果其他網路使用等價多路徑 (ECMP) 轉送,將流量分配至 Private Service Connect 端點,則必須確保單一 TCP 連線的所有封包都透過相同的 Cloud VPN 通道或 VLAN 連結轉送。如果已建立的 TCP 連線封包透過多個路徑轉送,您可能會遇到間歇性 TCP 重設 (RST)。為避免重設,請設定地端部署對等互連路由器,維持一致的下一個躍點目的地。
您必須設定其他網路中的系統,才能對私人 DNS 區域執行查詢。如果您已使用 Cloud DNS 實作私人 DNS 區域,請完成下列步驟:
在其他網路連線的虛擬私有雲網路中,建立傳入伺服器政策。
在其他網路連線的虛擬私有雲網路中,找出 Cloud VPN 通道和 VLAN 連結所在區域的傳入轉寄站進入點。
設定其他網路中的系統和 DNS 名稱伺服器,將 Private Service Connect 端點的 DNS 名稱轉送至傳入轉送站進入點,該進入點與連線至虛擬私有雲網路的 Cloud VPN 通道或 VLAN 連結位於相同區域。
疑難排解
下列各節說明如何解決用於存取 Google API 的 Private Service Connect 端點問題。
無法建立私人 DNS 區域
建立端點時,系統會建立 Service Directory DNS 區域。建立區域失敗的原因可能包括:
專案未啟用 Cloud DNS API。
您沒有建立 Service Directory DNS 區域所需的權限。
這個虛擬私有雲網路中已有相同名稱的 DNS 區域。
這個虛擬私有雲網路已有
p.googleapis.com的 DNS 區域。
如果先前的刪除作業失敗,可能會出現衝突的可用區。
如要建立 Service Directory DNS 區域,請按照下列步驟操作:
確認專案已啟用 Cloud DNS API。
確認您具備建立 Service Directory DNS 區域所需的權限:
dns.managedZones.createservicedirectory.namespaces.associatePrivateZone
建立 Service Directory DNS 區域,並以與端點相關聯的 Service Directory 命名空間做為後盾。
建立區域時,請使用下列值:
Zone name (可用區名稱):使用系統在建立失敗時所用的可用區名稱。錯誤訊息會顯示使用的可用區名稱。
DNS 名稱:
p.googleapis.com.(包括結尾的點號)。Service Directory 命名空間:找出您建立的 Private Service Connect 端點的 Service Directory 命名空間,並在建立 Service Directory DNS 區域時使用這個命名空間。
Service Directory 命名空間的格式如下:
goog-psc-NETWORK_NAME-NETWORK_ID。
無法刪除私人 DNS 區域
刪除虛擬私有雲網路中的最後一個端點時,系統會一併刪除相關聯的 Service Directory 設定,包括 DNS 區域。
刪除失敗的原因可能如下:
您沒有刪除 DNS 區域的必要權限。
這個區域含有使用者定義的 DNS 項目,並非由 Service Directory 建立。
請按照下列步驟解決這個問題: