terraform/modules/gitlab_gcp_instance/main.tf (131 lines of code) (raw):
terraform {
required_version = ">= 1.9"
required_providers {
google = {
source = "hashicorp/google"
version = "~> 6.0"
}
}
}
resource "google_compute_instance" "gitlab" {
count = var.node_count
name = "${local.name_prefix}-${count.index + 1}"
machine_type = var.machine_type
tags = distinct(concat([var.prefix, var.node_type, "${var.prefix}-${var.node_type}"], var.tags))
zone = var.zones == null ? null : element(var.zones, count.index)
allow_stopping_for_update = var.allow_stopping_for_update
shielded_instance_config {
enable_secure_boot = var.machine_secure_boot
}
# TODO: var.additional_labels is deprecated and will be removed in 4.x
boot_disk {
initialize_params {
image = var.machine_image
size = var.disk_size
type = var.disk_type
labels = merge(var.additional_labels, var.custom_labels)
}
kms_key_self_link = var.disk_kms_key
}
metadata = merge({
enable-oslogin = "TRUE"
}, var.custom_metadata)
# TODO: var.additional_labels is deprecated and will be removed in 4.x
labels = merge({
gitlab_node_prefix = var.prefix
gitlab_node_type = var.node_type
gitlab_node_level = var.label_secondaries == true ? (count.index == 0 ? "${var.node_type}-primary" : "${var.node_type}-secondary") : null
gitlab_geo_site = var.geo_site
gitlab_geo_deployment = var.geo_deployment
gitlab_geo_full_role = var.geo_site == null ? null : (count.index == 0 ? "${var.geo_site}-${var.node_type}-primary" : "${var.geo_site}-${var.node_type}-secondary")
}, var.additional_labels, var.custom_labels)
network_interface {
network = var.vpc
subnetwork = var.subnet
dynamic "access_config" {
# Dynamic block is used here to be able to completely omit it if not needed.
for_each = var.setup_external_ip ? [local.external_ips[count.index]] : []
content {
nat_ip = access_config.value
}
}
}
service_account {
email = module.google_service_account[0].email
scopes = var.service_account_iam_scopes
}
dynamic "attached_disk" {
for_each = var.disks
content {
source = google_compute_disk.gitlab["${attached_disk.value["device_name"]}-${count.index}"].self_link
device_name = attached_disk.value["device_name"]
}
}
lifecycle {
ignore_changes = [
min_cpu_platform,
boot_disk,
]
}
}
locals {
name_prefix = var.name_override == null ? "${var.prefix}-${var.node_type}" : var.name_override
external_ips = length(var.external_ips) == 0 ? google_compute_address.gitlab[*].address : var.external_ips
node_data_disks = flatten([
for i in range(var.node_count) :
[
for data_disk in var.disks : {
device_name = data_disk.device_name
size = coalesce(data_disk.size, var.disk_size)
type = coalesce(data_disk.type, var.disk_type)
node_num = i
zone = var.zones == null ? null : element(var.zones, i)
snapshot = try(data_disk.source_snapshots["${local.name_prefix}-${data_disk.device_name}-${i}"], null)
snapshot_kms_key = try(data_disk.source_snapshot_kms_key, null)
}
]
])
}
module "google_service_account" {
source = "../gitlab_gcp_service_account"
count = min(var.node_count, 1)
# Create
account_id = "${var.service_account_prefix}-${var.node_type}"
display_name = local.name_prefix
service_account_profiles = var.service_account_profiles
setup_default_service_account_user_member = length(var.service_account_user_members) == 0 ? true : false
service_account_user_members = var.service_account_user_members
# Custom
custom_service_account_email = var.custom_service_account_email
}
## Data Disks
## TODO: var.additional_labels is deprecated and will be removed in 4.x
resource "google_compute_disk" "gitlab" {
for_each = { for d in local.node_data_disks : "${d.device_name}-${d.node_num}" => d }
name = "${local.name_prefix}-${each.value.device_name}-${each.value.node_num}"
type = each.value.type
size = each.value.size
zone = each.value.zone
labels = merge(var.additional_labels, var.custom_labels)
dynamic "disk_encryption_key" {
for_each = range(var.disk_kms_key != null ? 1 : 0)
content {
kms_key_self_link = var.disk_kms_key
}
}
snapshot = each.value.snapshot
dynamic "source_snapshot_encryption_key" {
for_each = range(each.value.snapshot != null && each.value.snapshot_kms_key != null ? 1 : 0)
content {
kms_key_self_link = each.value.snapshot_kms_key
}
}
lifecycle {
ignore_changes = [
disk_encryption_key[0].kms_key_self_link,
snapshot,
source_snapshot_encryption_key[0].kms_key_self_link
]
}
}
## External IP
resource "google_compute_address" "gitlab" {
count = length(var.external_ips) == 0 && var.setup_external_ip ? var.node_count : 0
name = "${local.name_prefix}-ip-${count.index + 1}"
}
## Refactors
moved {
from = google_service_account.gitlab
to = module.google_service_account[0].google_service_account.gitlab
}