4-projects/modules/infra_pipelines/main.tf (110 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.
*/
locals {
cloudbuild_bucket_name = "${var.cloudbuild_project_id}_cloudbuild"
workspace_sa_email = { for k, v in module.tf_workspace : k => element(split("/", v.cloudbuild_sa), length(split("/", v.cloudbuild_sa)) - 1) }
gar_project_id = split("/", var.cloud_builder_artifact_repo)[1]
gar_region = split("/", var.cloud_builder_artifact_repo)[3]
gar_name = split("/", var.cloud_builder_artifact_repo)[length(split("/", var.cloud_builder_artifact_repo)) - 1]
created_csrs = toset([for repo in google_sourcerepo_repository.app_infra_repo : repo.name])
artifact_buckets = { for k, ws in module.tf_workspace : k => split("/", ws.artifacts_bucket)[length(split("/", ws.artifacts_bucket)) - 1] }
state_buckets = { for k, ws in module.tf_workspace : k => split("/", ws.state_bucket)[length(split("/", ws.state_bucket)) - 1] }
log_buckets = { for k, ws in module.tf_workspace : k => split("/", ws.logs_bucket)[length(split("/", ws.logs_bucket)) - 1] }
plan_triggers_id = [for ws in module.tf_workspace : ws.cloudbuild_plan_trigger_id]
apply_triggers_id = [for ws in module.tf_workspace : ws.cloudbuild_apply_trigger_id]
}
# Create CSRs
resource "google_sourcerepo_repository" "app_infra_repo" {
for_each = toset(var.app_infra_repos)
project = var.cloudbuild_project_id
name = each.value
}
resource "google_sourcerepo_repository" "gcp_policies" {
project = var.cloudbuild_project_id
name = "gcp-policies"
}
resource "google_storage_bucket" "cloudbuild_bucket" {
project = var.cloudbuild_project_id
name = local.cloudbuild_bucket_name
location = var.default_region
uniform_bucket_level_access = true
force_destroy = true
versioning {
enabled = true
}
}
module "tf_workspace" {
source = "terraform-google-modules/bootstrap/google//modules/tf_cloudbuild_workspace"
version = "~> 6.4"
for_each = toset(var.app_infra_repos)
project_id = var.cloudbuild_project_id
location = var.default_region
# using bucket custom names for compliance with bucket naming conventions
create_state_bucket = true
create_state_bucket_name = "${var.bucket_prefix}-${var.cloudbuild_project_id}-${each.key}-state"
log_bucket_name = "${var.bucket_prefix}-${var.cloudbuild_project_id}-${each.key}-logs"
artifacts_bucket_name = "${var.bucket_prefix}-${var.cloudbuild_project_id}-${each.key}-artifacts"
cloudbuild_plan_filename = "cloudbuild-tf-plan.yaml"
cloudbuild_apply_filename = "cloudbuild-tf-apply.yaml"
enable_worker_pool = true
worker_pool_id = var.private_worker_pool_id
tf_repo_uri = google_sourcerepo_repository.app_infra_repo[each.key].url
create_cloudbuild_sa = true
create_cloudbuild_sa_name = "sa-tf-cb-${each.key}"
diff_sa_project = true
buckets_force_destroy = true
substitutions = {
"_BILLING_ID" = var.billing_account
"_GAR_REGION" = local.gar_region
"_GAR_PROJECT_ID" = local.gar_project_id
"_GAR_REPOSITORY" = local.gar_name
"_DOCKER_TAG_VERSION_TERRAFORM" = var.terraform_docker_tag_version
}
tf_apply_branches = ["development", "non\\-production", "production", "shared"]
depends_on = [
google_sourcerepo_repository.app_infra_repo,
]
}
/***********************************************
Cloud Build - IAM
***********************************************/
resource "google_artifact_registry_repository_iam_member" "terraform-image-iam" {
provider = google-beta
for_each = toset(var.app_infra_repos)
project = local.gar_project_id
location = local.gar_region
repository = local.gar_name
role = "roles/artifactregistry.reader"
member = "serviceAccount:${local.workspace_sa_email[each.key]}"
}
resource "google_storage_bucket_iam_member" "tf_state" {
for_each = toset(var.app_infra_repos)
bucket = var.remote_tfstate_bucket
role = "roles/storage.objectViewer"
member = "serviceAccount:${local.workspace_sa_email[each.key]}"
}
// Required by gcloud beta terraform vet
resource "google_organization_iam_member" "browser" {
for_each = toset(var.app_infra_repos)
org_id = var.org_id
role = "roles/browser"
member = "serviceAccount:${local.workspace_sa_email[each.key]}"
}
resource "google_sourcerepo_repository_iam_member" "member" {
for_each = toset(var.app_infra_repos)
project = google_sourcerepo_repository.gcp_policies.project
repository = google_sourcerepo_repository.gcp_policies.name
role = "roles/viewer"
member = "serviceAccount:${local.workspace_sa_email[each.key]}"
}