terraform/modules/gitlab_aws_instance/main.tf (92 lines of code) (raw):
terraform {
required_version = ">= 1.9"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.59"
}
}
}
locals {
instance_names = [
for index in range(var.node_count) : "${var.prefix}-${var.node_type}-${index + 1}"
]
}
resource "aws_instance" "gitlab" {
count = var.node_count
instance_type = var.instance_type
ami = var.ami_id
key_name = var.ssh_key_name
vpc_security_group_ids = var.security_group_ids
iam_instance_profile = length(var.iam_instance_policy_arns) > 0 ? aws_iam_instance_profile.gitlab[0].name : null
user_data_base64 = var.user_data_base64
subnet_id = var.subnet_ids != null ? element(tolist(var.subnet_ids), count.index) : null
root_block_device {
volume_type = var.disk_type
volume_size = var.disk_size
iops = var.disk_iops
encrypted = var.disk_encrypt
kms_key_id = var.disk_kms_key_arn
delete_on_termination = var.disk_delete_on_termination
## TODO: additional_tags is deprecated and will be removed in 4.x
tags = merge({
Name = "${var.prefix}-${var.node_type}-${count.index + 1}-root"
}, var.additional_tags, var.custom_tags)
}
# Enforce IMDSv2 - https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance#metadata-options
metadata_options {
http_endpoint = "enabled"
http_tokens = "required"
http_put_response_hop_limit = 1
instance_metadata_tags = "enabled"
}
## TODO: additional_tags is deprecated and will be removed in 4.x
tags = merge({
Name = local.instance_names[count.index]
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_tags, var.custom_tags)
lifecycle {
ignore_changes = [
ami,
root_block_device[0].encrypted,
root_block_device[0].kms_key_id
]
}
}
# Elastic IP Association
resource "aws_eip_association" "gitlab" {
count = length(var.elastic_ip_allocation_ids)
instance_id = aws_instance.gitlab[count.index].id
allocation_id = var.elastic_ip_allocation_ids[count.index]
}
# IAM Instance Profile
resource "aws_iam_instance_profile" "gitlab" {
count = var.node_count > 0 && length(var.iam_instance_policy_arns) > 0 ? 1 : 0
name = "${var.prefix}-${var.node_type}-profile"
path = var.iam_identifier_path
role = aws_iam_role.gitlab[0].name
}
resource "aws_iam_role" "gitlab" {
count = var.node_count > 0 && length(var.iam_instance_policy_arns) > 0 ? 1 : 0
name = "${var.prefix}-${var.node_type}-role"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Action = "sts:AssumeRole"
Effect = "Allow"
Sid = ""
Principal = {
Service = "ec2.amazonaws.com"
}
},
]
})
path = var.iam_identifier_path
permissions_boundary = var.iam_permissions_boundary_arn
}
resource "aws_iam_role_policy_attachment" "gitlab" {
count = var.node_count > 0 ? length(var.iam_instance_policy_arns) : 0
role = aws_iam_role.gitlab[0].name
policy_arn = var.iam_instance_policy_arns[count.index]
}