本文說明如何設定現有虛擬機器 (VM),改用其他服務帳戶。服務帳戶是一種特殊的帳戶,通常由應用程式或運算工作負載使用,可發出授權 API 呼叫。
如果工作負載 (例如自訂應用程式) 需要存取 Google Cloud 資源或執行動作,但不需要使用者參與,就必須使用服務帳戶。如要進一步瞭解何時應使用服務帳戶,請參閱使用服務帳戶的最佳做法。
如果應用程式需要呼叫 Google Cloud API,建議您將使用者管理的服務帳戶附加至執行應用程式或工作負載的 VM。接著,您會授予服務帳戶 IAM 角色,讓服務帳戶 (以及 VM 上執行的應用程式) 存取Google Cloud 資源。
事前準備
-
如果尚未設定驗證,請先完成設定。
「驗證」是指驗證身分的程序,確認您有權存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,請選取下列其中一個選項,向 Compute Engine 進行驗證:
Select the tab for how you plan to use the samples on this page:
Console
When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.
gcloud
-
After installing the Google Cloud CLI, initialize it by running the following command:
gcloud init
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
- Set a default region and zone.
-
compute.instances.setServiceAccount
-
compute.instances.stop
-
compute.instances.start
- 建立新的使用者管理服務帳戶,而非使用 Compute Engine 預設服務帳戶,並只針對該服務帳戶需要的資源和作業,授予相關的身分與存取權管理角色。
- 將服務帳戶附加至 VM。
- 在 VM 上設定 Cloud Platform (
https://www.googleapis.com/auth/cloud-platform
) 範圍。這樣一來,VM 的服務帳戶就能呼叫有權使用的 Google Cloud API。- 如果使用 Google Cloud 控制台指定服務帳戶,請將服務帳戶的存取權範圍設為「允許所有 Cloud API 的完整存取權」。
- 如果您使用 Google Cloud CLI 或 Compute Engine API 指定服務帳戶,可以使用
scopes
參數設定存取範圍。
為預設服務帳戶授予身分與存取權管理角色的動作,會使所有以預設服務帳戶身分執行的 VM 受到影響。舉例來說,如果您為預設服務帳戶授予了
roles/storage.objectAdmin
角色,那麼以預設服務帳戶 (帳戶具有必要存取權範圍) 身分執行的所有 VM,也會獲得roles/storage.objectAdmin
角色所授予的權限。同理,如果您藉由省略特定角色來限制存取權,這也會影響所有以預設服務帳戶身分執行的 VM。視機構政策設定而定,系統可能會自動將專案的編輯者角色授予預設服務帳戶。強烈建議您 強制執行
iam.automaticIamGrantsForDefaultServiceAccounts
機構政策限制,停用自動授予角色功能。如果您是在 2024 年 5 月 3 日後建立機構,系統預設會強制執行這項限制。如果停用自動角色授予功能,您必須決定要授予預設服務帳戶哪些角色,然後自行授予這些角色。
如果預設服務帳戶已具備「編輯者」角色,建議您將「編輯者」角色替換為權限較少的角色。如要安全地修改服務帳戶的角色,請使用 政策模擬器查看變更的影響,然後授予及撤銷適當的角色。
前往「VM instances」(VM 執行個體) 頁面。
按一下您要更新服務帳戶的執行個體。
按一下「停止」
。如果沒有「停止」選項,請依序點選 「更多動作」> 「停止」。 等待 VM 停止。按一下 [編輯]。
向下捲動到「Service Account」(服務帳戶) 區段。
從下拉式清單中,選取要指派給 VM 的服務帳戶。
- 如果您選擇使用者管理的服務帳戶,VM 的存取權範圍預設為建議的
cloud-platform
範圍。如果使用者管理的服務帳戶需要不同的範圍,請使用 gcloud CLI 或 Compute Engine API 附加服務帳戶。 - 如果您選擇 Compute Engine 預設服務帳戶,可以在 Google Cloud 控制台中修改其存取範圍。
- 如要變更範圍,請在「Access scopes」(存取權範圍) 區段中,選取「Set access for each API」(針對各個 API 設定存取權),然後設定符合需求的適當範圍。
- 建議做法:如果不確定該如何設定適當的存取權範圍,請選擇「允許所有 Cloud API 的完整存取權」,然後務必在服務帳戶中設定 IAM 角色,限制存取權。
- 如果您選擇使用者管理的服務帳戶,VM 的存取權範圍預設為建議的
按一下 [儲存] 以儲存變更。
按一下「啟動/繼續」,重新啟動 VM。
使用
instances stop
指令停止 VM。將您的 VM 執行個體名稱替換為VM_NAME
。gcloud compute instances stop VM_NAME
附加服務帳戶。如要附加服務帳戶,請使用
instances set-service-account
指令,並提供 VM 名稱、服務帳戶電子郵件和期望的範圍。如要進一步瞭解如何設定存取範圍,請參閱最佳做法。gcloud compute instances set-service-account VM_NAME \ --service-account=SERVICE_ACCOUNT_EMAIL \ --scopes=SCOPES
更改下列內容:
SERVICE_ACCOUNT_EMAIL
:您建立的服務帳戶電子郵件地址。例如:my-sa-123@my-project-123.iam.gserviceaccount.com
。如要查看電子郵件地址,請參閱列出服務帳戶。如要從 VM 移除服務帳戶,請使用
--no-service-account
旗標。VM_NAME
:VM 執行個體的名稱。SCOPES
:以逗號分隔的範圍 URI 或別名清單,這些內容由--scopes
標記說明所提供。如要移除 VM 的所有範圍,請改用
--no-scopes
旗標。
舉例來說,下列指令會將服務帳戶
my-sa-123@my-project-123.iam.gserviceaccount.com
指派給名為 example-instance 的 VM,並在該 VM 上設定相關存取權範圍,以允許對 Compute Engine 進行讀寫,以及對 Cloud Storage 進行唯讀:gcloud compute instances set-service-account example-instance \ --service-account=my-sa-123@my-project-123.iam.gserviceaccount.com \ --scopes=compute-rw,storage-ro
使用
instances start
指令啟動 VM。將您的 VM 執行個體名稱替換為VM_NAME
。gcloud compute instances start VM_NAME
使用
instances.stop
方法發出POST
要求,停止 VM:POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/stop
更改下列內容:
PROJECT_ID
:VM 所在的專案ZONE
:VM 所在的可用區VM_NAME
:要停止的 VM 名稱
對
setServiceAccount
方法發出POST
要求,附加服務帳戶:POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/setServiceAccount { "email": "SERVICE_ACCOUNT_EMAIL", "scopes": [ "SCOPE_URI", "SCOPE_URI", ... ] }
更改下列內容:
PROJECT_ID
:這項要求的專案 ID。ZONE
:這個 VM 所屬的區域。VM_NAME
:VM 名稱。SERVICE_ACCOUNT_EMAIL
:您建立的服務帳戶電子郵件地址。例如:my-sa-123@my-project-123.iam.gserviceaccount.com
。如要查看電子郵件地址,請參閱列出服務帳戶。SCOPE_URI
:必要範圍 URI。
例如,下列要求使用了服務帳戶電子郵件
my-sa-123@my-project-123.iam.gserviceaccount.com
並設定了 Cloud Storage 和 BigQuery 範圍:POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/setServiceAccount { "email": "my-sa-123@my-project-123.iam.gserviceaccount.com", "scopes": [ "https://www.googleapis.com/auth/bigquery", "https://www.googleapis.com/auth/devstorage.read_only" ] }
使用
instances.start
方法建構POST
要求,啟動 VM:POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/start
更改下列內容:
PROJECT_ID
:VM 所在的專案ZONE
:VM 所在的可用區VM_NAME
:要啟動的 VM 名稱
前往「VM instances」(VM 執行個體) 頁面。
按一下您要更新服務帳戶的執行個體。
前往「API and identity management」(API 與身分識別管理) 區段。這個部分會顯示 VM 使用的服務帳戶和存取權範圍。
- 限制服務帳戶的權限,並定期檢查服務帳戶權限,確保合乎時宜。
- 請謹慎刪除服務帳戶。請先確認重要的應用程式不再需要使用服務帳戶,然後再將其刪除。如果您不確定是否會使用服務帳戶,建議您停用服務帳戶,而不要刪除。停用的服務帳戶如果仍要使用,可重新啟用。
- 降低服務帳戶的安全風險。詳情請參閱「使用服務帳戶的最佳做法」。
- 詳閱「服務帳戶最佳做法」
請參閱「使用服務帳戶驗證工作負載」。
REST
如要在本機開發環境中使用本頁的 REST API 範例,請使用您提供給 gcloud CLI 的憑證。
After installing the Google Cloud CLI, initialize it by running the following command:
gcloud init
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
詳情請參閱 Google Cloud 驗證說明文件中的「Authenticate for using REST」。
必要的角色
如要取得在 VM 上設定服務帳戶所需的權限,請要求管理員為您授予 VM 或專案的「Compute Instance 管理員 (v1)」 (
roles/compute.instanceAdmin.v1
) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。這個預先定義的角色具備在 VM 上設定服務帳戶所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:
所需權限
如要在 VM 上設定服務帳戶,您必須具備下列權限:
總覽
建議您為 VM 設定服務帳戶,方法如下:
設定服務帳戶
您可以建立使用者管理的服務帳戶,也可以使用 Compute Engine 預設服務帳戶。建議使用使用者代管的服務帳戶。
確認已為所選服務帳戶指派必要的 Identity and Access Management (IAM) 角色。
使用者管理的
如果您還沒有使用者代管的服務帳戶,請建立服務帳戶。如需詳細操作說明,請參閱「設定服務帳戶」。
預設
如果您熟悉 Compute Engine 預設服務帳戶,並且想使用預設服務帳戶提供的憑證,而不想建立新的服務帳戶,那麼您可以為預設服務帳戶授予身分與存取權管理角色。
將身分與存取權管理角色指派給預設服務帳戶之前,請注意以下幾點:
如果您不確定是否要為預設服務帳戶授予身分與存取權管理角色,請改為建立新的使用者代管服務帳戶。
附加服務帳戶並更新存取權範圍
如要變更 VM 的服務帳戶與存取權範圍,您必須暫時停止 VM。
如果服務帳戶與 VM 位於不同專案,則必須為其他專案中的資源設定服務帳戶。
請使用下列其中一種方法,變更 VM 的服務帳戶和存取權範圍。
主控台
gcloud
REST
查看 VM 使用的服務帳戶
如要查看專案中的所有服務帳戶,請參閱列出服務帳戶。
如要找出 VM 使用的服務帳戶,請完成下列其中一個程序:
主控台
gcloud
執行
gcloud compute instances describe
指令:gcloud compute instances describe VM_NAME \ --format json
輸出結果會與下列內容相似:
{ ... "serviceAccounts":[ { "email":"123845678986-compute@developer.gserviceaccount.com", "scopes":[ "https://www.googleapis.com/auth/devstorage.full_control" ] } ] ... }
如果 VM 未使用服務帳戶,您會收到不含
serviceAccounts
屬性的回應。中繼資料伺服器
直接從 VM 查詢中繼資料伺服器。向
http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/
發出要求:user@myinst:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/" \ -H "Metadata-Flavor: Google"
如果您在建立執行個體時啟用了一或多個服務帳戶,這個
curl
指令會傳回類似以下的輸出:123845678986-compute@developer.gserviceaccount.com/ default/
如果執行個體沒有使用任何服務帳戶,您會收到沒有內容的回應。
最佳做法
後續步驟
除非另有註明,否則本頁面中的內容是採用創用 CC 姓名標示 4.0 授權,程式碼範例則為阿帕契 2.0 授權。詳情請參閱《Google Developers 網站政策》。Java 是 Oracle 和/或其關聯企業的註冊商標。
上次更新時間:2025-07-10 (世界標準時間)。
-