terraform/modules/sap-pre-reqs/main.tf (115 lines of code) (raw):

/** * Copyright 2021 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. */ provider "google" {} # Get subnetwork details data "google_compute_subnetwork" "subnetwork" { name = var.subnetwork region = local.region project = local.subnetwork_project } # IAM policy for host project in shared VPC resource "google_project_iam_member" "project_net_user" { count = local.subnetwork_project != var.project_id ? 1 : 0 project = local.subnetwork_project role = "roles/compute.networkUser" member = "serviceAccount:${google_service_account.sap_service_account.email}" } resource "google_project_iam_member" "project_net_admin" { count = local.subnetwork_project != var.project_id ? 1 : 0 project = local.subnetwork_project role = "roles/compute.networkAdmin" member = "serviceAccount:${google_service_account.sap_service_account.email}" } resource "google_project_iam_member" "project_sec_admin" { count = local.subnetwork_project != var.project_id ? 1 : 0 project = local.subnetwork_project role = "roles/compute.securityAdmin" member = "serviceAccount:${google_service_account.sap_service_account.email}" } resource "random_id" "server" { byte_length = 2 } resource "google_project_service" "enable_iam" { project = var.project_id service = "iam.googleapis.com" disable_dependent_services = true disable_on_destroy = false } resource "google_service_account" "sap_service_account" { project = var.project_id account_id = var.sap_service_account_name == "" ? "sap-common-sa-${random_id.server.hex}" : var.sap_service_account_name display_name = "SAP Common Service Account for Hana and Netweaver" } resource "google_project_iam_member" "sap_sa_iam_mem_service" { for_each = toset([ "roles/compute.admin", "roles/compute.instanceAdmin.v1", "roles/compute.networkUser", "roles/compute.securityAdmin", "roles/iam.serviceAccountCreator", "roles/iam.serviceAccountUser", "roles/compute.networkAdmin", "roles/source.reader", "roles/storage.objectAdmin", ]) project = var.project_id role = each.value member = "serviceAccount:${google_service_account.sap_service_account.email}" } resource "google_compute_project_metadata_item" "vm_dns_setting" { project = var.project_id key = "VmDnsSetting" value = "ZonalPreferred" } # Create firewall rule to allow communication b/w instances in subnet resource "google_compute_firewall" "sap_firewall_all" { project = local.subnetwork_project name = "sap-allow-all-${random_id.server.hex}" network = local.network source_ranges = [data.google_compute_subnetwork.subnetwork.ip_cidr_range] target_tags = var.network_tags allow { protocol = "all" } } # Create firewall rule to allow AWX to connect to instances resource "google_compute_firewall" "sap_firewall_awx" { project = local.subnetwork_project name = "sap-allow-awx-ssh-${random_id.server.hex}" network = local.network source_tags = ["awx"] target_tags = var.network_tags allow { protocol = "tcp" ports = [22] } } # Create NAT for outside connectivity resource "google_compute_router" "router" { count = var.nat_create == true ? 1 : 0 project = local.subnetwork_project name = "router-${random_id.server.hex}" region = local.region network = local.network } resource "google_compute_router_nat" "nat" { count = var.nat_create == true ? 1 : 0 project = local.subnetwork_project name = "router-nat-${random_id.server.hex}" router = google_compute_router.router[count.index].name region = local.region nat_ip_allocate_option = "AUTO_ONLY" source_subnetwork_ip_ranges_to_nat = "LIST_OF_SUBNETWORKS" subnetwork { name = "projects/${local.subnetwork_project}/regions/${local.region}/subnetworks/${var.subnetwork}" source_ip_ranges_to_nat = ["ALL_IP_RANGES"] } }