本文說明如何建立虛擬機器 (VM) 執行個體,並設定使用使用者代管服務帳戶。服務帳戶是一種特殊帳戶,通常由應用程式或運算工作負載使用,可發出授權 API 呼叫。
如果工作負載 (例如自訂應用程式) 需要存取 Google Cloud 資源或執行動作,但不需要使用者參與,就必須使用服務帳戶。如要進一步瞭解何時應使用服務帳戶,請參閱「使用服務帳戶的最佳做法」。
如果應用程式需要呼叫 Google Cloud API,Google 建議您將使用者管理的服務帳戶附加至執行應用程式或工作負載的 VM。接著,您會授予服務帳戶 IAM 角色,讓服務帳戶 (以及 VM 上執行的應用程式) 能夠存取Google Cloud 資源。
事前準備
-
如果尚未設定驗證,請先完成設定。
驗證可確認您的身分,以便存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,請選取下列其中一個選項,向 Compute Engine 進行驗證:
選取這個頁面上的分頁,瞭解如何使用範例:
控制台
使用 Google Cloud 控制台存取 Google Cloud 服務和 API 時,無須設定驗證。
gcloud
-
安裝 Google Cloud CLI。 完成後,執行下列指令來初始化 Google Cloud CLI:
gcloud init若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI。
-
- 設定預設地區和區域。
-
安裝 Google Cloud CLI。
-
若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI。
-
如果您使用本機殼層,請為使用者帳戶建立本機驗證憑證:
gcloud auth application-default login
如果您使用 Cloud Shell,則不需要執行這項操作。
如果系統傳回驗證錯誤,且您使用外部識別資訊提供者 (IdP),請確認您已 使用聯合身分登入 gcloud CLI。
Terraform
如要在本頁的本機開發環境中使用 Terraform 範例,請安裝並初始化 gcloud CLI,然後使用您的使用者憑證設定應用程式預設憑證。
詳情請參閱 這篇文章,瞭解如何設定本機開發環境的驗證機制。
REST
如要在本機開發環境中使用本頁的 REST API 範例,請使用您提供給 gcloud CLI 的憑證。
安裝 Google Cloud CLI。
若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI。
詳情請參閱 Google Cloud 驗證說明文件中的「使用 REST 進行驗證」。
必要的角色
如要取得建立使用服務帳戶的 VM 所需的權限,請要求管理員在專案中授予您下列 IAM 角色:
-
Compute 執行個體管理員 (v1) (
roles/compute.instanceAdmin.v1) -
建立服務帳戶 (
roles/iam.serviceAccountCreator) - 專案 IAM 管理員 (
roles/resourcemanager.projectIamAdmin)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
這些預先定義的角色具備建立使用服務帳戶的 VM 所需的權限。如要查看確切的必要權限,請展開「Required permissions」(必要權限) 部分:
所需權限
如要建立使用服務帳戶的 VM,您必須具備下列權限:
-
如要建立服務帳戶,您必須具備
iam.serviceAccountCreator角色中的所有權限。 -
如要將權限授予服務帳戶,請授予
resourcemanager.projectIamAdmin角色中的所有權限。 -
如要建立 VM,請按照下列步驟操作:
- 專案的
compute.instances.create權限 - 如要使用自訂映像檔建立 VM,請按一下映像檔上的
compute.images.useReadOnly。 - 如要使用快照建立 VM,請按一下快照上的
compute.snapshots.useReadOnly - 如要使用執行個體範本建立 VM,請按一下執行個體範本上的
compute.instanceTemplates.useReadOnly - 如要將舊版網路指派給 VM:專案的
compute.networks.use權限 - 如要為 VM 指定靜態 IP 位址:專案的
compute.addresses.use權限 - 使用舊版網路時,如要將外部 IP 位址指派給 VM,請在專案中啟用
compute.networks.useExternalIp - 為 VM 指定子網路:專案或所選子網路的
compute.subnetworks.use - 使用虛擬私有雲網路時,如要將外部 IP 位址指派給 VM,請在專案或所選子網路上擁有
compute.subnetworks.useExternalIp權限 - 如要為專案中的 VM 設定 VM 執行個體中繼資料,請執行下列指令:
compute.instances.setMetadata - 如要為 VM 設定標記,請在 VM 上執行
compute.instances.setTags - 如要為 VM 設定標籤,請在 VM 上執行下列步驟:
compute.instances.setLabels - 如要設定 VM 使用的服務帳戶,請在 VM 上執行
compute.instances.setServiceAccount - 如要為 VM 建立新磁碟,請取得專案的
compute.disks.create權限 - 如要以唯讀或讀寫模式連接現有磁碟,請對磁碟擁有
compute.disks.use權限 - 如要以唯讀模式連接現有磁碟,請對磁碟擁有
compute.disks.useReadOnly權限
- 專案的
總覽
建議您為 VM 設定服務帳戶,方法如下:
- 建立新的使用者管理服務帳戶,而非使用 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參數設定存取範圍。
設定服務帳戶
建立服務帳戶並指派必要的 IAM 角色。 視需要指派任意數量的 IAM 角色。您可以視需要修改服務帳戶的 IAM 角色。
Google 建議您限制服務帳戶的權限,並定期檢查服務帳戶權限,確保合乎時宜。
請使用下列其中一種方法設定服務帳戶。
控制台
-
確認您具備「建立服務帳戶」身分與存取權管理角色
(
-
前往 Google Cloud 控制台的「Create service account」(建立服務帳戶) 頁面。
前往「建立服務帳戶」 - 選取專案。
-
在「Service account name」(服務帳戶名稱) 欄位中輸入名稱。 Google Cloud 控制台會將這個名稱填入「Service account ID」(服務帳戶 ID) 欄位。
在「Service account description」(服務帳戶說明) 欄位中輸入說明。例如:
Service account for quickstart。 - 按一下「建立並繼續」。
-
將必要角色授予服務帳戶。
如要授予角色,請找出「Select a role」(選取角色) 清單,然後選取角色。
如要授予其他角色,請按一下「Add another role」(新增其他角色),然後新增其他角色。
- 按一下 [繼續]。
-
在「Service account users role」(服務帳戶使用者角色) 欄位中,輸入要將服務帳戶附加至其他資源 (例如 Compute Engine 執行個體) 的主體 ID。
這通常是指 Google 帳戶的電子郵件地址。
-
按一下「Done」(完成),即完成建立服務帳戶。
roles/iam.serviceAccountCreator) 和「專案身分與存取權管理員」角色
(roles/resourcemanager.projectIamAdmin)。瞭解如何授予
角色。
gcloud
-
確認您具備「建立服務帳戶」身分與存取權管理角色 (
roles/iam.serviceAccountCreator) 和「專案 IAM 管理員」角色 (roles/resourcemanager.projectIamAdmin)。瞭解如何授予角色。 -
建立服務帳戶:
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
將
SERVICE_ACCOUNT_NAME換成服務帳戶的名稱。 -
如要授予服務帳戶專案和資源的存取權,請將角色授予該帳戶:
gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" --role=ROLE
請替換下列項目:
SERVICE_ACCOUNT_NAME:服務帳戶名稱PROJECT_ID:您建立服務帳戶的專案 IDROLE:要授予的角色
- 如要將其他角色授予服務帳戶,請執行上一個步驟中的指令。
-
將必要角色指派給要將服務帳戶附加至其他資源的主體。
gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com --member="user:USER_EMAIL" --role=roles/iam.serviceAccountUser
更改下列內容:
SERVICE_ACCOUNT_NAME:服務帳戶名稱PROJECT_ID:您建立服務帳戶的專案 IDUSER_EMAIL:Google 帳戶的電子郵件地址
設定驗證方法:
Terraform
如要建立服務帳戶,請使用 google_service_account 資源。
請記得替換 account_id 和 display_name 屬性的預留位置值。
如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。
建立 VM 並附加服務帳戶
建立服務帳戶後,請建立 VM,並附加您在上一節建立的服務帳戶。同時將 VM 的存取權範圍設為 cloud-platform。
如果您已有 VM,並想設定該 VM 使用其他服務帳戶,請參閱「變更附加的服務帳戶」。
請使用下列其中一種方法建立 VM 並附加服務帳戶。
控制台
前往 Google Cloud 控制台的「Create an instance」(建立執行個體) 頁面。
如要附加服務帳戶,請按照下列步驟操作:
- 按一下導覽選單中的「Security」(安全性)。
- 在「Service account」(服務帳戶) 清單中,選取您建立的服務帳戶。
- 在「存取權範圍」部分,選取「允許所有 Cloud API 的完整存取權」。
選用:指定其他設定選項。詳情請參閱「建立執行個體時的設定選項」。
如要建立並啟動執行個體,請按一下「建立」。
gcloud
如要建立新的 VM 執行個體,並使用 Google Cloud CLI 設定該執行個體以使用自訂服務帳戶,請使用 gcloud compute instances create 指令,並提供服務帳戶電子郵件和 VM 執行個體的 cloud-platform 存取權範圍。
gcloud compute instances create VM_NAME \
--service-account=SERVICE_ACCOUNT_EMAIL \
--scopes=https://www.googleapis.com/auth/cloud-platform
更改下列內容:
SERVICE_ACCOUNT_EMAIL:您建立的服務帳戶電子郵件地址。例如:my-sa-123@my-project-123.iam.gserviceaccount.com。如要查看電子郵件地址,請參閱列出服務帳戶。VM_NAME:VM 執行個體的名稱。
例如:
gcloud compute instances create example-vm \
--service-account 123-my-sa@my-project-123.iam.gserviceaccount.com \
--scopes=https://www.googleapis.com/auth/cloud-platform
您也可以使用別名指定範圍:--scopes=cloud-platform。
這些別名只能由 gcloud CLI 識別。API 和其他程式庫無法辨識這些別名,因此必須指定完整的範圍 URI。
Terraform
如要設定新的 VM 來使用服務帳戶,可以使用 google_compute_instance 資源。
REST
使用 instances.insert 方法建立 VM,並指定 VM 執行個體的服務帳戶電子郵件地址和存取權範圍。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances { "machineType":"zones/MACHINE_TYPE_ZONE/machineTypes/MACHINE_TYPE", "name":"VM_NAME", "disks":[ { "initializeParams":{ "sourceImage":"projects/IMAGE_PROJECT/global/images/IMAGE" }, "boot":true } ], "networkInterfaces":[ { "network":"global/networks/NETWORK_NAME" } ], "serviceAccounts": [ { "email": "SERVICE_ACCOUNT_EMAIL", "scopes": ["https://www.googleapis.com/auth/cloud-platform"] } ], "shieldedInstanceConfig":{ "enableSecureBoot":"ENABLE_SECURE_BOOT" } }
更改下列內容:
PROJECT_ID:要在其中建立 VM 的專案 IDZONE:要在其中建立 VM 的可用區MACHINE_TYPE_ZONE:包含要用於新 VM 的機型可用區MACHINE_TYPE:新 VM 的機器類型,預先定義或自訂VM_NAME:新 VM 的名稱IMAGE_PROJECT:包含映像檔的專案
舉例來說,如果您指定debian-10做為映像檔系列,請指定debian-cloud做為映像檔專案。IMAGE:指定下列其中一項:IMAGE:公開映像檔的特定版本例如:
"sourceImage": "projects/debian-cloud/global/images/debian-10-buster-v20200309"IMAGE_FAMILY: 映像檔系列系統會使用未淘汰的最新作業系統映像檔建立 VM。舉例來說,如果您指定
"sourceImage": "projects/debian-cloud/global/images/family/debian-10",Compute Engine 會從Debian 10映像檔系列中最新版本的 OS 映像檔建立 VM。
NETWORK_NAME:您要用於 VM 的虛擬私有雲網路。如要使用預設網路,請指定default。SERVICE_ACCOUNT_EMAIL:您建立的服務帳戶電子郵件地址。例如:my-sa-123@my-project-123.iam.gserviceaccount.com。 如要查看電子郵件地址,請參閱「取得服務帳戶電子郵件地址」。ENABLE_SECURE_BOOT:選用:如果您選擇支援受防護 VM 功能的映像檔,Compute Engine 預設會啟用虛擬信任平台模組 (vTPM) 和完整性監控。Compute Engine 預設不會啟用安全啟動。如果為
enableSecureBoot指定true,Compute Engine 會建立 VM,並啟用所有三項 Shielded VM 功能。Compute Engine 啟動 VM 後,如要修改受防護的 VM 選項,必須先停止 VM。
存取及使用其他 Google Cloud 服務
將 VM 設定為使用服務帳戶後,應用程式就能使用該服務帳戶進行驗證。最常見的方法是使用應用程式預設憑證和用戶端程式庫進行驗證。部分 Google Cloud 工具 (例如 gcloud CLI) 可自動使用服務帳戶,從 VM 存取 Google Cloud API。詳情請參閱「使用服務帳戶驗證工作負載」。
如果刪除服務帳戶,應用程式就無法再透過該服務帳戶存取Google Cloud 資源。如果您刪除了預設的 App Engine 和 Compute Engine 服務帳戶,VM 將無法再存取專案中的資源。如果您不確定是否會使用服務帳戶,建議您在刪除之前先停用服務帳戶。停用的服務帳戶如果仍要使用,可重新啟用。
範例:從 VM 存取 Cloud Storage 資源
將 VM 設定為使用具有 storage.admin 角色的服務帳戶後,您可以使用 gcloud CLI 等工具,管理儲存在 Cloud Storage 中的檔案。如要存取 Cloud Storage 資源,請完成下列步驟:
確認附加至 VM 的服務帳戶具有
roles/storage.admin角色。如果 VM 使用自訂 OS 映像檔,請安裝 gcloud CLI。根據預設, Google Cloud提供的大多數公開 OS 映像檔都已安裝 gcloud CLI。
連線至 VM。
在 VM 中,使用 Google Cloud CLI 管理 Cloud Storage 資源。
後續步驟
- 瞭解如何使用服務帳戶驗證工作負載。
- 瞭解如何變更附加至 VM 的服務帳戶。
- 瞭解如何列出及編輯服務帳戶。
- 請參閱使用服務帳戶的最佳做法,降低安全性風險。