modules/secure-cloud-function/main.tf (130 lines of code) (raw):
/**
* Copyright 2023 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 "cloud_serverless_network" {
source = "GoogleCloudPlatform/cloud-run/google//modules/secure-serverless-net"
version = "~> 0.12.0"
connector_name = var.connector_name
subnet_name = var.subnet_name
enable_load_balancer_fw = "false"
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.cloudfunction_sa.email
}
data "google_service_account" "cloud_serverless_sa" {
account_id = var.service_account_email
}
resource "google_service_account_iam_member" "identity_service_account_user" {
service_account_id = data.google_service_account.cloud_serverless_sa.name
role = "roles/iam.serviceAccountUser"
member = "serviceAccount:${google_project_service_identity.cloudfunction_sa.email}"
}
resource "google_project_service_identity" "eventarc_sa" {
provider = google-beta
project = var.serverless_project_id
service = "eventarc.googleapis.com"
}
resource "google_project_service_identity" "cloudfunction_sa" {
provider = google-beta
project = var.serverless_project_id
service = "cloudfunctions.googleapis.com"
}
resource "google_project_service_identity" "artifact_sa" {
provider = google-beta
project = var.serverless_project_id
service = "artifactregistry.googleapis.com"
}
data "google_storage_project_service_account" "gcs_account" {
project = var.serverless_project_id
}
resource "google_project_service_identity" "pubsub_sa" {
provider = google-beta
project = var.serverless_project_id
service = "pubsub.googleapis.com"
}
module "cloud_function_security" {
source = "../secure-cloud-function-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.cloudfunction_sa.email}",
"serviceAccount:${var.service_account_email}",
"serviceAccount:${google_project_service_identity.artifact_sa.email}",
"serviceAccount:${google_project_service_identity.eventarc_sa.email}",
"serviceAccount:${data.google_storage_project_service_account.gcs_account.email_address}",
"serviceAccount:${google_project_service_identity.pubsub_sa.email}"
]
decrypters = [
"serviceAccount:${google_project_service_identity.cloudfunction_sa.email}",
"serviceAccount:${var.service_account_email}",
"serviceAccount:${google_project_service_identity.artifact_sa.email}",
"serviceAccount:${google_project_service_identity.eventarc_sa.email}",
"serviceAccount:${data.google_storage_project_service_account.gcs_account.email_address}",
"serviceAccount:${google_project_service_identity.pubsub_sa.email}"
]
}
module "cloud_function_core" {
source = "../secure-cloud-function-core"
function_name = var.function_name
function_description = var.function_description
project_id = var.serverless_project_id
project_number = var.serverless_project_number
labels = var.labels
location = var.location
runtime = var.runtime
entry_point = var.entry_point
repo_source = var.repo_source
storage_source = var.storage_source
build_environment_variables = var.build_environment_variables
event_trigger = var.event_trigger
force_destroy = !var.prevent_destroy
encryption_key = module.cloud_function_security.key_self_link
bucket_lifecycle_rules = var.bucket_lifecycle_rules
bucket_cors = var.bucket_cors
network_id = var.network_id
service_config = {
max_instance_count = var.max_scale_instances
min_instance_count = var.min_scale_instances
available_memory = var.available_memory_mb
timeout_seconds = var.timeout_seconds
vpc_connector = module.cloud_serverless_network.connector_id
service_account_email = var.service_account_email
ingress_settings = var.ingress_settings
all_traffic_on_latest_revision = var.all_traffic_on_latest_revision
vpc_connector_egress_settings = var.vpc_egress_value
runtime_env_variables = var.environment_variables
runtime_secret_env_variables = var.secret_environment_variables
secret_volumes = var.secret_volumes
}
depends_on = [
google_service_account_iam_member.identity_service_account_user
]
}