tools/mc2bq/terraform/main.tf (107 lines of code) (raw):
// Copyright 2023 Google LLC All Rights Reserved.
//
// 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.
terraform {
required_providers {
google = {
source = "hashicorp/google"
version = "4.51.0"
}
}
}
locals {
target_project = var.target_project != "" ? var.target_project : var.project
mc2bq_cloud_run_image = var.mc2bq_cloud_run_image != "" ? var.mc2bq_cloud_run_image : "gcr.io/${var.project}/mc2bq:latest"
}
provider "google" {
project = var.project
region = var.region
}
resource "google_service_account" "mc2bq_sync_trigger_sa" {
account_id = "mc2bq-cloud-run-sync-trigger"
display_name = "MC2BQ Cloud Run Sync Trigger"
description = "Service account created to trigger the Migration Center to BigQuery cloud run sync job"
project = var.project
}
resource "google_project_iam_member" "mc2bq_sync_trigger_sa_run_invoker" {
project = var.project
role = "roles/run.invoker"
member = "serviceAccount:${google_service_account.mc2bq_sync_trigger_sa.email}"
}
resource "google_service_account" "mc2bq_sync_sa" {
account_id = "mc2bq-cloud-run-sync"
display_name = "MC2BQ Cloud Run Sync"
description = "Service account created for Migration Center to BigQuery cloud run sync job"
project = var.project
}
resource "google_project_iam_member" "mc2bq_cloud_run_bq_editor_binding" {
project = var.project
role = "roles/bigquery.dataEditor"
member = "serviceAccount:${google_service_account.mc2bq_sync_sa.email}"
}
resource "google_project_iam_member" "mc2bq_cloud_run_bq_job_user_binding" {
project = var.project
role = "roles/bigquery.jobUser"
member = "serviceAccount:${google_service_account.mc2bq_sync_sa.email}"
}
resource "google_project_iam_member" "mc2bq_cloud_run_mc_viewer_binding" {
project = var.project
role = "roles/migrationcenter.viewer"
member = "serviceAccount:${google_service_account.mc2bq_sync_sa.email}"
}
resource "google_cloud_run_v2_job" "mc2bq_cloud_run_sync_job" {
name = "mc2bq-sync"
location = var.region
template {
parallelism = 1
task_count = 1
template {
service_account = google_service_account.mc2bq_sync_sa.account_id
timeout = "1800s" // 30m
containers {
image = local.mc2bq_cloud_run_image
args = concat([
"-force",
"-target-project", local.target_project,
"-region", var.region,
var.project,
var.dataset
], var.table_prefix == "" ? [] : [var.table_prefix])
}
}
}
lifecycle {
ignore_changes = [
launch_stage,
]
}
}
resource "google_cloud_scheduler_job" "mc2bq_sync_scheduled_job" {
name = "mc2bq-sync"
description = "MC2BQ sync"
schedule = var.mc2bq_sync_schedule
time_zone = var.mc2bq_sync_schedule_timezone
project = var.project
region = var.region
http_target {
http_method = "POST"
uri = "https://${var.region}-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/${google_cloud_run_v2_job.mc2bq_cloud_run_sync_job.project}/jobs/${google_cloud_run_v2_job.mc2bq_cloud_run_sync_job.name}:run"
headers = {
"User-Agent": "Google-Cloud-Scheduler"
}
oauth_token {
service_account_email = google_service_account.mc2bq_sync_trigger_sa.email
scope = "https://www.googleapis.com/auth/cloud-platform"
}
}
}