From 7832f6c161f3a6a9a3beb4f8538b89a7abe92268 Mon Sep 17 00:00:00 2001 From: Yisheng Cai Date: Tue, 31 Oct 2023 14:22:20 +0800 Subject: [PATCH 1/7] Add roles used by shared vpc --- modules/gcp/vendor-access/common.tf | 14 +++++++++++++- modules/gcp/vendor-access/main.tf | 29 +++++++++++++++++++++++++---- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/modules/gcp/vendor-access/common.tf b/modules/gcp/vendor-access/common.tf index 095eec8..b18dde7 100644 --- a/modules/gcp/vendor-access/common.tf +++ b/modules/gcp/vendor-access/common.tf @@ -1,6 +1,18 @@ variable "project" { type = string - description = "The project id of the target project" + description = "The project id of the target project." +} + +variable "project_num" { + type = string + default = "" + description = "The project number of the target project, required when configuring network project." +} + +variable "network_project" { + type = string + default = "" + description = "The project id of the network host project." } variable "roles" { diff --git a/modules/gcp/vendor-access/main.tf b/modules/gcp/vendor-access/main.tf index 7a64a15..ecddca6 100644 --- a/modules/gcp/vendor-access/main.tf +++ b/modules/gcp/vendor-access/main.tf @@ -1,10 +1,10 @@ locals { - streamnative_gsa = concat(var.streamnative_vendor_access_gsa, var.streamnative_support_access_gsa) + streamnative_gsa = formatlist("serviceAccount:%s", concat(var.streamnative_vendor_access_gsa, var.streamnative_support_access_gsa)) iam_bindings = flatten([ for role in var.roles : [ for gsa in local.streamnative_gsa : { role : role, - member : format("serviceAccount:%s", gsa), + member : gsa, } ] ]) @@ -42,12 +42,33 @@ resource "google_project_iam_member" "sn_access" { depends_on = [google_project_service.gcp_apis] } +locals { + comput_network_user_gsa = var.network_project != "" ? concat(local.streamnative_gsa, [format("serviceAccount:%s@cloudservices.gserviceaccount.com", var.project_num)]) : [] + container_host_service_agent_user = var.network_project != "" ? concat(local.streamnative_gsa, [format("serviceAccount:service-%s@container-engine-robot.iam.gserviceaccount.com", var.project_num)]) : [] +} + +resource "google_project_iam_member" "network_user" { + count = length(local.comput_network_user_gsa) + project = var.network_project + role = "roles/compute.networkUser" + member = local.comput_network_user_gsa[count.index] + depends_on = [google_project_service.gcp_apis] +} + +resource "google_project_iam_member" "service_agent_user" { + count = length(local.container_host_service_agent_user) + project = var.network_project + role = "roles/container.hostServiceAgentUser" + member = local.container_host_service_agent_user[count.index] + depends_on = [google_project_service.gcp_apis] +} + output "google_services" { - value = local.google_services + value = local.google_services description = "Enabled google services." } output "iam_bindings" { - value = local.iam_bindings + value = local.iam_bindings description = "Configured iam policies." } From 895aded00db2a46a9630cdb6e66d0cf6117a2e91 Mon Sep 17 00:00:00 2001 From: Yisheng Cai Date: Tue, 31 Oct 2023 14:28:14 +0800 Subject: [PATCH 2/7] Add example --- examples/gcp/vendor-access/main.tf | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 examples/gcp/vendor-access/main.tf diff --git a/examples/gcp/vendor-access/main.tf b/examples/gcp/vendor-access/main.tf new file mode 100644 index 0000000..89c2953 --- /dev/null +++ b/examples/gcp/vendor-access/main.tf @@ -0,0 +1,13 @@ +# Grant access +module "sn_managed_cloud" { + source = "github.com/streamnative/terraform-managed-cloud//modules/gcp/vendor-access?ref=v3.8.0" + project = "" +} + +# Grant access when using shared vpc +module "sn_managed_cloud_shared_vpc" { + source = "github.com/streamnative/terraform-managed-cloud//modules/gcp/vendor-access?ref=v3.8.0" + project = "" + project_num = "" + network_project = "" +} \ No newline at end of file From e518ac765dc4915aaf82d7804dde8c292c8929d8 Mon Sep 17 00:00:00 2001 From: Yisheng Cai Date: Tue, 31 Oct 2023 14:33:16 +0800 Subject: [PATCH 3/7] Update README --- modules/gcp/vendor-access/README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/gcp/vendor-access/README.md b/modules/gcp/vendor-access/README.md index 35a72c9..15e9b7e 100644 --- a/modules/gcp/vendor-access/README.md +++ b/modules/gcp/vendor-access/README.md @@ -492,6 +492,9 @@ After [authenticating to your GCP account](https://registry.terraform.io/provide

+### Examples +More examples of the modules can be found in the `examples/gcp/vendor-access` directory. + ## Terraform Docs ### Requirements @@ -514,6 +517,8 @@ No modules. | Name | Type | |------|------| +| [google_project_iam_member.network_user](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/project_iam_member) | resource | +| [google_project_iam_member.service_agent_user](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/project_iam_member) | resource | | [google_project_iam_member.sn_access](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/project_iam_member) | resource | | [google_project_service.gcp_apis](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/project_service) | resource | @@ -522,7 +527,9 @@ No modules. | Name | Description | Type | Default | Required | |------|-------------|------|---------|:--------:| | [extra\_google\_services](#input\_extra\_google\_services) | Extra google API services need to be enabled. | `list(string)` | `[]` | no | -| [project](#input\_project) | The project id of the target project | `string` | n/a | yes | +| [network\_project](#input\_network\_project) | The project id of the network host project. | `string` | `""` | no | +| [project](#input\_project) | The project id of the target project. | `string` | n/a | yes | +| [project\_num](#input\_project\_num) | The project number of the target project, required when configuring network project. | `string` | `""` | no | | [roles](#input\_roles) | The role list will be associated with StreamNative GSA. | `list(string)` |
[
"roles/editor",
"roles/compute.admin",
"roles/compute.loadBalancerAdmin",
"roles/compute.networkAdmin",
"roles/container.admin",
"roles/dns.admin",
"roles/storage.admin",
"roles/iam.serviceAccountAdmin",
"roles/iam.workloadIdentityPoolAdmin",
"roles/resourcemanager.projectIamAdmin"
]
| no | | [streamnative\_support\_access\_gsa](#input\_streamnative\_support\_access\_gsa) | The GSA will be used by StreamnNative support team. | `list(string)` |
[
"cloud-support-general@sncloud-production.iam.gserviceaccount.com"
]
| no | | [streamnative\_vendor\_access\_gsa](#input\_streamnative\_vendor\_access\_gsa) | The GSA will be used by StreamnNative cloud. | `list(string)` |
[
"cloud-manager@sncloud-production.iam.gserviceaccount.com",
"pool-automation@sncloud-production.iam.gserviceaccount.com"
]
| no | From 05bf026e455cea3005e08bdaa3640beb65077af1 Mon Sep 17 00:00:00 2001 From: Yisheng Cai Date: Tue, 31 Oct 2023 20:42:38 +0800 Subject: [PATCH 4/7] Use subnet level iam policy --- modules/gcp/vendor-access/common.tf | 17 +++++++++++++---- modules/gcp/vendor-access/main.tf | 24 +++++++++++++++++++----- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/modules/gcp/vendor-access/common.tf b/modules/gcp/vendor-access/common.tf index b18dde7..6255156 100644 --- a/modules/gcp/vendor-access/common.tf +++ b/modules/gcp/vendor-access/common.tf @@ -4,17 +4,26 @@ variable "project" { } variable "project_num" { - type = string - default = "" + type = string + default = "" description = "The project number of the target project, required when configuring network project." } variable "network_project" { - type = string - default = "" + type = string + default = "" description = "The project id of the network host project." } +variable "shared_vpc_subnets" { + type = list(object({ + region = string + name = string + })) + default = [] + description = "The subnet list shared by network host project." +} + variable "roles" { default = [ "roles/editor", diff --git a/modules/gcp/vendor-access/main.tf b/modules/gcp/vendor-access/main.tf index ecddca6..5d57388 100644 --- a/modules/gcp/vendor-access/main.tf +++ b/modules/gcp/vendor-access/main.tf @@ -43,15 +43,29 @@ resource "google_project_iam_member" "sn_access" { } locals { - comput_network_user_gsa = var.network_project != "" ? concat(local.streamnative_gsa, [format("serviceAccount:%s@cloudservices.gserviceaccount.com", var.project_num)]) : [] - container_host_service_agent_user = var.network_project != "" ? concat(local.streamnative_gsa, [format("serviceAccount:service-%s@container-engine-robot.iam.gserviceaccount.com", var.project_num)]) : [] + comput_network_user_gsa = var.network_project != "" ? concat(local.streamnative_gsa, [format("serviceAccount:%s@cloudservices.gserviceaccount.com", var.project_num)]) : [] + comput_network_user_iam_binding = flatten([ + for subnet in var.shared_vpc_subnets : [ + for gsa in local.comput_network_user_gsa : { + region : subnet.region, + subnet : subnet.name, + member : gsa, + } + ] + ]) + container_host_service_agent_user = var.network_project != "" ? [format("serviceAccount:service-%s@container-engine-robot.iam.gserviceaccount.com", var.project_num)] : [] } -resource "google_project_iam_member" "network_user" { - count = length(local.comput_network_user_gsa) +resource "google_compute_subnetwork_iam_member" "network_user" { + for_each = { + for index, binding in local.comput_network_user_iam_binding : + index => binding + } project = var.network_project + region = each.value.region + subnetwork = each.value.subnet role = "roles/compute.networkUser" - member = local.comput_network_user_gsa[count.index] + member = each.value.member depends_on = [google_project_service.gcp_apis] } From f36ccfbec236caeefeec24987e4bdf9df11e038b Mon Sep 17 00:00:00 2001 From: Yisheng Cai Date: Tue, 31 Oct 2023 20:44:53 +0800 Subject: [PATCH 5/7] Update docs --- examples/gcp/vendor-access/main.tf | 14 +++++++++----- modules/gcp/vendor-access/README.md | 3 ++- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/examples/gcp/vendor-access/main.tf b/examples/gcp/vendor-access/main.tf index 89c2953..bf071fc 100644 --- a/examples/gcp/vendor-access/main.tf +++ b/examples/gcp/vendor-access/main.tf @@ -1,13 +1,17 @@ # Grant access module "sn_managed_cloud" { - source = "github.com/streamnative/terraform-managed-cloud//modules/gcp/vendor-access?ref=v3.8.0" + source = "github.com/streamnative/terraform-managed-cloud//modules/gcp/vendor-access?ref=v3.8.0" project = "" } # Grant access when using shared vpc module "sn_managed_cloud_shared_vpc" { - source = "github.com/streamnative/terraform-managed-cloud//modules/gcp/vendor-access?ref=v3.8.0" - project = "" - project_num = "" + source = "github.com/streamnative/terraform-managed-cloud//modules/gcp/vendor-access?ref=v3.8.0" + project = "" + project_num = "" network_project = "" -} \ No newline at end of file + shared_vpc_subnets = [{ + name = "" + region = "" + }] +} diff --git a/modules/gcp/vendor-access/README.md b/modules/gcp/vendor-access/README.md index 15e9b7e..84a2c13 100644 --- a/modules/gcp/vendor-access/README.md +++ b/modules/gcp/vendor-access/README.md @@ -517,7 +517,7 @@ No modules. | Name | Type | |------|------| -| [google_project_iam_member.network_user](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/project_iam_member) | resource | +| [google_compute_subnetwork_iam_member.network_user](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_subnetwork_iam_member) | resource | | [google_project_iam_member.service_agent_user](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/project_iam_member) | resource | | [google_project_iam_member.sn_access](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/project_iam_member) | resource | | [google_project_service.gcp_apis](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/project_service) | resource | @@ -531,6 +531,7 @@ No modules. | [project](#input\_project) | The project id of the target project. | `string` | n/a | yes | | [project\_num](#input\_project\_num) | The project number of the target project, required when configuring network project. | `string` | `""` | no | | [roles](#input\_roles) | The role list will be associated with StreamNative GSA. | `list(string)` |
[
"roles/editor",
"roles/compute.admin",
"roles/compute.loadBalancerAdmin",
"roles/compute.networkAdmin",
"roles/container.admin",
"roles/dns.admin",
"roles/storage.admin",
"roles/iam.serviceAccountAdmin",
"roles/iam.workloadIdentityPoolAdmin",
"roles/resourcemanager.projectIamAdmin"
]
| no | +| [shared\_vpc\_subnets](#input\_shared\_vpc\_subnets) | The subnet list shared by network host project. |
list(object({
region = string
name = string
}))
| `[]` | no | | [streamnative\_support\_access\_gsa](#input\_streamnative\_support\_access\_gsa) | The GSA will be used by StreamnNative support team. | `list(string)` |
[
"cloud-support-general@sncloud-production.iam.gserviceaccount.com"
]
| no | | [streamnative\_vendor\_access\_gsa](#input\_streamnative\_vendor\_access\_gsa) | The GSA will be used by StreamnNative cloud. | `list(string)` |
[
"cloud-manager@sncloud-production.iam.gserviceaccount.com",
"pool-automation@sncloud-production.iam.gserviceaccount.com"
]
| no | From 068f52d387b8b20c4d8b7a8ee34b0022d74d7e5b Mon Sep 17 00:00:00 2001 From: Yisheng Cai Date: Sun, 6 Oct 2024 16:51:20 -0600 Subject: [PATCH 6/7] Remove project permissions --- modules/gcp/vendor-access/main.tf | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/modules/gcp/vendor-access/main.tf b/modules/gcp/vendor-access/main.tf index 5d57388..f8390e2 100644 --- a/modules/gcp/vendor-access/main.tf +++ b/modules/gcp/vendor-access/main.tf @@ -31,16 +31,16 @@ resource "google_project_service" "gcp_apis" { service = local.google_services[count.index] } -resource "google_project_iam_member" "sn_access" { - for_each = { - for index, binding in local.iam_bindings : - index => binding - } - project = var.project - role = each.value.role - member = each.value.member - depends_on = [google_project_service.gcp_apis] -} +# resource "google_project_iam_member" "sn_access" { +# for_each = { +# for index, binding in local.iam_bindings : +# index => binding +# } +# project = var.project +# role = each.value.role +# member = each.value.member +# depends_on = [google_project_service.gcp_apis] +# } locals { comput_network_user_gsa = var.network_project != "" ? concat(local.streamnative_gsa, [format("serviceAccount:%s@cloudservices.gserviceaccount.com", var.project_num)]) : [] From dd61677cae7d3c177a4aed30200a01d6222a20df Mon Sep 17 00:00:00 2001 From: Yisheng Cai Date: Sun, 6 Oct 2024 17:09:16 -0600 Subject: [PATCH 7/7] Fix gke permissions --- modules/gcp/vendor-access/main.tf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/gcp/vendor-access/main.tf b/modules/gcp/vendor-access/main.tf index f8390e2..b542e74 100644 --- a/modules/gcp/vendor-access/main.tf +++ b/modules/gcp/vendor-access/main.tf @@ -43,17 +43,17 @@ resource "google_project_service" "gcp_apis" { # } locals { - comput_network_user_gsa = var.network_project != "" ? concat(local.streamnative_gsa, [format("serviceAccount:%s@cloudservices.gserviceaccount.com", var.project_num)]) : [] + comput_network_user_gsa = var.network_project != "" ? concat(local.streamnative_gsa, [format("serviceAccount:%s@cloudservices.gserviceaccount.com", var.project_num)]) : [] + container_host_service_agent_user = var.network_project != "" ? [format("serviceAccount:service-%s@container-engine-robot.iam.gserviceaccount.com", var.project_num)] : [] comput_network_user_iam_binding = flatten([ for subnet in var.shared_vpc_subnets : [ - for gsa in local.comput_network_user_gsa : { + for gsa in concat(local.comput_network_user_gsa, local.container_host_service_agent_user) : { region : subnet.region, subnet : subnet.name, member : gsa, } ] ]) - container_host_service_agent_user = var.network_project != "" ? [format("serviceAccount:service-%s@container-engine-robot.iam.gserviceaccount.com", var.project_num)] : [] } resource "google_compute_subnetwork_iam_member" "network_user" {