使用使用者代管的服務帳戶設定記錄接收器

本頁說明如何建立已設定使用者管理服務帳戶的接收器,藉此轉送記錄檔項目。根據預設,Logging 會為資源中的所有接收器使用 Logging 服務帳戶。不過,如果記錄接收器位於不同專案,您可以建立及管理自己的使用者管理服務帳戶,集中管理含有使用者管理服務帳戶的專案身分與存取權管理權限。

只有在接收器目的地為記錄檔儲存空間或 Google Cloud 專案時,您才能建立使用使用者管理的服務帳戶的接收器。本文中的範例說明如何設定接收器,使用目的地為記錄儲存空間的使用者管理服務帳戶。

變更記錄儲存空間時,建議您檢查記錄檔接收器設定。舉例來說,如果刪除記錄檔接收器的目的地,請一併刪除對應的記錄檔接收器。

事前準備

  1. 在 Google Cloud 控制台中啟用 Cloud Shell。

    啟用 Cloud Shell

    Google Cloud 控制台底部會開啟 Cloud Shell 工作階段,並顯示指令列提示。Cloud Shell 是已安裝 Google Cloud CLI 的殼層環境,並已設定適用於您目前專案的值。工作階段可能要幾秒鐘的時間才能初始化。

  2. 確認您有使用者管理的服務帳戶,然後為使用者管理的服務帳戶,將下列變數設為適當值:

    • CUSTOM_SA_PROJECT_ID: 包含使用者管理的服務帳戶的專案 ID。

    • CUSTOM_SA:使用者自行管理的服務帳戶電子郵件地址。

    如要瞭解如何建立服務帳戶,請參閱「建立服務帳戶」。

  3. 請確認您有可做為記錄檔接收器目的地的記錄檔 bucket,然後將下列變數設為適合記錄檔 bucket 的值。視需要建立記錄檔 bucket:

    • LOG_BUCKET_PROJECT_ID: 包含記錄儲存空間的專案 ID。

    • LOCATION:記錄 bucket 的位置。

    • BUCKET_NAME:記錄檔 bucket 的名稱。

  4. 找出您打算建立記錄檔接收器的專案中,現有的 Logging 服務帳戶名稱,然後將下列變數設為適當的值:

    • SINK_PROJECT_ID:您打算建立記錄檔接收器的專案 ID。

    • LOGGING_SA:預設記錄服務帳戶的電子郵件地址。如要取得這個位址,請執行下列指令:

      gcloud logging settings describe --project=SINK_PROJECT_ID
      

      在回應中,以 loggingServiceAccountId 開頭的行會列出服務帳戶的電子郵件地址。

  5. 在包含使用者自管服務帳戶的專案中,請確保系統不會強制執行機構政策布林限制 iam.disableCrossProjectServiceAccountUsage。這項限制預設為強制執行。如要停用這項限制,以便將服務帳戶附加至其他專案中的資源,請執行下列指令:

    gcloud resource-manager org-policies disable-enforce \
    iam.disableCrossProjectServiceAccountUsage \
    --project=CUSTOM_SA_PROJECT_ID
    

    如要進一步瞭解如何啟用跨專案的服務帳戶,請參閱「啟用跨專案附加服務帳戶」。

授予 IAM 角色

本節說明建立使用使用者管理服務帳戶的接收器時,需要滿足哪些必要條件。

允許使用者代管的服務帳戶將記錄檔項目寫入接收器目的地

授予使用者管理的服務帳戶必要權限,以便將記錄檔項目寫入您在後續步驟中建立的接收器目的地。接收器的目的地是儲存在名為「LOG_BUCKET_PROJECT_ID」專案中的記錄檔 bucket。

如要將必要權限授予使用者管理的服務帳戶,請在包含記錄 bucket 的專案中,授予該帳戶「記錄 bucket 寫入者」角色 (roles/logging.bucketWriter):

gcloud projects add-iam-policy-binding LOG_BUCKET_PROJECT_ID \
--member='serviceAccount:CUSTOM_SA' \
--role='roles/logging.bucketWriter'

如要進一步瞭解上述指令,請參閱 gcloud projects add-iam-policy-binding。

設定服務帳戶模擬

