modules/secure-cloud-run/main.tf (131 lines of code) (raw):
/**
* Copyright 2022 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
module "serverless_project_apis" {
source = "terraform-google-modules/project-factory/google//modules/project_services"
version = "~> 17.0"
project_id = var.serverless_project_id
disable_services_on_destroy = false
activate_apis = [
"vpcaccess.googleapis.com",
"compute.googleapis.com",
"container.googleapis.com",
"run.googleapis.com",
"cloudkms.googleapis.com"
]
}
module "vpc_project_apis" {
source = "terraform-google-modules/project-factory/google//modules/project_services"
version = "~> 17.0"
project_id = var.vpc_project_id
disable_services_on_destroy = false
activate_apis = [
"vpcaccess.googleapis.com",
"compute.googleapis.com"
]
}
module "cloud_run_network" {
source = "../secure-serverless-net"
connector_name = var.connector_name
subnet_name = var.subnet_name
location = var.location
vpc_project_id = var.vpc_project_id
serverless_project_id = var.serverless_project_id
shared_vpc_name = var.shared_vpc_name
connector_on_host_project = false
ip_cidr_range = var.ip_cidr_range
create_subnet = var.create_subnet
resource_names_suffix = var.resource_names_suffix
serverless_service_identity_email = google_project_service_identity.serverless_sa.email
depends_on = [
module.vpc_project_apis
]
}
resource "google_project_service_identity" "serverless_sa" {
provider = google-beta
project = var.serverless_project_id
service = "run.googleapis.com"
}
resource "google_artifact_registry_repository_iam_member" "artifact_registry_iam" {
count = var.grant_artifact_register_reader ? 1 : 0
project = var.artifact_registry_repository_project_id
location = var.artifact_registry_repository_location
repository = var.artifact_registry_repository_name
role = "roles/artifactregistry.reader"
member = "serviceAccount:${google_project_service_identity.serverless_sa.email}"
}
data "google_service_account" "cloud_run_sa" {
account_id = var.cloud_run_sa
}
resource "google_service_account_iam_member" "identity_service_account_user" {
service_account_id = data.google_service_account.cloud_run_sa.name
role = "roles/iam.serviceAccountUser"
member = "serviceAccount:${google_project_service_identity.serverless_sa.email}"
}
module "cloud_run_security" {
source = "../secure-cloud-run-security"
kms_project_id = var.kms_project_id
location = var.location
serverless_project_id = var.serverless_project_id
prevent_destroy = var.prevent_destroy
key_name = var.key_name
keyring_name = var.keyring_name
key_rotation_period = var.key_rotation_period
key_protection_level = var.key_protection_level
policy_for = var.policy_for
folder_id = var.folder_id
organization_id = var.organization_id
groups = var.groups
encrypters = [
"serviceAccount:${google_project_service_identity.serverless_sa.email}",
"serviceAccount:${var.cloud_run_sa}"
]
decrypters = [
"serviceAccount:${google_project_service_identity.serverless_sa.email}",
"serviceAccount:${var.cloud_run_sa}"
]
}
resource "google_project_iam_member" "serverless_service_agent" {
project = var.serverless_project_id
role = "roles/run.serviceAgent"
member = "serviceAccount:${google_project_service_identity.serverless_sa.email}"
}
module "cloud_run_core" {
source = "../secure-cloud-run-core"
service_name = var.service_name
location = var.location
project_id = var.serverless_project_id
image = var.image
cloud_run_sa = var.cloud_run_sa
vpc_connector_id = module.cloud_run_network.connector_id
encryption_key = module.cloud_run_security.key_self_link
env_vars = var.env_vars
members = var.members
region = var.region
verified_domain_name = var.verified_domain_name
create_cloud_armor_policies = var.create_cloud_armor_policies
cloud_armor_policies_name = var.cloud_armor_policies_name
vpc_egress_value = var.vpc_egress_value
min_scale_instances = var.min_scale_instances
max_scale_instances = var.max_scale_instances
volumes = var.volumes
ssl_certificates = var.ssl_certificates
depends_on = [
module.serverless_project_apis,
google_artifact_registry_repository_iam_member.artifact_registry_iam,
google_service_account_iam_member.identity_service_account_user,
google_project_iam_member.serverless_service_agent
]
}