@@ -21,3 +21,61 @@ resource "google_cloud_run_service_iam_binding" "public_invoker" {
2121 " allUsers"
2222 ]
2323}
24+
25+ # Dedicated Service Account for running the Dataflow Ingestion pipeline
26+ resource "google_service_account" "dcp_ingestion_runner" {
27+ count = var. deploy_data_ingestion_workflow ? 1 : 0
28+ account_id = " ${ local . name_prefix } dcp-ingestion-sa"
29+ display_name = " Data Commons Platform Ingestion Runner"
30+ }
31+
32+ # Grant Spanner Database User access to the Ingestion runner
33+ resource "google_project_iam_member" "ingestion_spanner_user" {
34+ count = var. deploy_data_ingestion_workflow ? 1 : 0
35+ project = var. project_id
36+ role = " roles/spanner.databaseUser"
37+ member = " serviceAccount:${ google_service_account . dcp_ingestion_runner [0 ]. email } "
38+ }
39+
40+ # Grant Dataflow orchestration and Storage permissions exclusively to the new Ingestion runner
41+ resource "google_project_iam_member" "dataflow_admin" {
42+ count = var. deploy_data_ingestion_workflow ? 1 : 0
43+ project = var. project_id
44+ role = " roles/dataflow.admin"
45+ member = " serviceAccount:${ google_service_account . dcp_ingestion_runner [0 ]. email } "
46+ }
47+
48+ resource "google_project_iam_member" "dataflow_worker" {
49+ count = var. deploy_data_ingestion_workflow ? 1 : 0
50+ project = var. project_id
51+ role = " roles/dataflow.worker"
52+ member = " serviceAccount:${ google_service_account . dcp_ingestion_runner [0 ]. email } "
53+ }
54+
55+
56+ resource "google_service_account_iam_member" "service_account_user" {
57+ count = var. deploy_data_ingestion_workflow ? 1 : 0
58+ service_account_id = google_service_account. dcp_ingestion_runner [0 ]. name
59+ role = " roles/iam.serviceAccountUser"
60+ member = " serviceAccount:${ google_service_account . dcp_ingestion_runner [0 ]. email } "
61+ }
62+
63+ # Fetch project number to reference the Workflows background Service Agent
64+ data "google_project" "project" {
65+ project_id = var. project_id
66+ }
67+
68+ resource "google_service_account_iam_member" "workflows_token_creator" {
69+ count = var. deploy_data_ingestion_workflow ? 1 : 0
70+ service_account_id = google_service_account. dcp_ingestion_runner [0 ]. name
71+ role = " roles/iam.serviceAccountTokenCreator"
72+ member = " serviceAccount:service-${ data . google_project . project . number } @gcp-sa-workflows.iam.gserviceaccount.com"
73+ }
74+
75+ # Bind Object Admin access to either the newly created bucket or an explicitly reused external one
76+ resource "google_storage_bucket_iam_member" "dynamic_ingestion_bucket_access" {
77+ count = var. deploy_data_ingestion_workflow ? 1 : 0
78+ bucket = var. create_ingestion_bucket ? google_storage_bucket. data_ingestion_bucket [0 ]. name : var. external_ingestion_bucket_name
79+ role = " roles/storage.objectAdmin"
80+ member = " serviceAccount:${ google_service_account . dcp_ingestion_runner [0 ]. email } "
81+ }
0 commit comments