本教學課程說明如何排解使用 Eventarc 將 Cloud Storage 事件透過 Cloud 稽核記錄轉送至未經驗證的 Cloud Run 服務時,所發生的執行階段錯誤。
目標
本教學課程將說明如何完成下列工作:
- 建立 Artifact Registry 標準存放區,用於儲存容器映像檔。
- 建立 Cloud Storage bucket 做為事件來源。
- 建構、上傳容器映像檔,並部署至 Cloud Run。
- 建立 Eventarc 觸發條件。
- 將檔案上傳至 Cloud Storage bucket。
- 排解並修正執行階段錯誤。
費用
在本文件中,您會使用 Google Cloud的下列計費元件:
如要根據預測用量估算費用,請使用 Pricing Calculator。
事前準備
貴機構定義的安全性限制,可能會導致您無法完成下列步驟。如需疑難排解資訊,請參閱「在受限的 Google Cloud 環境中開發應用程式」。
- 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.
-
如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
-
如要初始化 gcloud CLI,請執行下列指令:
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.
-
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Logging, Cloud Run, Cloud Storage, Eventarc, and Pub/Sub APIs:
gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com eventarc.googleapis.com logging.googleapis.com pubsub.googleapis.com run.googleapis.com storage.googleapis.com -
Install the Google Cloud CLI.
-
如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
-
如要初始化 gcloud CLI,請執行下列指令:
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.
-
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Logging, Cloud Run, Cloud Storage, Eventarc, and Pub/Sub APIs:
gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com eventarc.googleapis.com logging.googleapis.com pubsub.googleapis.com run.googleapis.com storage.googleapis.com -
如果您是專案建立者,系統會授予基本「擁有者」角色 (
roles/owner
)。根據預設,這個身分與存取權管理 (IAM) 角色包含完整存取大多數資源所需的權限,因此您可以略過這個步驟。 Google Cloud如果您不是專案建立者,必須在專案中將必要權限授予適當的主體。舉例來說,主體可以是 Google 帳戶 (適用於使用者) 或服務帳戶 (適用於應用程式和運算工作負載)。詳情請參閱活動目的地的「角色和權限」頁面。
請注意,根據預設,Cloud Build 權限包含上傳及下載 Artifact Registry 構件的權限。
所需權限
如要取得完成本教學課程所需的權限,請要求管理員為您授予專案的下列 IAM 角色:
-
Cloud Build 編輯器 (
roles/cloudbuild.builds.editor
) -
Cloud Run Admin (
roles/run.admin
) -
Eventarc 管理員 (
roles/eventarc.admin
) -
記錄檢視存取者 (
roles/logging.viewAccessor
) -
專案 IAM 管理員 (
roles/resourcemanager.projectIamAdmin
) -
服務帳戶管理員 (
roles/iam.serviceAccountAdmin
) -
服務帳戶使用者 (
roles/iam.serviceAccountUser
) -
服務使用情形管理員 (
roles/serviceusage.serviceUsageAdmin
) -
儲存空間管理員 (
roles/storage.admin
)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
-
Cloud Build 編輯器 (
- 如果是 Cloud Storage,請為
ADMIN_READ
、DATA_WRITE
和DATA_READ
資料存取類型啟用稽核記錄。- 讀取與 Google Cloud 專案、資料夾或機構相關聯的 Identity and Access Management (IAM) 政策,並儲存在暫時檔案中:
gcloud projects get-iam-policy PROJECT_ID > /tmp/policy.yaml
- 在文字編輯器中開啟
/tmp/policy.yaml
,然後在auditConfigs
區段中僅新增或變更稽核記錄設定:auditConfigs: - auditLogConfigs: - logType: ADMIN_READ - logType: DATA_WRITE - logType: DATA_READ service: storage.googleapis.com bindings: - members: [...] etag: BwW_bHKTV5U= version: 1
- 撰寫新的 IAM 政策:
gcloud projects set-iam-policy PROJECT_ID /tmp/policy.yaml
如果上述指令回報與其他變更發生衝突,請重複這些步驟,從讀取 IAM 政策開始。詳情請參閱「使用 API 設定資料存取稽核記錄」一文。
- 讀取與 Google Cloud 專案、資料夾或機構相關聯的 Identity and Access Management (IAM) 政策,並儲存在暫時檔案中:
- 將
eventarc.eventReceiver
角色指派給 Compute Engine 服務帳戶:export PROJECT_NUMBER="$(gcloud projects describe $(gcloud config get-value project) --format='value(projectNumber)')" gcloud projects add-iam-policy-binding $(gcloud config get-value project) \ --member=serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com \ --role='roles/eventarc.eventReceiver'
- 如果您是在 2021 年 4 月 8 日當天或之前啟用 Pub/Sub 服務帳戶,請將
iam.serviceAccountTokenCreator
角色授予 Pub/Sub 服務帳戶:gcloud projects add-iam-policy-binding $(gcloud config get-value project) \ --member="serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com"\ --role='roles/iam.serviceAccountTokenCreator'
- 設定本教學課程中使用的預設值:
export REGION=us-central1 gcloud config set run/region ${REGION} gcloud config set run/platform managed gcloud config set eventarc/location ${REGION}
在
us-east1
中建立 bucket:export BUCKET1="troubleshoot-bucket1-PROJECT_ID" gcloud storage buckets create gs://${BUCKET1} --location=us-east1
在
us-west1
中建立 bucket:export BUCKET2="troubleshoot-bucket2-PROJECT_ID" gcloud storage buckets create gs://${BUCKET2} --location=us-west1
複製 GitHub 存放區來擷取程式碼範例:
Go
git clone https://github.com/GoogleCloudPlatform/golang-samples.git cd golang-samples/eventarc/audit_storage
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git cd java-docs-samples/eventarc/audit-storage
.NET
git clone https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git cd dotnet-docs-samples/eventarc/audit-storage
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git cd nodejs-docs-samples/eventarc/audit-storage
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git cd python-docs-samples/eventarc/audit-storage
請檢查本教學課程的程式碼,其中包含下列項目:
事件處理常式,會在 HTTP
POST
要求中,以 CloudEvent 形式接收傳入的事件:Go
Java
.NET
Node.js
Python
使用事件處理常式的伺服器:
Go
Java
.NET
Node.js
Python
定義服務作業環境的 Dockerfile。Dockerfile 的內容依程式語言而有所不同:
Go
Java
.NET
Node.js
Python
使用 Cloud Build 建構容器映像檔,並將映像檔上傳至 Artifact Registry:
export PROJECT_ID=$(gcloud config get-value project) export SERVICE_NAME=troubleshoot-service gcloud builds submit --tag $REGION-docker.pkg.dev/${PROJECT_ID}/REPOSITORY/${SERVICE_NAME}:v1
將容器映像檔部署至 Cloud Run:
gcloud run deploy ${SERVICE_NAME} \ --image $REGION-docker.pkg.dev/${PROJECT_ID}/REPOSITORY/${SERVICE_NAME}:v1 \ --allow-unauthenticated
部署成功後,指令列會顯示服務網址。
建立 Eventarc 觸發條件,監聽透過 Cloud 稽核記錄轉送的 Cloud Storage 事件:
gcloud eventarc triggers create troubleshoot-trigger \ --destination-run-service=troubleshoot-service \ --event-filters="type=google.cloud.audit.log.v1.written" \ --event-filters="serviceName=storage.googleapis.com" \ --event-filters="methodName=storage.objects.create" \ --service-account=${PROJECT_NUMBER}-compute@developer.gserviceaccount.com
這項操作會建立名為
troubleshoot-trigger
的觸發條件。如要確認
troubleshoot-trigger
是否已建立,請執行:gcloud eventarc triggers list
畫面會顯示如下的輸出內容:
NAME: troubleshoot-trigger TYPE: google.cloud.audit.log.v1.written DESTINATION: Cloud Run service: troubleshoot-service ACTIVE: By 20:03:37 LOCATION: us-central1
建立檔案並上傳至
BUCKET1
storage bucket:echo "Hello World" > random.txt gcloud storage cp random.txt gs://${BUCKET1}/random.txt
監控記錄,確認服務是否收到事件。如要查看記錄項目,請完成下列步驟:
篩選記錄檔項目,並以 JSON 格式傳回輸出內容:
gcloud logging read "resource.labels.service_name=troubleshoot-service \ AND textPayload:random.txt" \ --format=json
尋找類似下列內容的記錄項目:
"textPayload": "Detected change in Cloud Storage bucket: ..."
前往 Google Cloud 控制台的「稽核記錄」頁面。
- 選取「Google Cloud Storage」核取方塊。
- 確認已選取「管理員讀取」、「資料讀取」和「資料寫入」記錄類型。
確認現有觸發條件的位置:
gcloud eventarc triggers describe troubleshoot-trigger
將位置和區域設為
us-east1
:gcloud config set eventarc/location us-east1 gcloud config set run/region us-east1
建構容器映像檔並部署至 Cloud Run,再次部署事件接收器。
在「
us-east1
」中建立新的觸發條件:gcloud eventarc triggers create troubleshoot-trigger-new \ --destination-run-service=troubleshoot-service \ --event-filters="type=google.cloud.audit.log.v1.written" \ --event-filters="serviceName=storage.googleapis.com" \ --event-filters="methodName=storage.objects.create" \ --service-account=${PROJECT_NUMBER}-compute@developer.gserviceaccount.com
確認觸發條件已建立:
gcloud eventarc triggers list
觸發條件最多可能需要兩分鐘才能完成初始化,然後開始轉送事件。
如要確認觸發條件已正確部署,請產生並查看事件。
確認來源是否正在產生事件。檢查 Cloud 稽核記錄,確認受監控的服務是否發出記錄。如果系統記錄了記錄檔,但未傳送事件,請與支援團隊聯絡。
確認是否有相同觸發條件名稱的 Pub/Sub 主題。Eventarc 會使用 Pub/Sub 做為傳輸層,並使用現有的 Pub/Sub 主題,或自動建立及管理主題。
- 如要列出觸發條件,請參閱
gcloud eventarc triggers list
。 如要列出 Pub/Sub 主題,請執行下列指令:
gcloud pubsub topics list
確認 Pub/Sub 主題名稱包含所建立的觸發條件名稱。例如:
name: projects/PROJECT_ID/topics/eventarc-us-east1-troubleshoot-trigger-new-123
如果 Pub/Sub 主題遺失,請針對特定供應商、事件類型和 Cloud Run 目的地重新建立觸發程序。
- 如要列出觸發條件,請參閱
確認服務已設定觸發條件。
前往 Google Cloud 控制台的「Services」頁面。
按一下服務名稱,開啟「Service details」(服務詳細資料) 頁面。
按一下「觸發條件」分頁標籤。
與服務相關聯的 Eventarc 觸發條件應會列出。
使用 Pub/Sub 指標類型,驗證 Pub/Sub 主題和訂閱項目的健康狀態。
您可以使用
subscription/dead_letter_message_count
指標監控轉寄的無法傳送郵件。這項指標會顯示 Pub/Sub 從訂閱項目轉送的無法遞送訊息數量。如果訊息未發布至主題,請檢查 Cloud 稽核記錄,並確認受監控的服務是否發出記錄。如果系統已記錄記錄檔,但未傳送事件,請與支援團隊聯絡。
您可以使用
subscription/push_request_count
指標,並依response_code
和subcription_id
分組指標,監控推送訂閱項目。如果系統回報推送錯誤,請檢查 Cloud Run 服務記錄。如果接收端點傳回非「OK」的狀態碼,表示 Cloud Run 程式碼無法正常運作,請與支援團隊聯絡。
詳情請參閱建立指標閾值快訊政策。
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
刪除您在本教學課程中部署的 Cloud Run 服務:
gcloud run services delete SERVICE_NAME
其中
SERVICE_NAME
是您選擇的服務名稱。您也可以從Google Cloud 控制台刪除 Cloud Run 服務。
移除您在教學課程設定期間新增的任何 gcloud CLI 預設設定。
例如:
gcloud config unset run/region
或
gcloud config unset project
刪除在本教學課程中建立的其他 Google Cloud 資源:
- 刪除 Eventarc 觸發條件:
將gcloud eventarc triggers delete TRIGGER_NAME
TRIGGER_NAME
替換為觸發條件的名稱。
- 刪除 Eventarc 觸發條件:
建立 Artifact Registry 標準存放區
建立 Artifact Registry 標準存放區,用於儲存容器映像檔:
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=$REGION
將 REPOSITORY
替換成存放區的專屬名稱。
建立 Cloud Storage 值區
在兩個區域中各建立一個 Cloud Storage bucket,做為 Cloud Run 服務的事件來源:
建立事件來源後,請在 Cloud Run 上部署事件接收器服務。
部署事件接收器
部署可接收及記錄事件的 Cloud Run 服務。
建立觸發條件
部署 Cloud Run 服務後,請設定觸發條件,透過稽核記錄監聽 Cloud Storage 的事件。
產生及查看活動
確認您已成功部署服務,且可以接收 Cloud Storage 傳送的事件。
請注意,一開始不會傳回任何記錄項目。這表示設定有問題,您必須進行調查。
調查問題
請逐步調查服務未收到事件的原因。
初始化時間
雖然觸發條件會立即建立,但最多可能需要兩分鐘才能傳播並篩選事件。執行下列指令,確認觸發條件是否處於啟用狀態:
gcloud eventarc triggers list
輸出內容會顯示觸發條件的狀態。在以下範例中,troubleshoot-trigger
會在 14:16:56 啟用:
NAME TYPE DESTINATION_RUN_SERVICE ACTIVE
troubleshoot-trigger google.cloud.audit.log.v1.written troubleshoot-service By 14:16:56
觸發條件啟用後,請再次將檔案上傳至儲存空間 bucket。事件會寫入 Cloud Run 服務記錄。如果服務未收到事件,可能與事件大小有關。
稽核記錄
在本教學課程中,Cloud Storage 事件會透過 Cloud 稽核記錄進行路由,並傳送至 Cloud Run。確認 Cloud Storage 已啟用稽核記錄。
啟用 Cloud 稽核記錄後,請再次將檔案上傳至儲存空間 bucket,並檢查記錄。如果服務仍未收到事件,這可能與觸發條件位置有關。
觸發地點
不同位置可能有多個資源,您必須篩選來自與 Cloud Run 目標位於相同區域的來源事件。詳情請參閱「Eventarc 支援的位置」和「瞭解 Eventarc 位置」。
在本教學課程中,您已將 Cloud Run 服務部署至 us-central1
。由於您將 eventarc/location
設為 us-central1
,因此您也在相同位置建立了觸發條件。
不過,您在 us-east1
和 us-west1
位置建立了兩個 Cloud Storage bucket。如要接收這些位置的事件,您必須在這些位置建立 Eventarc 觸發條件。
在 us-east1
中建立 Eventarc 觸發條件:
你可能會遇到的其他問題
使用 Eventarc 時,您可能會遇到其他問題。
事件大小
傳送的事件不得超過事件大小限制。
先前傳送事件的觸發條件已停止運作
清除所用資源
如果您是為了這個教學課程建立新專案,請刪除專案。如果您使用現有專案,並想保留專案,但不要本教學課程新增的變更,請刪除為本教學課程建立的資源。
刪除專案
如要避免付費,最簡單的方法就是刪除您為了本教學課程所建立的專案。
如要刪除專案: