本教學課程說明如何排解使用 Eventarc 將 Cloud Storage 事件透過 Cloud 稽核記錄轉送至未經驗證的 Cloud Run 服務時,所發生的執行階段錯誤。
建立 Artifact Registry 標準存放區
建立 Artifact Registry 標準存放區,用於儲存容器映像檔:
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=$REGION
將 REPOSITORY
替換成存放區的專屬名稱。
建立 Cloud Storage 值區
在兩個區域中各建立一個 Cloud Storage bucket,做為 Cloud Run 服務的事件來源:
在
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
建立事件來源後,請在 Cloud Run 上部署事件接收器服務。
部署事件接收器
部署可接收及記錄事件的 Cloud Run 服務。
複製 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
部署成功後,指令列會顯示服務網址。
建立觸發條件
部署 Cloud Run 服務後,請設定觸發條件,透過稽核記錄監聽 Cloud Storage 的事件。
建立 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
產生及查看活動
確認您已成功部署服務,且可以接收 Cloud Storage 傳送的事件。
建立檔案並上傳至
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: ..."
請注意,一開始不會傳回任何記錄項目。這表示設定有問題,您必須進行調查。
調查問題
請逐步調查服務未收到事件的原因。
初始化時間
雖然觸發條件會立即建立,但最多可能需要兩分鐘才能傳播並篩選事件。執行下列指令,確認觸發條件是否處於啟用狀態:
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 已啟用稽核記錄。
前往 Google Cloud 控制台的「稽核記錄」頁面。
- 選取「Google 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 觸發條件:
確認現有觸發條件的位置:
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
觸發條件最多可能需要兩分鐘才能完成初始化,然後開始轉送事件。
如要確認觸發條件已正確部署,請產生並查看事件。
你可能會遇到的其他問題
使用 Eventarc 時,您可能會遇到其他問題。
事件大小
傳送的事件不得超過事件大小限制。
先前傳送事件的觸發條件已停止運作
確認來源是否正在產生事件。檢查 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 程式碼無法正常運作,請與支援團隊聯絡。
詳情請參閱建立指標閾值快訊政策。