設定預設的 Cloud Logging 服務帳戶 LOGGING_SA,使其能模擬使用者管理的服務帳戶 CUSTOM_SA。您要在 Google Cloud 專案中建立使用使用者自行管理服務帳戶的記錄接收器,而該專案中已有預設的 Cloud Logging 服務帳戶。

如要設定服務帳戶模擬,請在使用者管理的服務帳戶中,將服務帳戶權杖建立者角色 (roles/iam.serviceAccountTokenCreator) 授予 Cloud Logging 服務帳戶:

gcloud iam service-accounts add-iam-policy-binding CUSTOM_SA \
--project=CUSTOM_SA_PROJECT_ID \
--member='serviceAccount:LOGGING_SA' \
--role='roles/iam.serviceAccountTokenCreator'

服務帳戶模擬功能涉及兩個主體:缺少資源存取權的服務帳戶,以及具備資源存取權的服務帳戶。在本例中,使用者管理的服務帳戶是具備權限的帳戶,因為該帳戶有權將記錄檔項目寫入接收器目的地,也就是名為 LOG_BUCKET_PROJECT_ID 的專案中的記錄檔 bucket。Logging 服務帳戶具備轉送記錄項目的權限。

如要進一步瞭解服務帳戶權杖建立者角色,請參閱「服務帳戶權杖建立者角色」。

如要進一步瞭解服務帳戶模擬功能,請參閱「關於服務帳戶模擬功能」。

允許主體以使用者管理的服務帳戶執行作業

授予將建立接收器的主體必要權限,讓他們能以使用者管理的服務帳戶執行作業。

如要授予必要權限,請在 Google Cloud 儲存使用者管理服務帳戶的專案CUSTOM_SA_PROJECT_ID中,將「服務帳戶使用者」角色 (roles/iam.serviceAccountUser) 授予主體。

執行下列指令前,請先進行下列替換作業:

  • PRINCIPAL:要授予角色的主體 ID。主體 ID 通常採用以下格式: PRINCIPAL-TYPE:ID。 例如:user:my-user@example.com。如要查看 PRINCIPAL 的完整格式清單,請參閱「主體 ID」。

執行 gcloud iam service-accounts add-iam-policy-binding 指令:

gcloud iam service-accounts add-iam-policy-binding CUSTOM_SA \
--project=CUSTOM_SA_PROJECT_ID \
--member='PRINCIPAL' \
--role='roles/iam.serviceAccountUser'

如果您使用自訂角色,主體需要 iam.serviceAccounts.actAs 權限。

如要進一步瞭解服務帳戶使用者角色,請參閱「服務帳戶使用者角色」。

建立使用由使用者管理的服務帳戶的記錄接收器

如要使用使用者管理的服務帳戶建立接收器,請執行 gcloud logging sinks create 指令並加入 --custom-writer-identity 選項。

執行下列指令前,請先進行下列替換作業:

  • SINK_NAME:記錄檔接收器的名稱。

執行 gcloud logging sinks create 指令:

gcloud logging sinks create SINK_NAME \
logging.googleapis.com/projects/LOG_BUCKET_PROJECT_ID/locations/LOCATION/buckets/BUCKET_NAME \
--custom-writer-identity=serviceAccount:CUSTOM_SA \
--project=SINK_PROJECT_ID

確認接收器是否正在傳送記錄項目

在本節中,您將使用 gcloud CLI 寫入及讀取記錄項目,確認接收器是否正確路由傳送記錄項目。

如要確認接收器是否正確地將記錄項目傳送至目的地,請按照下列步驟操作:

  1. 執行 gcloud logging write 指令:

    執行下列指令前,請先進行下列替換作業:

    • LOG_NAME:記錄名稱,舉例來說,您可以將這個欄位設為 mylog。

    執行 gcloud logging write 指令:

    gcloud logging write LOG_NAME "Test log entry" --project=SINK_PROJECT_ID
    

    上述指令會傳回下列訊息:Created log entry.

  2. 如要讀取您剛才寫入的記錄項目,請執行下列指令:

    gcloud logging read 'textPayload="Test log entry"' \
    --bucket=BUCKET_NAME --location=LOCATION \
    --view=_AllLogs --project=SINK_PROJECT_ID
    

後續步驟