1-foundations/02-api-connector.tf (173 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
#
# https://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.
resource "google_bigquery_connection" "load-connection-bq-0" {
depends_on = [module.load-project]
project = module.load-project.project_id
connection_id = "load-connection-bq-0"
location = "US"
cloud_resource {}
}
resource "google_project_iam_binding" "load-0-grant-bq-connection-run-invoker" {
depends_on = [module.load-project]
for_each = toset([
"roles/cloudfunctions.invoker",
"roles/run.invoker",
])
project = module.load-project.project_id
role = each.key
members = [
"serviceAccount:${google_bigquery_connection.load-connection-bq-0.cloud_resource[0].service_account_id}"
]
}
resource "google_service_account" "load-0-api-sa" {
depends_on = [module.load-project]
project = module.load-project.project_id
account_id = "load-0-api-sa"
display_name = "SA used to API load data"
}
resource "google_project_iam_member" "load-0-api-sa-iam" {
for_each = toset([
"roles/iam.serviceAccountUser",
"roles/bigquery.admin",
"roles/cloudtasks.queueAdmin",
"roles/cloudtasks.viewer",
"roles/secretmanager.secretAccessor"
])
project = module.load-project.project_id
role = each.key
member = "serviceAccount:${google_service_account.load-0-api-sa.email}"
}
resource "google_bigquery_routine" "dwh-load-bq-remote-fnc-0" {
depends_on = [google_service_account.load-0-api-sa, module.dwh-load-bq-0, module.load-0-api-fnc]
project = module.load-project.project_id
dataset_id = module.dwh-load-bq-0.dataset_id
routine_id = "routine_execute_api_fnc"
routine_type = "SCALAR_FUNCTION"
definition_body = ""
arguments {
name = "workflow_id"
data_type = "{\"typeKind\" : \"STRING\"}"
}
arguments {
name = "request_config"
data_type = "{\"typeKind\" : \"STRING\"}"
}
arguments {
name = "auth"
data_type = "{\"typeKind\" : \"STRING\"}"
}
arguments {
name = "headers"
data_type = "{\"typeKind\" : \"STRING\"}"
}
arguments {
name = "query_string"
data_type = "{\"typeKind\" : \"STRING\"}"
}
arguments {
name = "body"
data_type = "{\"typeKind\" : \"STRING\"}"
}
arguments {
name = "result_table"
data_type = "{\"typeKind\" : \"STRING\"}"
}
arguments {
name = "queue_name"
data_type = "{\"typeKind\" : \"STRING\"}"
}
return_type = jsonencode({
typeKind : "JSON"
})
remote_function_options {
max_batching_rows = "10"
endpoint = module.load-0-api-fnc.uri
connection = google_bigquery_connection.load-connection-bq-0.name
}
}
resource "random_id" "default" {
byte_length = 8
}
resource "google_service_account" "load-0-api-fnc-runner-sa" {
project = module.load-project.project_id
account_id = "api-load-runner-sa"
display_name = "A service account to run the load API function"
}
output "load-0-api-load-runner-sa" {
value = google_service_account.load-0-api-fnc-runner-sa.email
}
resource "google_service_account" "data-workflow-trigger-api-fnc-runner-sa" {
project = module.load-project.project_id
account_id = "workflow-trigger-api-fnc-sa"
display_name = "A service account to run the data-workflow-trigger API function"
}
resource "google_project_iam_member" "load-0-api-fnc-runner-sa-iam" {
for_each = toset([
"roles/cloudtasks.enqueuer",
"roles/iam.serviceAccountUser",
"roles/secretmanager.secretAccessor",
"roles/bigquery.dataEditor",
])
project = module.load-project.project_id
role = each.key
member = "serviceAccount:${google_service_account.load-0-api-fnc-runner-sa.email}"
}
resource "google_service_account" "load-0-api-fnc-invoker-sa" {
project = module.load-project.project_id
account_id = "api-src-fnc-sa-invoker"
display_name = "A service account to invoke the load API function"
}
resource "google_project_iam_member" "load-0-api-fnc-invoker-sa-iam" {
for_each = toset([
"roles/iam.serviceAccountUser",
"roles/cloudfunctions.invoker",
"roles/run.invoker"
])
project = module.load-project.project_id
role = each.key
member = "serviceAccount:${google_service_account.load-0-api-fnc-invoker-sa.email}"
}
resource "google_storage_bucket_object" "load-config-for-templated-dag" {
depends_on = [module.load-cs-df-0]
name = "api-connector/config.json"
bucket = module.load-cs-df-0.name
source = "${path.root}/../config/api-connector/config.json"
content_type = "application/json; charset=UTF-8"
}
module "load-0-api-fnc" {
depends_on = [module.load-project, google_service_account.load-0-api-fnc-runner-sa]
source = "github.com/GoogleCloudPlatform/cloud-foundation-fabric//modules/cloud-function-v2?ref=v36.0.1"
project_id = module.load-project.project_id
name = "load-0-api-fnc"
region = local.config.region
ingress_settings = "ALLOW_ALL"
bucket_name = "api-src-${random_id.default.hex}"
bucket_config = {
path = "load-process/"
force_destroy = true
lifecycle_delete_age_days = 1
}
bundle_config = {
path = "../api-connector/"
}
iam = {
"roles/run.invoker" = ["allUsers"]
}
function_config = {
entry_point = "main"
instance_count = 100
cpu = 1
memory = 128
runtime = "python310"
timeout = 480 # Timeout in seconds, increase it if your CF timeouts.
}
environment_variables = {
PROJECT_NUMBER = module.load-project.number
PROJECT_ID = module.load-project.project_id
FUNCTION_NAME = "load-0-api-fnc"
REGION = local.config.region
PUBSUB_TOPICS = jsonencode([for ps in module.transf-ps-0 : {
replace(replace(ps.topic.name, "${local.config.resource-prefix}-", ""), "-trf-ps-0", "") = ps.topic.id
}])
}
service_account = google_service_account.load-0-api-fnc-runner-sa.email
service_account_create = false
}