對於無代理程式移轉,Storage 移轉服務預設會使用服務代理程式,在來源和目的地之間移轉資料。您授予服務代理存取 Cloud Storage 值區的權限。
由於專案內的所有移轉作業都使用相同的 Storage 移轉服務代理,因此該代理必須具備所有移轉作業所用 bucket 的權限。
或者,您也可以改為將 bucket 權限指派給多個使用者管理的服務帳戶。這些使用者管理的服務帳戶會獲得特定來源和目標值區的權限,且僅限特定使用者帳戶 (建立或觸發轉移工作的帳戶) 使用。
範例情境
以下情境說明如何使用服務代理程式和使用者代管的服務帳戶,設定不同的權限選項。
展開各節即可查看詳細資料。
情境 1:僅限服務代理
在此情況下,所有權限都會授予服務代理程式。
- 服務代理已獲授權,可寫入 bucket A、B、C 和 D。
只要使用者具備建立移轉作業的正確權限,就能將資料移入或移出 A、B、C 和 D 值區。
如果 Storage 移轉服務使用者是所有 bucket 中資料的信任使用者,且能正確設定移轉工作,避免將資料移入或移出錯誤的 bucket,這個方法就非常適合。
情境 2:僅限使用者管理的服務代理
在此情境中,所有權限都會授予使用者管理的服務帳戶。
- 使用者管理的服務帳戶 1 已獲授 bucket A 和 B 的權限。
- 使用者管理的服務帳戶 #2 獲授 C 和 D 值區的權限。
此外:
- 使用者 Alpha 獲得服務帳戶 #1 的存取權。
- 使用者 Bravo 獲得服務帳戶 #2 的存取權。
- 使用者 Charlie 獲准存取服務帳戶 #1 和 #2。
在這種情況下:
- Alpha 只能在 Bucket A 和 Bucket B 之間轉移。
- Bravo 只能在 C 和 D 儲存區之間轉移。
- Charlie 只能在 A 和 B 之間,以及 C 和 D 之間轉移。
- Charlie 無法在 A 和 C、A 和 D、B 和 C 或 B 和 D 之間轉移。
情境 3:混合權限
在這個情境中,專案同時包含服務代理權限和使用者管理的服務帳戶權限。
- 服務代理會獲得 bucket A 和 B 的寫入權限。
- 使用者管理的服務帳戶 #1 獲得 bucket C 的唯讀權限,以及 bucket D 的寫入權限。
- 使用者 Alpha 獲准存取使用者管理的服務帳戶 #1。
在這種情況下:
- 只要使用者具備建立轉移作業的適當權限,即可將資料轉移至 A 和 B 儲存空間,或從這兩個儲存空間轉移資料。無法轉移至 C 或 D 值區,也無法從這兩個值區轉移。
- 使用者 Alpha 可以轉移至 Bucket A 和 B,也可以從這兩個 Bucket 轉移。
- Alpha 可以將物件從 C 值區移出,並移入 D 值區。
- Alpha 無法從 C 值區轉移至 A 或 B 值區。
導入程序總覽
實作方式如下:
- 建立使用者管理的服務帳戶,或使用現有帳戶。
- 授予權限:
- 讓使用者存取使用者管理的服務帳戶。
- 服務代理程式可從使用者管理的服務帳戶產生存取權杖。
- 讓使用者管理的服務帳戶存取您的 bucket。
- 使用者建立移轉作業,並指定使用者代管的服務帳戶。
- Storage 移轉服務會檢查使用者是否具備服務帳戶的正確權限。如果未授予正確的權限,轉移工作就會建立失敗。
- 服務代理會代表使用者管理的服務帳戶產生 OAuth 權杖。OAuth 權杖可讓 Storage 移轉服務存取轉移作業涉及的值區。
- 執行轉移工作。
- OAuth 權杖的效期很短,如果轉移工作在權杖過期時正在進行,Storage 轉移服務會產生新的權杖,並繼續轉移。
設定權限委派
按照操作說明,將服務代理人存取權委派給使用者管理的服務帳戶。
需求條件
- 如要建立新的使用者管理服務帳戶,您必須擁有專案的「建立服務帳戶」角色 (
roles/iam.serviceAccountCreator
)。 - 如要授予使用者和服務代理程式使用者管理的服務帳戶存取權,您必須擁有使用者管理的服務帳戶或專案的「服務帳戶管理員」角色 (
roles/iam.serviceAccountAdmin
)。
建立或找出使用者代管的服務帳戶
您可以建立新的使用者管理服務帳戶,也可以使用現有帳戶。
如要建立使用者管理的服務帳戶,請按照「建立服務帳戶」一文中的操作說明進行。
如要使用現有的使用者管理服務帳戶,您需要該帳戶的電子郵件地址,格式如下:
SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
如果服務帳戶與轉移作業位於不同專案,請參閱「啟用跨專案附加服務帳戶」。
授予使用者存取權
授予使用者帳戶存取新的使用者管理服務帳戶的權限,並指派「服務帳戶使用者」角色 (roles/iam.serviceAccountUser
)。使用者帳戶是指用來建立或更新轉移工作的帳戶。
Google Cloud 控制台
前往 Google Cloud 控制台的「Service Accounts」(服務帳戶) 頁面。
選取專案。
按一下使用者代管服務帳戶的電子郵件地址。
選取 [權限] 分頁標籤。
按一下
「授予存取權」。輸入使用者的電子郵件地址。例如
user1@example.com
。從「Role」(角色) 下拉式清單中,選取「Service Account User」(服務帳戶使用者)。
按一下 [儲存]。主體就會取得服務帳戶的角色。
gcloud
如要將角色授予主體,請執行 add-iam-policy-binding
指令:
gcloud iam service-accounts add-iam-policy-binding USER_MANAGED_SERVICE_ACCOUNT_EMAIL \ --member=PRINCIPAL --role=roles/iam.serviceAccountUser
請替換下列變數:
- USER_MANAGED_SERVICE_ACCOUNT_EMAIL:使用者管理的服務帳戶電子郵件地址,格式為
SA_NAME@PROJECT_ID.iam.gserviceaccount.com
。 - PRINCIPAL:執行轉移作業的使用者電子郵件地址,格式為
user:name@example.com
。
授予服務代理存取權
如要讓服務代理程式從使用者管理的服務帳戶產生存取權杖,請授予服務代理程式使用者管理的服務帳戶存取權,並指派「服務帳戶憑證建立者」角色 (roles/iam.serviceAccountTokenCreator
)。
如要授予存取權,您需要服務專員的電子郵件地址。如要尋找服務專員的電子郵件地址,請按照下列步驟操作:
前往
googleServiceAccounts.get
參考頁面。系統會開啟互動式面板,標題為「試試這個方法」。
在面板的「Request parameters」(要求參數) 下方,輸入專案 ID。您在此指定的專案,必須是您用來管理 Storage 移轉服務的專案。
按一下 [Execute] (執行)。
服務專員的電子郵件地址會以
accountEmail
的值傳回。格式為project-PROJECT_NUMBER@storage-transfer-service.iam.gserviceaccount.com
。
接著,如要授予服務代理商使用者管理的服務帳戶存取權,請按照下列步驟操作:
Google Cloud 控制台
前往 Google Cloud 控制台的「Service Accounts」(服務帳戶) 頁面。
選取專案。
按一下使用者代管服務帳戶的電子郵件地址。
選取 [權限] 分頁標籤。
按一下
「授予存取權」。輸入服務專員的電子郵件地址。
在「Role」(角色) 下拉式清單中,選取「Service Account Token Creator」(服務帳戶憑證建立者)。
按一下 [儲存]。主體就會取得服務帳戶的角色。
gcloud
如要將角色授予主體,請執行 add-iam-policy-binding
指令:
gcloud iam service-accounts add-iam-policy-binding USER_MANAGED_SERVICE_ACCOUNT_EMAIL \ --member=serviceAccount:SERVICE_AGENT_EMAIL --role=roles/iam.serviceAccountTokenCreator
請替換下列變數:
- USER_MANAGED_SERVICE_ACCOUNT_EMAIL:使用者管理的服務帳戶電子郵件地址,格式為
SA_NAME@PROJECT_ID.iam.gserviceaccount.com
。 - SERVICE_AGENT_EMAIL:服務專員的電子郵件地址。
將 bucket 權限授予使用者管理的服務帳戶
向使用者管理的服務帳戶授予「Google 代管的服務代理程式權限」中列出的權限,而不是向服務代理程式授予權限。
使用使用者代管的服務帳戶建立移轉作業
授予正確權限後,您可以在建立新的轉移工作時,指定使用者管理的服務帳戶。
Google Cloud 控制台
按照操作說明建立轉移作業。完成轉移工作前,請先完成下列事項:
- 在「選擇設定」頁面中,找到「服務帳戶類型」部分。
- 選取「使用者自行管理的服務帳戶」。
- 輸入使用者代管的服務帳戶電子郵件地址,格式為
SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
。 - 按一下「建立」即可建立轉移工作。
REST API
在 transferJobs.create
請求中,將使用者代管的服務帳戶指定為 serviceAccount
欄位的值。
該值必須使用格式 projects/-/serviceAccounts/ACCOUNT_EMAIL_OR_UNIQUEID
。
字串中可接受服務帳戶電子郵件地址 (SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
) 或專屬 ID (123456789012345678901
)。請務必使用 -
萬用字元,以專案 ID 取代該字元無效。
例如:
POST https://storagetransfer.googleapis.com/v1/transferJobs
{
"description": "A transfer using a user-managed service account for bucket permissions",
"status": "ENABLED",
"projectId": "PROJECT_ID",
"serviceAccount": "projects/-/serviceAccounts/SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com",
"transferSpec": {
...
}
}