本教學課程說明如何在虛擬私有雲 (VPC) 網路中建立內部 HTTP 端點,透過 Eventarc 接收 Pub/Sub 訊息事件。如要進一步瞭解這個事件目的地,請參閱「將事件傳送至虛擬私有雲網路中的內部 HTTP 端點」。
您可以在終端機或 Cloud Shell 中,使用 Google Cloud CLI 執行下列指令。
目標
在這個教學課程中,您將執行下列操作:
- 建立虛擬私有雲網路,為雲端資源和服務提供網路。虛擬私有雲網路在 Google Cloud中與其他網路在邏輯上彼此獨立。
- 建立子網路。每個虛擬私有雲網路都含有一或多個稱為「子網路」的 IP 位址範圍。子網路是區域性資源,具有相關聯的 IP 位址範圍。
- 建立虛擬私有雲防火牆規則,允許或拒絕虛擬私有雲網路中 VM (虛擬機器) 執行個體的往來流量。
- 建立網路連結,讓供應商虛擬私有雲網路啟動與用戶虛擬私有雲網路的連線。
- 在 VPC 網路中建立 Compute Engine VM 執行個體。
- 在 VM 執行個體上,將網路伺服器部署為事件接收器服務。
- 建立 Eventarc 觸發條件,將 Pub/Sub 事件轉送至 VM 執行個體上的事件接收器。
- 建立與 VM 執行個體的 SSH 連線。
- 將訊息發布至 Pub/Sub 主題來產生事件,並在「直接透過瀏覽器進行 SSH 連線」工具中查看事件主體。
費用
在本文件中,您會使用 Google Cloud的下列計費元件:
如要根據預測用量估算費用,請使用 Pricing Calculator。
完成本文所述工作後,您可以刪除已建立的資源,避免繼續計費。詳情請參閱清除所用資源一節。
事前準備
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Compute Engine, Eventarc, and Pub/Sub APIs:
gcloud services enable compute.googleapis.com
eventarc.googleapis.com pubsub.googleapis.com -
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Compute Engine, Eventarc, and Pub/Sub APIs:
gcloud services enable compute.googleapis.com
eventarc.googleapis.com pubsub.googleapis.com - 更新 Google Cloud CLI 元件:
gcloud components update
- 登入帳戶:
gcloud auth login
- 設定本快速入門導覽課程中使用的設定變數:
REGION=us-central1 ZONE=us-central1-a
-
如果您是專案建立者,系統會授予基本「擁有者」角色 (
roles/owner
)。根據預設,這個身分與存取權管理 (IAM) 角色包含完全存取大多數 Google Cloud資源所需的權限,因此您可以略過這個步驟。如果您不是專案建立者,必須在專案中將必要權限授予適當的主體。舉例來說,主體可以是 Google 帳戶 (適用於使用者) 或服務帳戶 (適用於應用程式和運算工作負載)。詳情請參閱活動目的地的「角色和權限」頁面。
所需權限
如要取得完成本快速入門所需的權限,請要求管理員為您授予專案的下列 IAM 角色:
-
Compute 網路管理員 (
roles/compute.networkAdmin
) -
Compute 安全性管理員 (
roles/compute.securityAdmin
) -
Eventarc 管理員 (
roles/eventarc.admin
) -
記錄檔檢視存取者 (
roles/logging.viewAccessor
) -
專案 IAM 管理員 (
roles/resourcemanager.projectIamAdmin
) -
Pub/Sub Publisher (
roles/pubsub.publisher
) -
服務帳戶管理員 (
roles/iam.serviceAccountAdmin
) -
服務帳戶使用者 (
roles/iam.serviceAccountUser
) -
服務使用情形管理員 (
roles/serviceusage.serviceUsageAdmin
)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
-
Compute 網路管理員 (
- 如果您是在 2021 年 4 月 8 日當天或之前啟用 Cloud Pub/Sub 服務代理,請將服務帳戶權杖建立者角色 (
roles/iam.serviceAccountTokenCreator
) 授予服務代理,以支援已驗證的 Pub/Sub 推送要求。否則,系統會預設授予這個角色: 取代下列項目:gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \ --role=roles/iam.serviceAccountTokenCreator
建立自訂模式虛擬私有雲網路
虛擬私有雲網路是實體網路的虛擬版本,而且已導入 Google 的正式環境網路。可為 Compute Engine VM 執行個體提供連線。
建立自訂模式 VPC 網路時,系統不會自動建立子網路。這類型網路可讓您完全控制其中的子網路和 IP 範圍。
gcloud compute networks create NETWORK_NAME \ --subnet-mode=custom \ --bgp-routing-mode=regional \ --mtu=1460
將 NETWORK_NAME
替換為虛擬私有雲網路的名稱。
注意事項:
- 您建立的每一個網路,在專案中的名稱均不可重複。
-
邊界閘道通訊協定 (BGP) 轉送模式可控制網路中 Cloud Router 的行為,可以是
global
或regional
。預設值為regional
。 - 最大傳輸單位 (MTU) 是網路的最大封包大小。MTU 可設為
1300
到8896
之間的任何值。預設值為1460
。將 MTU 設為大於1460
的值之前,請先參閱「最大傳輸單位」。
詳情請參閱「建立及管理虛擬私有雲網路」。
建立僅限 IPv4 的子網路
網路至少要有一個子網路,您才能開始使用。
建立子網路時,須設定名稱、地區,以及至少一個主要 IPv4 位址 (以子網路規則為準)。請注意,您無法在未定義子網路的區域中建立執行個體。
gcloud compute networks subnets create SUBNET_NAME \ --region=$REGION \ --network=NETWORK_NAME \ --range=10.10.10.0/24
將 SUBNET_NAME
替換為新子網路的名稱。
詳情請參閱「子網路」。
建立虛擬私有雲防火牆規則
虛擬私有雲防火牆規則可讓您根據通訊埠號碼、標記或通訊協定,允許或拒絕虛擬私有雲網路中資源之間的流量。
虛擬私有雲防火牆規則是在網路層級定義,且僅會套用到規則建立時所在的網路。不過,您為規則選擇的名稱在專案內必須為專屬名稱。
為虛擬私有雲網路建立防火牆規則,允許來自任何 IPv4 位址 (
0.0.0.0/0
) 的傳入流量,透過通訊埠 22 傳送至網路上的任何執行個體。活動放送時不必遵守這項規則。不過,在本教學課程中,請建立規則,以便使用 SSH 連線至 VM,並確認事件是否已傳送:gcloud compute firewall-rules create RULE_NAME_ONE \ --network=projects/PROJECT_ID/global/networks/NETWORK_NAME \ --direction=INGRESS \ --priority=65534 \ --action=ALLOW \ --source-ranges=0.0.0.0/0 \ --rules=tcp:22
為虛擬私有雲網路建立防火牆規則,允許來自特定 IP 位址範圍的輸入流量,透過通訊埠 80 傳送至網路上的任何執行個體 (因為您會在 VM 上部署接聽通訊埠 80 的網頁伺服器):
gcloud compute firewall-rules create RULE_NAME_TWO \ --network=projects/PROJECT_ID/global/networks/NETWORK_NAME \ --direction=INGRESS \ --priority=1000 \ --action=ALLOW \ --source-ranges=10.10.10.0/24 \ --rules=tcp:80
將
RULE_NAME_ONE
和RULE_NAME_TWO
替換成防火牆規則的專屬名稱。請注意,
--source-ranges
為選用項目,表示允許建立連入連線的 IP 位址區塊清單,這些連線必須符合網路執行個體的防火牆規則。在本例中,範圍與先前建立的子網路所用範圍相符。建議您使用這個標記,將防火牆規則套用至 Eventarc 流量。如未指定
--source-ranges
和--source-tags
,--source-ranges
預設為0.0.0.0/0
,表示規則會套用至網路內外所有傳入的 IPv4 連線。
詳情請參閱使用虛擬私有雲防火牆規則。
建立網路連結
網路連結是一種資源,可讓供應商虛擬私有雲網路透過 Private Service Connect 介面,啟動與用戶端虛擬私有雲網路的連線。
發布事件時,Eventarc 會使用網路連結,與虛擬私有雲網路中託管的內部 HTTP 端點建立連線。
您可以建立網路連結,自動接受參照該網路連結的任何 Private Service Connect 介面連線。在包含 HTTP 目的地服務的相同網路和區域中,建立網路連結。
gcloud compute network-attachments create ATTACHMENT_NAME \ --region=$REGION \ --subnets=SUBNET_NAME \ --connection-preference=ACCEPT_AUTOMATIC
將 ATTACHMENT_NAME
替換為網路附件的名稱。
詳情請參閱「關於網路連結」。
在指定子網路中建立 VM 執行個體
Compute Engine VM 執行個體是指託管在 Google 基礎架構上的虛擬機器。「Compute Engine 執行個體」、「VM 執行個體」和「VM」這幾個詞是同義詞,可以互換使用。VM 執行個體包括 Google Kubernetes Engine (GKE) 叢集、App Engine 彈性環境執行個體,以及其他 Google Cloud 以 Compute Engine VM 為基礎建構的產品。
在虛擬私有雲網路中建立 Compute Engine VM 執行個體,以便部署事件接收器服務。
gcloud compute instances create INSTANCE_NAME \ --zone=$ZONE \ --machine-type=e2-medium \ --subnet=SUBNET_NAME
將 INSTANCE_NAME
替換為 VM 的名稱。
詳情請參閱「建立及啟動 VM 執行個體」。
在 VM 上部署事件接收器
在 VM 上部署網路伺服器,監聽通訊埠 80,並接收及記錄事件。
使用 Google Cloud 控制台中的「SSH」按鈕,建立與 VM 執行個體的 SSH 連線。
建立與 SSH 伺服器的連線後,請使用瀏覽器中的 SSH 終端機,在 VM 執行個體上執行指令。
在瀏覽器內 SSH 終端機中,建立名為
server.py
的文字檔,其中包含下列 Python 程式碼:啟動伺服器,並在完成本教學課程的其餘步驟時保持伺服器運作:
sudo python3 server.py
建立 Eventarc 觸發條件
建立 Eventarc 觸發程序,在訊息發布至 Pub/Sub 主題時,建立新的 Pub/Sub 主題,並將事件傳送至部署在 VM 上的事件接收器。
啟用 Compute Engine API 後,預設服務帳戶會是 Compute Engine 預設服務帳戶 (PROJECT_NUMBER-compute@developer.gserviceaccount.com
)。為進行測試,觸發程序會使用這個預設服務帳戶做為身分。
gcloud eventarc triggers create TRIGGER_NAME \ --location=$REGION \ --destination-http-endpoint-uri=http://INSTANCE_NAME.$ZONE.c.PROJECT_ID.internal \ --network-attachment="projects/PROJECT_ID/regions/$REGION/networkAttachments/ATTACHMENT_NAME" \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
將 PROJECT_NUMBER
替換為專案編號。 Google Cloud您可以在 Google Cloud 控制台的「歡迎」頁面找到專案編號,也可以執行下列指令:
gcloud projects describe PROJECT_ID --format='value(projectNumber)'
如要進一步瞭解如何設定觸發條件,請參閱將事件路由至虛擬私有雲網路中的內部 HTTP 端點。
產生及查看 Pub/Sub 主題事件
您可以將訊息發布至 Pub/Sub 主題,藉此產生事件。
找出並將 Pub/Sub 主題設為環境變數:
export MY_TOPIC=$(gcloud eventarc triggers describe TRIGGER_NAME \ --location=$REGION \ --format='value(transport.pubsub.topic)')
將訊息發布至 Pub/Sub 主題,產生事件:
gcloud pubsub topics publish $MY_TOPIC --message "Hello World"
Eventarc 觸發條件會將事件轉送至 VPC 網路中的內部 HTTP 端點。在瀏覽器中的 SSH 終端機中,系統會輸出事件主體。畫面應如下所示:
Body: { "message": { "data": "SGVsbG8gV29ybGQ=", "messageId": "8795720366614192", "publishTime": "2023-08-26T13:09:48Z" } } 10.10.10.3 - - [26/Aug/2023 13:09:49] "POST / HTTP/1.1" 200 -
請注意,如果從 Base64 格式解碼
SGVsbG8gV29ybGQ=
的data
值,系統會傳回「Hello World」。
您已成功將事件接收者服務部署至虛擬私有雲網路中的內部 HTTP 端點、建立 Eventarc 觸發條件、從 Pub/Sub 產生事件,並確認觸發條件已將事件如預期地傳送至目標端點。
清除所用資源
如要避免系統向您的 Google Cloud 帳戶收取本教學課程中所用資源的相關費用,請刪除含有該項資源的專案,或者保留專案但刪除個別資源。
刪除專案
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
刪除個別資源
- 刪除 Eventarc 觸發條件:
gcloud eventarc triggers delete TRIGGER_NAME --location=$REGION
-
刪除執行個體:
gcloud compute instances delete INSTANCE_NAME
- 刪除網路連結:
gcloud compute network-attachments delete ATTACHMENT_NAME --region=$REGION
- 刪除防火牆規則:
gcloud compute firewall-rules delete RULE_NAME_ONE gcloud compute firewall-rules delete RULE_NAME_TWO
- 刪除子網路:
gcloud compute networks subnets delete SUBNET_NAME --region=$REGION
- 刪除虛擬私有雲網路:
gcloud compute networks delete NETWORK_NAME