本文說明如何在 Dataform 中執行下列操作:
事前準備
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the BigQuery and Dataform APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles. -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the BigQuery and Dataform APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles. - 在「存放區」層級,執行特定存放區中的所有工作流程。
- 個別工作流程設定。
- Dataform 需要讀取和寫入權限的專案。這些專案通常包括代管 Dataform 存放區的專案。
- 在 Dataform 需要唯讀存取的專案中,授予 BigQuery 資料檢視者角色。
- Dataform 存放區代管專案的 BigQuery 工作使用者。
- BigQuery 資料擁有者:如要查詢 BigQuery 資料集。
- 資料欄層級存取權控管的 BigQuery 角色:如要使用 BigQuery 政策標記。
無論 VPC 服務控管設定為何,只要服務代理程式或服務帳戶獲得必要角色,就能存取所屬專案中的 BigQuery 或 Secret Manager。如果要求是從 Dataform 發出,且使用的服務代理具備必要角色,則該要求會位於 Dataform 存放區所屬專案的 VPC Service Controls 範圍內。
詳情請參閱「設定 VPC Service Controls」。
只要具備
dataform.repositories.createIAM 權限,使用者就能透過預設的 Dataform 服務代理程式執行程式碼,並使用授予該服務代理程式或服務帳戶的所有權限。詳情請參閱「Dataform 權限的安全考量」。
- 如要使用附加至工作流程設定的其他 Google 帳戶使用者憑證修改工作流程設定,您必須將自己的 Google 帳戶使用者憑證附加至工作流程設定,或變更工作流程設定,以透過 {dataform_name_short} 服務代理程式或自訂服務帳戶進行驗證。
- 如果工作流程設定參照的發行設定已附加其他 Google 帳戶使用者的憑證,您就無法修改該發行設定的彙整結果。
您無法將工作流程設定為透過 Google 帳戶使用者憑證進行驗證,並參照排程的發布設定。這項限制會造成下列影響:
- 如果工作流程設定參照的發布設定設為使用 Google 帳戶使用者憑證進行驗證,您就無法更新發布設定,改為使用時間表。
- 您無法建立工作流程設定,透過 Google 帳戶使用者憑證進行驗證,並指向具有時間表的發布設定。
- 您無法建立或更新工作流程設定,以使用 Google 帳戶使用者憑證,並指向排定時間的發布設定。
前往 Google Cloud 控制台的「Dataform」頁面。
選取或建立存放區。
前往 Google Cloud 控制台的「IAM」(身分與存取權管理) 頁面。
點選「授予存取權」。
在「新增主體」欄位中,輸入服務代理程式 ID、服務帳戶 ID 或使用者的 Google 帳戶電子郵件地址 (預覽版)。
在「Select a role」(選取角色) 清單中,選取「BigQuery Job User」(BigQuery 工作使用者) 角色。
點選「新增其他角色」,然後在「請選擇角色」清單中,選取「BigQuery 資料編輯者」角色。
點選「新增其他角色」,然後在「請選擇角色」清單中,選取「BigQuery 資料檢視者」角色。
按一下 [儲存]。
在 Google Cloud 控制台中,依序前往「IAM」>「Service accounts」(服務帳戶)。
選取專案。
在「專案『PROJECT_NAME』的服務帳戶」頁面,選取自訂服務帳戶。
前往「具有存取權的主體」,然後點選「授予存取權」。
在「新增主體」欄位中,輸入預設的 Dataform 服務代理程式 ID。
預設 Dataform 服務代理程式 ID 的格式如下:
service-PROJECT_NUMBER@gcp-sa-dataform.iam.gserviceaccount.com在「Select a role」(選取角色) 清單中,選取「Service Account Token Creator」(服務帳戶憑證建立者) 角色和「Service Account User」(服務帳戶使用者) 角色。
按一下 [儲存]。
使用 Cloud Asset Inventory 列出所有
dataform.Repository類型的資源。 詳情請參閱「查看資產」。針對 Cloud Asset Inventory 輸出內容中的每個存放區,請檢查
resource.data.labels欄位,判斷是否在範圍內。實際路徑可能會因匯出格式而略有不同。檢查
single-file-asset-type鍵的標籤對應,找出範圍外的存放區。如果存在這個金鑰,表示 BigQuery 功能正在使用存放區。如果值為sql或data_canvas,系統可以將存放區排除在服務帳戶權限檢查之外。其餘缺少這組金鑰或這些值的存放區,都在服務帳戶權限檢查的範圍內。
針對每個適用範圍內的存放區,檢查 Cloud Asset Inventory 輸出內容中的
resource.data.serviceAccount欄位,判斷是否已設定自訂服務帳戶:- 如果
resource.data.serviceAccount欄位存在,且值與專案的預設 Dataform 服務代理程式電子郵件地址不同,則存放區會使用自訂服務帳戶。 如果缺少
resource.data.serviceAccount欄位,或欄位值與專案的預設 Dataform 服務代理程式相符,存放區就會使用預設服務代理程式。
- 如果
如果使用自訂服務帳戶,請確認預設 Dataform 服務代理程式在該自訂服務帳戶中,同時具備服務帳戶使用者角色 (
roles/iam.serviceAccountUser) 和服務帳戶權杖建立者角色 (roles/iam.serviceAccountTokenCreator)。使用 Cloud Asset Inventory 列出
dataform.WorkflowConfig類型的所有資源。針對每個工作流程設定,檢查 Cloud Asset Inventory 輸出內容,判斷有效服務帳戶:
- 如果存在
resource.data.serviceAccount欄位,這個值就是工作流程設定中明確設定的服務帳戶電子郵件地址。 - 如果缺少
resource.data.serviceAccount欄位,工作流程設定會沿用父項存放區的服務帳戶。請檢查父項存放區的設定,找出有效的服務帳戶。
- 如果存在
如要判斷是否使用自訂服務帳戶,請比較有效服務帳戶的電子郵件地址與專案預設 Dataform 服務代理程式的電子郵件地址。如果兩者不同,表示目前使用的是自訂服務帳戶。
如果使用自訂服務帳戶,請確保預設的 Dataform 服務代理程式已獲得該自訂服務帳戶的服務帳戶使用者角色 (
roles/iam.serviceAccountUser) 和服務帳戶權杖建立者角色 (roles/iam.serviceAccountTokenCreator)。這些權限可讓預設 Dataform 服務代理程式啟動工作流程執行作業,並模擬自訂服務帳戶。dataform.commentThreads.createdataform.commentThreads.deletedataform.commentThreads.getdataform.commentThreads.listdataform.commentThreads.updatedataform.comments.createdataform.comments.deletedataform.comments.getdataform.comments.listdataform.comments.updatedataform.compilationResults. create dataform.compilationResults. get dataform.compilationResults. list dataform.compilationResults. query dataform.config.getdataform.config.updatedataform.folders.addContentsdataform.folders.createdataform.folders.deletedataform.folders.getdataform.folders.getIamPolicydataform.folders.movedataform.folders.queryContentsdataform.folders.setIamPolicydataform.folders.updatedataform.locations.getdataform.locations.listdataform.operations.canceldataform.operations.deletedataform.operations.getdataform.operations.listdataform.releaseConfigs.createdataform.releaseConfigs.deletedataform.releaseConfigs.getdataform.releaseConfigs.listdataform.releaseConfigs.updatedataform.repositories.commitdataform.repositories. computeAccessTokenStatus dataform.repositories.createdataform.repositories.deletedataform.repositories. fetchHistory dataform.repositories. fetchRemoteBranches dataform.repositories.getdataform.repositories. getIamPolicy dataform.repositories.listdataform.repositories.movedataform.repositories. queryDirectoryContents dataform.repositories.readFiledataform.repositories. scheduleRelease dataform.repositories. scheduleWorkflow dataform.repositories. setIamPolicy dataform.repositories.updatedataform.teamFolders.createdataform.teamFolders.deletedataform.teamFolders.getdataform.teamFolders. getIamPolicy dataform.teamFolders. setIamPolicy dataform.teamFolders.updatedataform.workflowConfigs. create dataform.workflowConfigs. delete dataform.workflowConfigs.getdataform.workflowConfigs.listdataform.workflowConfigs. update dataform.workflowInvocations. cancel dataform.workflowInvocations. create dataform.workflowInvocations. delete dataform.workflowInvocations. get dataform.workflowInvocations. list dataform.workflowInvocations. query dataform.workspaces.commitdataform.workspaces.createdataform.workspaces.deletedataform.workspaces. fetchFileDiff dataform.workspaces. fetchFileGitStatuses dataform.workspaces. fetchGitAheadBehind dataform.workspaces.getdataform.workspaces. getIamPolicy dataform.workspaces. installNpmPackages dataform.workspaces.listdataform.workspaces. makeDirectory dataform.workspaces. moveDirectory dataform.workspaces.moveFiledataform.workspaces.pulldataform.workspaces.pushdataform.workspaces. queryDirectoryContents dataform.workspaces.readFiledataform.workspaces. removeDirectory dataform.workspaces.removeFiledataform.workspaces.resetdataform.workspaces. searchFiles dataform.workspaces. setIamPolicy dataform.workspaces.writeFiledataform.commentThreads.createdataform.commentThreads.deletedataform.commentThreads.getdataform.commentThreads.listdataform.commentThreads.updatedataform.comments.createdataform.comments.deletedataform.comments.getdataform.comments.listdataform.comments.updatedataform.locations.getdataform.locations.listdataform.commentThreads.createdataform.commentThreads.deletedataform.commentThreads.getdataform.commentThreads.listdataform.commentThreads.updatedataform.comments.createdataform.comments.deletedataform.comments.getdataform.comments.listdataform.comments.updatedataform.compilationResults. create dataform.compilationResults. get dataform.compilationResults. list dataform.compilationResults. query dataform.locations.getdataform.locations.listdataform.commentThreads.createdataform.commentThreads.deletedataform.commentThreads.getdataform.commentThreads.listdataform.commentThreads.updatedataform.comments.createdataform.comments.deletedataform.comments.getdataform.comments.listdataform.comments.updatedataform.compilationResults. create dataform.compilationResults. get dataform.compilationResults. list dataform.compilationResults. query dataform.folders.addContentsdataform.folders.createdataform.folders.deletedataform.folders.getdataform.folders.getIamPolicydataform.folders.movedataform.folders.queryContentsdataform.folders.setIamPolicydataform.folders.updatedataform.locations.getdataform.locations.listdataform.workspaces.commitdataform.workspaces.createdataform.workspaces.deletedataform.workspaces. fetchFileDiff dataform.workspaces. fetchFileGitStatuses dataform.workspaces. fetchGitAheadBehind dataform.workspaces.getdataform.workspaces. getIamPolicy dataform.workspaces. installNpmPackages dataform.workspaces.listdataform.workspaces. makeDirectory dataform.workspaces. moveDirectory dataform.workspaces.moveFiledataform.workspaces.pulldataform.workspaces.pushdataform.workspaces. queryDirectoryContents dataform.workspaces.readFiledataform.workspaces. removeDirectory dataform.workspaces.removeFiledataform.workspaces.resetdataform.workspaces. searchFiles dataform.workspaces. setIamPolicy dataform.workspaces.writeFiledataform.compilationResults. create dataform.compilationResults. get dataform.compilationResults. list dataform.compilationResults. query dataform.locations.getdataform.locations.listdataform.compilationResults. create dataform.compilationResults. get dataform.compilationResults. list dataform.compilationResults. query dataform.locations.getdataform.locations.listdataform.workflowInvocations. cancel dataform.workflowInvocations. create dataform.workflowInvocations. delete dataform.workflowInvocations. get dataform.workflowInvocations. list dataform.workflowInvocations. query dataform.commentThreads.createdataform.commentThreads.deletedataform.commentThreads.getdataform.commentThreads.listdataform.commentThreads.updatedataform.comments.createdataform.comments.deletedataform.comments.getdataform.comments.listdataform.comments.updatedataform.compilationResults. create dataform.compilationResults. get dataform.compilationResults. list dataform.compilationResults. query dataform.locations.getdataform.locations.listdataform.commentThreads.createdataform.commentThreads.deletedataform.commentThreads.getdataform.commentThreads.listdataform.commentThreads.updatedataform.comments.createdataform.comments.deletedataform.comments.getdataform.comments.listdataform.comments.updatedataform.compilationResults. create dataform.compilationResults. get dataform.compilationResults. list dataform.compilationResults. query dataform.locations.getdataform.locations.listdataform.commentThreads.createdataform.commentThreads.deletedataform.commentThreads.getdataform.commentThreads.listdataform.commentThreads.updatedataform.comments.createdataform.comments.deletedataform.comments.getdataform.comments.listdataform.comments.updatedataform.compilationResults. create dataform.compilationResults. get dataform.compilationResults. list dataform.compilationResults. query dataform.folders.addContentsdataform.folders.createdataform.folders.deletedataform.folders.getdataform.folders.getIamPolicydataform.folders.movedataform.folders.queryContentsdataform.folders.setIamPolicydataform.folders.updatedataform.locations.getdataform.locations.listdataform.workspaces.commitdataform.workspaces.createdataform.workspaces.deletedataform.workspaces. fetchFileDiff dataform.workspaces. fetchFileGitStatuses dataform.workspaces. fetchGitAheadBehind dataform.workspaces.getdataform.workspaces. getIamPolicy dataform.workspaces. installNpmPackages dataform.workspaces.listdataform.workspaces. makeDirectory dataform.workspaces. moveDirectory dataform.workspaces.moveFiledataform.workspaces.pulldataform.workspaces.pushdataform.workspaces. queryDirectoryContents dataform.workspaces.readFiledataform.workspaces. removeDirectory dataform.workspaces.removeFiledataform.workspaces.resetdataform.workspaces. searchFiles dataform.workspaces. setIamPolicy dataform.workspaces.writeFiledataform.compilationResults. create dataform.compilationResults. get dataform.compilationResults. list dataform.compilationResults. query dataform.locations.getdataform.locations.listdataform.locations.getdataform.locations.list- BigQuery 管理員 (
roles/bigquery.admin) - BigQuery Job User (
roles/bigquery.jobUser) - BigQuery Studio 使用者 (
roles/bigquery.studioUser) - BigQuery 使用者 (
roles/bigquery.user) - 程式碼建立工具 (
roles/dataform.codeCreator) - 程式碼編輯器 (
roles/dataform.codeEditor) - 程式碼擁有者 (
roles/dataform.codeOwner) - Colab Enterprise 使用者 (
roles/aiplatform.colabEnterpriseUser) - Dataform 管理員 (
roles/dataform.admin) 前往「IAM & Admin」(IAM 與管理) >「Roles」(角色) 頁面。
在「Filter」(篩選器) 欄位中,選取「Used in」(使用於),輸入
Dataform,然後按 Enter 鍵。按一下列出的任一角色,即可在右側窗格中查看該角色的權限。
舉例來說,Dataform 管理員角色具備所有 Dataform 資源的完整存取權。
在終端機中,傳遞 Dataform API
repositories.setIamPolicy要求和存取政策。在政策中,將使用者、群組、網域、服務代理程式或服務帳戶繫結至所選角色,格式如下:
{ "policy": { "bindings": [ { "role": "roles/ROLE", "members": [ "TYPE:IDENTIFIER", ] }, ], } }更改下列內容:
ROLE:您要在存放區中授予的 Dataform IAM 角色。TYPE:user、group、domain或serviceAccount。IDENTIFIER:要授予角色的使用者、群組、網域或服務帳戶。
在 IAM 頁面中,確認所有使用者都能透過具有
dataform.repositories.list權限的 Dataform 角色,查看完整的 Dataform 存放區清單。在 IAM 中,請確保只有需要完整存取所有 Dataform 存放區的使用者,才能在所有存放區中獲派 Dataform 管理員角色。
在終端機中,傳遞 Dataform API
repositories.setIamPolicy要求和存取政策。在政策中,將
allAuthenticatedUsers主體繫結至所選角色,格式如下:{ "policy": { "bindings": [ { "role": "roles/ROLE", "members": [ "allAuthenticatedUsers", ] }, ], } }將
ROLE替換為要授予所有已驗證使用者的 Dataform IAM 角色。前往 Google Cloud 控制台的「Dataform」頁面。
選取存放區,然後選取工作區。
在「檔案」窗格中,展開
definitions/目錄。選取要授予存取權的資料表或檢視區塊的
.sqlx定義檔案。在檔案中輸入下列程式碼片段:
post_operations { GRANT "ROLE_LIST" ON "RESOURCE_TYPE" ${self()} TO "USER_LIST" }更改下列內容:
ROLE_LIST:要授予的 BigQuery 角色或以半形逗號分隔的 BigQuery 角色清單。
RESOURCE_TYPE:
TABLE或VIEW。USER_LIST:以半形逗號分隔的使用者清單,這些使用者會獲得角色。
如需有效格式清單,請參閱「user_list」。
選用:按一下「格式」。
執行資料表或檢視畫面。
如果您在累加資料表上授予存取權,請在第一次執行後,從資料表定義檔案中移除
GRANT陳述式。前往 Google Cloud 控制台的「Dataform」頁面。
選取存放區,然後選取工作區。
在「檔案」窗格中,展開
definitions/目錄。選取要撤銷存取權的資料表或檢視區塊的
.sqlx定義檔案。在
post_operations區塊中,輸入下列REVOKE陳述式:REVOKE "ROLE_LIST" ON "RESOURCE_TYPE" ${self()} FROM "USER_LIST"更改下列內容:
- ROLE_LIST:要撤銷的 BigQuery 角色或以半形逗號分隔的 BigQuery 角色清單。
- RESOURCE_TYPE:
TABLE或VIEW。 - USER_LIST:以半形逗號分隔的使用者清單,這些使用者的角色會遭到撤銷。如需有效格式清單,請參閱「user_list」。
如要撤銷檔案中
GRANT陳述式授予的存取權,請將GRANT陳述式替換為REVOKE陳述式。選用:按一下「格式」。
執行資料表或檢視畫面。
如果撤銷增量資料表的存取權,請在第一次執行後,從資料表定義檔案中移除
REVOKE陳述式。前往 Google Cloud 控制台的「Dataform」頁面。
選取存放區,然後選取工作區。
在「Files」(檔案) 窗格中,點按
definitions/旁的
「更多」選單。點選「建立檔案」。
在「Add a file path」(新增檔案路徑) 欄位中,輸入檔案名稱,然後在
definitions/後方輸入.sqlx。例如:definitions/table-access.sqlx。檔名只能包含數字、字母、連字號和底線。
點選「建立檔案」。
在「檔案」窗格中,展開
definitions/目錄,然後選取新建立的檔案。在檔案中輸入下列程式碼片段:
config { type: "operations" } GRANT "ROLE_LIST" ON RESOURCE_TYPE RESOURCE_NAME TO "USER_LIST" REVOKE "ROLE_LIST" ON { "<var>" }}RESOURCE_TYPE RESOURCE_NAME TO "USER_LIST"更改下列內容:
- ROLE_LIST:要授予或撤銷的 BigQuery 角色或以半形逗號分隔的 BigQuery 角色清單。
- RESOURCE_TYPE:
TABLE或VIEW。 - RESOURCE_NAME:資料表或檢視區塊的名稱。
- USER_LIST:以半形逗號分隔的使用者清單,這些使用者會獲得或遭撤銷角色。如需有效格式清單,請參閱「user_list」。
視需要加入
GRANT和REVOKE陳述式。如要撤銷檔案中
GRANT陳述式授予的存取權,請將GRANT陳述式替換為REVOKE陳述式。移除
GRANT陳述式而不新增REVOKE陳述式,不會撤銷存取權。
選用:按一下「格式」。
每次更新後都執行檔案。
- 如果您在增量資料表上授予或撤銷存取權,請在第一次執行陳述式後,從檔案中移除
GRANT或REVOKE陳述式。
- 如果您在增量資料表上授予或撤銷存取權,請在第一次執行陳述式後,從檔案中移除
如要建立工作流程設定,請按照下列步驟操作:
- 專案的
dataform.workflowConfigs.create權限,由程式碼排程器角色 (roles/dataform.codeScheduler) 授予。 - 存放區的
dataform.repositories.scheduleWorkflow權限,由 Dataform 管理員角色 (roles/dataform.admin) 授予。
- 專案的
如要建立發布設定,請按照下列步驟操作:
- 專案的
dataform.releaseConfigs.create權限,由程式碼排程器角色 (roles/dataform.codeScheduler) 授予。 - 存放區的
dataform.repositories.scheduleRelease權限,由 Dataform 管理員角色 (roles/dataform.admin) 授予。
- 專案的
- 如要進一步瞭解 IAM,請參閱「IAM 總覽」。
- 如要進一步瞭解如何管理資源存取權,請參閱「管理專案、資料夾和機構的存取權」一文。
- 如要進一步瞭解員工身分聯盟的重要概念,請參閱「員工身分聯盟」。
- 如要進一步瞭解 BigQuery IAM 角色和權限,請參閱「使用 IAM 控管存取權」。
- 如要進一步瞭解如何授予 BigQuery 資料集精細權限,請參閱「控管資料集存取權」。
授予 Dataform 必要存取權
本節說明如何授予 Dataform 服務代理程式和自訂服務帳戶執行 BigQuery 工作流程所需的 Identity and Access Management (IAM) 角色。
關於自訂服務帳戶和 Dataform 服務代理人
您可以透過下列方式設定自訂服務帳戶,代表您執行工作流程:
建立 Dataform 存放區或工作流程設定時,您可以選取任何您擁有「扮演身分」權限的服務帳戶。您必須為與 Dataform 資源相關聯的所有服務帳戶設定必要權限。
建立第一個 Dataform 存放區時,Dataform 會自動產生預設服務代理程式。Dataform 會使用預設服務代理程式代表您與 BigQuery 互動。
預設 Dataform 服務代理程式 ID 的格式如下:
service-PROJECT_NUMBER@gcp-sa-dataform.iam.gserviceaccount.com
將 PROJECT_NUMBER 替換為專案的數字 ID。Google Cloud 您可以在 Google Cloud 控制台資訊主頁中找到專案 IDGoogle Cloud 。詳情請參閱「識別專案」。
Dataform 服務代理、自訂服務帳戶和 Google 帳戶的必要角色
在 Dataform 中用於驗證的預設 Dataform 服務代理程式、自訂服務帳戶和 Google 帳戶使用者憑證 (搶先版),必須具備下列 BigQuery IAM 角色,才能在 BigQuery 中執行工作流程:
此外,請在工作流程設定的有效服務帳戶中,將下列角色授予預設的 Dataform 服務代理程式:
如要自動發布存放區版本及自動執行工作流程,請在有效服務帳戶中,將 iam.serviceAccounts.actAs 權限授予預設的 Dataform 服務代理。
安全性考量
將 Dataform 服務代理、自訂服務帳戶或使用者 Google 帳戶 (預覽版) 所需的角色授予 Dataform 時,請注意下列安全性考量:
如要限制使用者、服務代理程式或服務帳戶在 BigQuery 中讀取或寫入的資料,您可以將精細的 BigQuery IAM 權限授予所選的 BigQuery 資料集或資料表。詳情請參閱「控管資料集存取權」和「控管資料表和檢視區塊的存取權」。
為防止使用者使用其他使用者的 Google 帳戶使用者憑證執行動作,系統會強制執行下列限制:
授予必要的 BigQuery 角色
如要將必要的 BigQuery IAM 角色授予預設的 Dataform 服務代理程式、要在 Dataform 中使用的自訂服務帳戶,或要用於在 Dataform 中驗證的使用者 Google 帳戶 (搶先版),請按照下列步驟操作:
授予自動工作流程所需的角色
如要在 Dataform 中使用自訂服務帳戶,預設的 Dataform 服務代理程式必須能夠存取自訂服務帳戶。這樣一來,Dataform 就能使用自訂服務帳戶中定義的權限執行工作流程,而不是使用預設服務代理程式帳戶的權限。
如要授予這項存取權,您需要將服務帳戶權杖建立者角色 (roles/iam.serviceAccountTokenCreator) 授予預設 Dataform 服務代理,做為主體。這樣一來,預設 Dataform 服務代理程式就能建立短期憑證 (又稱權杖),模擬服務帳戶。Dataform 必須使用這些權杖,才能透過自訂服務帳戶的身分執行工作流程。
您也需要將服務帳戶使用者角色 (roles/iam.serviceAccountUser) 授予預設 Dataform 服務代理。這樣一來,預設的 Dataform 服務代理人就能為自訂服務帳戶執行的工作流程設定,啟動新的自動工作流程執行作業。
如要授予預設 Dataform 服務代理程式自訂服務帳戶的存取權,請按照下列步驟操作:
現在您可以在 Dataform 存放區中設定自訂服務帳戶。
稽核服務帳戶設定
本節說明如何稽核 Dataform 資源,確保服務帳戶使用方式和權限授予作業正確無誤。使用自訂服務帳戶時,稽核作業尤其重要,因為預設 Dataform 服務代理程式需要特定權限才能運作。
為 Dataform 存放區或工作流程設定使用自訂服務帳戶時,請務必確認預設的 Dataform 服務代理程式在自訂服務帳戶中具有服務帳戶使用者角色 (roles/iam.serviceAccountUser)。這個角色會授予 iam.serviceAccounts.actAs 權限,讓預設的 Dataform 服務代理程式啟動排定執行的作業時,可以模擬自訂服務帳戶。此外,請確認預設 Dataform 服務代理程式在有效服務帳戶中,是否具備服務帳戶權杖建立者角色 (roles/iam.serviceAccountTokenCreator)。
驗證存放區服務帳戶
首先,請找出 Dataform 本身排程和執行作業的範圍內 dataform.Repository 資產。然後,驗證這些範圍內存放區的服務帳戶設定。
驗證工作流程設定服務帳戶
為 Dataform 工作流程設定使用專屬的自訂服務帳戶,是符合最低權限原則的安全最佳做法。
如要驗證 dataform.WorkflowConfig resources 的服務帳戶用量,請按照下列步驟操作:
使用 IAM 控管 Dataform 的存取權
本節說明 Dataform 的存取權控制選項,並介紹如何查看及授予 Dataform 角色。Dataform 使用 Identity and Access Management (IAM) 控管存取權。如要進一步瞭解 IAM 中的角色和權限,請參閱「IAM 角色和權限索引」。
預先定義的 Dataform 角色
下表列出可存取 Dataform 資源的預先定義角色:
| Role | Permissions |
|---|---|
Dataform Admin( Full access to all Dataform resources. |
|
Code Commenter Beta( Permissions to comment, at the repository level. Grants CRUD access over commentThread and comment resources. |
|
Code Creator( Access only to private and shared code resources. The permissions in the Code Creator let you create and list code in Dataform, and access only the code that you created and code that was explicitly shared with you. |
|
Code Editor( Edit access code resources. |
|
Code Owner( Full access to code resources. |
|
Code Scheduler Beta( Access for scheduling workflows and releases. |
|
Code Viewer( Read-only access to all code resources. |
|
Dataform Editor( Edit access to Workspaces and Read-only access to Repositories. |
|
Dataform Service Agent( Gives permission for the Dataform API to access a secret from Secret Manager |
|
Team Folder Commenter Beta( View and comment access to a team folder and its contents. |
|
Team Folder Contributor Beta( Edit access to a team folder and its contents. |
|
Team Folder Creator Beta( Access to create new team folders. |
|
Team Folder Owner Beta( Full access to a team folder and its contents. Can share the team folder and its contents. |
|
Team Folder Viewer Beta( View access to a team folder and its contents. |
|
Dataform Viewer( Read-only access to all Dataform resources. |
|
自訂 Dataform 角色
自訂角色可包含您指定的任何權限。您可以建立自訂角色,並授予執行特定管理作業的權限,例如建立開發工作區,或在開發工作區中建立檔案和目錄。如要建立自訂角色,請參閱「建立及管理自訂角色」。
Dataform 權限的安全考量
只要使用者擁有 dataform.repositories.create 權限,就能使用預設的 Dataform 服務代理程式,以及授予該服務代理程式的所有權限,在 BigQuery 中執行程式碼。包括執行 Dataform 工作流程。
下列 IAM 角色具備 dataform.repositories.create 權限:
如要限制使用者、服務代理程式或服務帳戶在 BigQuery 中讀取或寫入的資料,您可以將精細的 BigQuery IAM 權限授予所選的 BigQuery 資料集或資料表。詳情請參閱「控管資料集存取權」和「控管資料表和檢視區塊的存取權」。
如要進一步瞭解預設 Dataform 服務代理程式,以及該代理程式所需角色和權限,請參閱「授予 Dataform 必要存取權」。
查看 Dataform 角色
在 Google Cloud 控制台中,執行下列步驟:
如要進一步瞭解如何授予專案角色,請參閱「授予角色」。您可以透過這種方式授予預先定義或自訂角色。
控管個別存放區的存取權
如要使用精細權限控管 Dataform 的存取權,可以透過 Dataform API repositories.setIamPolicy 要求,在個別存放區設定 Dataform IAM 角色。
如要為個別 Dataform 存放區設定 Dataform IAM 角色,請按照下列步驟操作:
下列指令會傳遞 repositories.setIamPolicy Dataform API 要求,將 sales 存放區的 Dataform 編輯者角色授予單一使用者:
curl -H "Content-Type: application/json" -X POST -d '{ "policy": { "bindings": [{ "role": "roles/dataform.editor", "members": ["user:sasha@examplepetstore.com"]}] }}' "https://dataform.googleapis.com/v1/projects/examplepetstore/locations/us-central1/repositories/sales:setIamPolicy"
授予存放區公開存取權
如要授予 Dataform 存放區的公開存取權,請將存放區的 IAM 角色授予 allAuthenticatedUsers 主體。
將 IAM 角色指派給allAuthenticatedUsers主體時,服務代理程式、服務帳戶和所有透過 Google 帳戶完成驗證的使用者都會獲得該角色。這個識別包含未連結至 Google Workspace 帳戶或 Cloud Identity 網域的帳戶,例如個人 Gmail 帳戶。未通過驗證的使用者 (如匿名訪客) 不會具有這個識別碼。詳情請參閱「所有已通過驗證的使用者」。
舉例來說,如果您在 sales 存放區中將 Dataform 檢視者角色授予 allAuthenticatedUsers,那麼所有服務代理程式、服務帳戶和透過 Google 帳戶驗證的使用者,都能以唯讀模式存取所有 sales 程式碼資源。
如要授予 Dataform 存放區的公開存取權,請按照下列步驟操作:
下列指令會傳遞 repositories.setIamPolicy Dataform API 要求,將 sales 存放區的 Dataform 檢視者角色授予 allAuthenticatedUsers:
curl -H "Content-Type: application/json" -X POST -d '{ "policy": { "bindings": [{ "role": "roles/dataform.viewer", "members": ["allAuthenticatedUsers"]}] }}' "https://dataform.googleapis.com/v1/projects/examplepetstore/locations/us-central1/repositories/sales:setIamPolicy"
禁止公開存取存放區
如要確保任何 Dataform 存放區都不會授予公眾存取權,您可以在專案中限制 allAuthenticatedUsers 主體。
如要在專案中限制 allAuthenticatedUsers,您可以設定 iam.allowedPolicyMemberDomains 政策,並從 allowed_values 清單中移除 allAuthenticatedUsers。
在iam.allowedPolicyMemberDomains政策中限制 allAuthenticatedUsers 時,專案中的任何 IAM 政策都無法使用 allAuthenticatedUsers 主體,這可防止授予所有資源 (包括 Dataform 存放區) 的公開存取權。
如要進一步瞭解 iam.allowedPolicyMemberDomains 政策,以及如何設定這項政策,請參閱「依照網域設定身分限制」。
Dataform 中的員工身分聯盟
員工身分聯盟可讓您使用外部識別資訊提供者 (IdP) 驗證使用者身分並授權存取 Google Cloud 服務,並透過 IAM 管理存取權。
Dataform 支援員工身分聯盟,且沒有已知限制。
使用 IAM 控管個別資料表的存取權
本節說明如何為個別 Dataform 資料表和檢視區塊授予及撤銷 BigQuery IAM 角色。
Dataform 執行資料表或檢視區塊時,會在 BigQuery 中建立資源。在 Dataform 中開發時,您可以將 BigQuery 角色授予個別資料表和檢視區塊,以便在執行後控管 BigQuery 中的存取權。
如要進一步瞭解如何授予及撤銷資源存取權,請參閱「授予資源存取權」。
將 BigQuery 角色授予資料表或檢視表
如要將 BigQuery 角色授予資料表或檢視區塊,請在所選資料表或檢視區塊的 .sqlx 定義檔中,新增含有 GRANT DCL 陳述式的 post_operations 區塊。
如要將 BigQuery 角色授予所選資料表或檢視畫面,請按照下列步驟操作:
下列程式碼範例顯示授予使用者資料表的 BigQuery 檢視者角色:
config { type: "table" }
SELECT ...
post_operations {
GRANT `roles/bigquery.dataViewer`
ON TABLE ${self()}
TO "user:222larabrown@gmail.com"
}
從資料表或檢視區塊撤銷 BigQuery 角色
如要從資料表或檢視區塊撤銷 BigQuery 角色,請在所選資料表或檢視區塊的 .sqlx 定義檔中,新增含有 REVOKE DCL 陳述式的 post_operations 區塊。
如要撤銷所選資料表或檢視表的 BigQuery 角色,請按照下列步驟操作:
下列程式碼範例顯示從資料表撤銷使用者 BigQuery 檢視者角色:
config { type: "table" }
SELECT ...
post_operations {
REVOKE `roles/bigquery.dataViewer`
ON TABLE ${self()}
FROM "user:222larabrown@gmail.com"
}
集中管理資料表和檢視區塊的 BigQuery 角色
如要從單一位置控管 BigQuery 對個別資料表和檢視區塊的存取權,您可以建立專用的 type: "operations" 檔案,其中包含 GRANT 和 REVOKE DCL 陳述式。
如要透過單一type: "operations"檔案管理 BigQuery 資料表存取權,請按照下列步驟操作:
使用 Config API 自訂 IAM 行為
您可以使用 projects.locations.updateConfig Dataform API 方法自訂 IAM 行為,並提升安全性。
在建立資源時授予特定角色
在 projects.locations.repositories 資源中將 setAuthenticatedUserAdmin 欄位設為 true 時,Dataform 會自動授予建立存放區的使用者該存放區的 Dataform 管理員角色 (roles/dataform.admin)。此外,如果使用者在該存放區中建立工作區,Dataform 會將新工作區的 Dataform 管理員角色授予該使用者。
您可以在 projects.locations.updateConfig 方法中使用 creator_role 欄位(預覽) 覆寫這項行為。如果 setAuthenticatedUserAdmin 為 true,且您使用自訂角色設定 creator_role 欄位,Dataform 會授予自訂角色,而非預設的 dataform.admin 角色。
實作進階排程權限
如要規定使用者必須具備明確權限才能排定 Dataform 工作流程,請在 projects.locations.updateConfig 方法中,將 enable_project_checks_for_scheduling 欄位設為 true。
啟用這些排程檢查時,使用者必須具備下列權限:
啟用私人工作區
如要限制 Dataform 工作區存取權,只允許工作區建立者在該工作區中讀取及編寫程式碼,請在 projects.locations.updateConfig 方法中,將 enable_private_workspace 欄位設為 true。
這項限制也適用於查看產生的構件,例如編譯的 SQL、編譯錯誤,以及工作區編譯或工作流程調用的執行記錄。
這項設定會覆寫標準 IAM 角色,將工作區存取權授予其他存放區使用者。