透過端點存取 Google API
本文說明如何使用 Private Service Connect 端點連線至 Google API。您可以將 API 要求傳送至端點的內部 IP 位址,不必傳送至服務端點的公開 IP 位址,例如 storage.googleapis.com
。
您也可以使用 Private Service Connect 存取其他虛擬私有雲網路中的服務,以及發布服務。
角色
下列 IAM 角色提供執行本指南中工作所需的權限。
工作 | 角色 |
---|---|
建立端點 |
下列所有角色: Compute Network Admin ( roles/compute.networkAdmin )、
Service Directory Editor ( roles/servicedirectory.editor ) 和
DNS Administrator ( roles/dns.admin )
|
設定私人 Google 存取權 (選用) |
Compute
Network Admin (roles/compute.networkAdmin )
|
事前準備
如要瞭解詳情 (包括 DNS 設定和限制),請參閱「關於使用端點連線至 Google API」。
Private Service Connect 不會自動啟用任何 API。您必須在控制台的「API 和服務」頁面中,分別啟用需要使用的 Google API。 Google Cloud
您必須在專案中啟用 Compute Engine API。
您必須在專案中啟用 Service Directory API。
您必須在專案中啟用 Cloud DNS API。
您必須選擇要用於端點的 IP 位址。如要瞭解可使用的 IP 位址,請參閱IP 位址規定。
輸出防火牆規則必須允許流量傳送至端點。虛擬私有雲網路的預設防火牆設定允許這類流量,因為其中包含默示允許輸出規則。確認您未建立優先順序較高的輸出規則,導致流量遭到封鎖。
如果虛擬機器 (VM) 執行個體未獲派外部 IP 位址,就必須使用已啟用私人 Google 存取權的子網路,才能透過端點存取 Google API 和服務。
即使子網路停用私人 Google 存取權,具有外部 IP 位址的 VM 仍可使用端點存取 Google API 和服務。端點的連線會留在 Google 的網路內。
如果虛擬私有雲網路不含任何端點,請檢查
p.googleapis.com
是否有 Cloud DNS 私人區域。如果區域存在,請先刪除再建立端點。如果不刪除,系統就無法建立用於 Private Service Connect 的 Service Directory DNS 區域。詳情請參閱疑難排解。無法從對等互連的虛擬私有雲網路存取端點。
為子網路啟用 Private Google Access
如要使用端點存取 Google API 和服務,未指派外部 IP 位址的 VM 必須連線至已啟用私人 Google 存取權的子網路。
如果 VM 有多個介面,請連線至已設定預設路由的介面 (通常是 nic0
)。
從 VM 傳送的封包來源 IP 位址,必須與 VM 介面的主要內部 IPv4 位址,或別名 IP 範圍內的內部 IPv4 位址相符。
如要在子網路中啟用 Private Google Access,請按照下列步驟操作。
主控台
在 Google Cloud 控制台中,前往「VPC networks」(虛擬私有雲網路) 頁面。
針對您需要啟用私人 Google 存取權的子網路,按一下包含該子網路的網路名稱。
按一下子網路的名稱,系統會顯示「子網路詳細資料」頁面。
按一下 [編輯]。
在「私人 Google 存取權」區段中,選取 [開啟]。
按一下 [儲存]。
gcloud
確定子網路的名稱和地區。如要列出特定網路的子網路,請使用以下指令:
gcloud compute networks subnets list --filter=NETWORK_NAME
執行下列指令,啟用 Private Google Access:
gcloud compute networks subnets update SUBNET_NAME \ --region=REGION \ --enable-private-ip-google-access
執行下列指令,確認私人 Google 存取權是否已啟用:
gcloud compute networks subnets describe SUBNET_NAME \ --region=REGION \ --format="get(privateIpGoogleAccess)"
更改下列內容:
SUBNET_NAME
:子網路名稱REGION
:子網路的區域NETWORK_NAME
:包含子網路的 VPC 網路名稱
Terraform
您可以使用 Terraform 資源在子網路上啟用 Private Google Access。
如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。
建立端點
選擇符合規定的 IP 位址後,即可建立端點。
端點會使用全域轉送規則連線至 Google API 和服務。每項轉送規則都會計入 Private Service Connect 的每個 VPC 網路配額。
建立 Google API 和服務的端點後,就無法更新。如要更新 Google API 和服務的端點,請刪除端點,然後建立新端點。
主控台
前往 Google Cloud 控制台的「Private Service Connect」頁面。
按一下「已連線的端點」分頁標籤。
按一下「連結端點」。
在「目標」中,選取要使用的目標 API 組合:
- 所有 Google API
- VPC-SC
在「端點名稱」中,輸入端點的名稱。
選取端點的「網路」。
選取端點的 IP 位址。
IP 位址必須符合這些規定。
如需新的 IP 位址,請建立一個:
- 按一下「建立 IP 位址」。
- 輸入 IP 位址的「名稱」和「說明」。
- 輸入要使用的 IP 位址,然後按一下「儲存」。
如果尚未為這個 VPC 網路設定 Service Directory 區域,請選取要使用的區域。
在特定虛擬私有雲網路中,用於存取 Google API 和服務的所有端點,都會使用相同的 Service Directory 區域。
如果尚未為這個虛擬私有雲網路設定 Service Directory 命名空間,請設定要使用的命名空間:
如要使用自動指派的命名空間,請按一下「命名空間」下拉式選單,然後選取自動指派的命名空間。
如要選取其他網路使用的現有命名空間,請按一下「命名空間」下拉式選單,然後從清單中選取命名空間。清單會顯示專案中的所有命名空間。您必須選取僅用於存取 Google API 的端點的命名空間。
如要建立新的命名空間,請按一下「命名空間」下拉式選單,然後按一下「建立命名空間」。輸入命名空間,然後按一下「建立」。
您在特定 VPC 網路中用來存取 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 和服務。
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
,或設定沒有命名空間的區域,會發生下列情況:如果已為這個 VPC 網路設定區域或命名空間,系統會使用這些預設值。
如果未設定區域,系統會將區域設為
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
:端點的 VPC 網路。使用 network.list 方法或gcloud compute networks list --uri
找出網路的網址。
建立轉送規則,將端點連線至 Google API 和服務。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/forwardingRules { "IPAddress": ADDRESS_URL, "network": NETWORK_URL, "name": ENDPOINT_NAME, "target": API_BUNDLE, "serviceDirectoryRegistrations : [ { "service_directory_region": REGION, "namespace": "NAMESPACE" } ], }
更改下列內容:
PROJECT_ID
:您的專案 ID。ENDPOINT_NAME
:要指派給端點的名稱。 名稱必須是 1 到 20 個字元的字串,只能包含小寫字母和數字。名稱開頭必須是英文字母。NETWORK_URL
:端點的 VPC 網路。使用 network.list 方法或gcloud compute networks list --uri
找出網路的網址。ADDRESS_URL
:相關聯網路上保留位址的網址。使用 globalAddresses.list 方法或gcloud compute addresses list --uri
,找出預留地址的網址。API_BUNDLE
:透過端點提供的 API 套件。請參閱支援的 API 清單。使用
all-apis
授予所有支援 API 的存取權。使用
vpc-sc
限制對支援 VPC Service Controls 的 Google API 的存取權。
REGION
:要使用的 Service Directory 區域。例如:us-central1
。 如果省略REGION
,且已為這個 VPC 網路設定區域,系統會使用該區域。如果未設定地區,系統會將地區設為us-central1
。NAMESPACE
:您要使用的服務目錄命名空間名稱。如果省略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」頁面。
按一下「已連線的端點」分頁標籤。
系統會顯示端點。
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」頁面。
按一下「已連線的端點」分頁標籤。
系統會顯示端點。
按一下要查看詳細資料的端點。
gcloud
gcloud compute forwarding-rules describe \ ENDPOINT_NAME --global
為端點加上標籤
您可以管理端點的標籤。詳情請參閱「標記資源」。
刪除端點
您可以刪除端點。
主控台
前往 Google Cloud 控制台的「Private Service Connect」頁面。
按一下「已連線的端點」分頁標籤。
選取要刪除的端點,然後按一下「刪除」。
gcloud
gcloud compute forwarding-rules delete \ ENDPOINT_NAME --global
將 ENDPOINT_NAME
替換為要刪除的端點名稱。
使用端點
如要使用端點,請將要求傳送至會解析為端點 IP 位址的 DNS 主機名稱。
如果您可以設定用戶端使用自訂端點,且系統已為您要使用的 API 和服務建立
p.googleapis.com
DNS 記錄,即可使用自動建立的p.googleapis.com
DNS 名稱。詳情請參閱「使用p.googleapis.com
DNS 名稱」。舉例來說,如果端點名稱為
xyz
,系統會為storage-xyz.p.googleapis.com
、compute-xyz.p.googleapis.com
和 API 套件中其他常用的 API 建立 DNS 記錄。如果您使用的用戶端尚未設定為使用自訂端點,或是要使用的服務沒有
p.googleapis.com
DNS 記錄,可以使用預設 DNS 名稱建立 DNS 記錄。詳情請參閱「使用預設 DNS 名稱建立 DNS 記錄」。例如,為
storage.googleapis.com
、compute.googleapis.com
或*.gke.goog
建立 DNS 記錄。
使用 p.googleapis.com
DNS 名稱
建立端點時,Service Directory 會為常用 API 和服務建立 DNS 記錄,這些 API 和服務可透過端點使用。只有預設 DNS 名稱結尾為 googleapis.com
的 API 和服務,以及這些 API 和服務的子集,才會建立 DNS 記錄。
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
。前往:您可以在 ClientOptions 中設定
WithEndpoint
。.NET:您可以在用戶端的建構工具類別中設定
Endpoint
。gcloud:您可以在 gcloud CLI 中設定
api_endpoint_overrides
。
使用預設 DNS 名稱建立 DNS 記錄
在下列情況下,您需要建立 DNS 記錄,將 API 和服務的預設 DNS 名稱導向端點:
無法將用戶端或應用程式設定為使用
p.googleapis.com
DNS 名稱。您需要存取支援的服務,但該服務沒有自動建立的
p.googleapis.com
DNS 名稱。
如要建立指向 Private Service Connect 端點的 DNS 記錄,請按照下列操作說明進行:
為要使用的網域建立 DNS 區域 (例如
googleapis.com
或gcr.io
)。建議您為此目的建立 Cloud DNS 私人區域。在這個 DNS 區域中:
為網域 (區域) 名稱本身建立
A
記錄,例如googleapis.com
或gcr.io
。將這個A
記錄指向端點的 IP 位址。如果您使用 Cloud DNS,請參閱新增記錄。使用星號和半形句號,然後加上網域 (區域) 名稱,為所有可能的額外網域主機名稱建立
CNAME
記錄,例如*.googleapis.com
或*.gcr.io
。將這個CNAME
記錄指向同一個區域中的A
記錄。例如,從*.googleapis.com
指向googleapis.com
,或從*.gcr.io
指向gcr.io
。
透過地端部署主機存取端點
如果內部部署網路已連線至虛擬私有雲網路,您可以使用 Private Service Connect,透過端點的內部 IP 位址,從內部部署主機存取 Google API 和服務。
您的內部部署網路必須使用 Cloud VPN 通道或 Cloud Interconnect 的 VLAN 連結,連線至虛擬私有雲網路。
端點必須位於與內部部署網路連線的 VPC 網路中。
內部部署網路必須具備端點的適當路徑。 設定 Cloud Router 自訂路徑通告,在管理 Cloud VPN 通道或 VLAN 連結路徑的 BGP 工作階段中,通告端點的路徑。
- 如果內部部署網路使用等價多路徑路由 (ECMP) 將流量分配至 Private Service Connect 端點,請務必確保單一 TCP 連線的所有封包都透過相同的 Cloud VPN 通道或 VLAN 附件路由。如果已建立 TCP 連線的封包是透過多個路徑傳送,您可能會遇到間歇性 TCP 重設 (RST)。為避免重設,請設定內部部署對等互連路由器,以維持一致的下一個躍點目的地。
您必須設定地端系統,才能查詢私人 DNS 區域。
如果您已使用 Cloud DNS 實作私人 DNS 區域,請完成下列步驟:
在內部部署網路連線的虛擬私有雲網路中,建立傳入伺服器政策。
找出地端部署網路所連線的虛擬私有雲網路中,Cloud VPN 通道和 VLAN 連結所在區域的傳入轉送器進入點。
設定內部部署系統和內部部署 DNS 名稱伺服器,將私人服務連線端點的 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.create
servicedirectory.namespaces.associatePrivateZone
建立 Service Directory DNS 區域,並以與端點相關聯的 Service Directory 命名空間為後盾。
建立區域時,請使用下列值:
區域名稱:請使用系統在建立作業失敗時使用的區域名稱。錯誤訊息會顯示使用的區域名稱。
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 建立。
如要解決這個問題,請按照下列步驟操作: