deploy-templates/aws/instance.tf (131 lines of code) (raw):

resource "aws_kms_key" "vault" { description = "Vault unseal key" deletion_window_in_days = 10 tags = merge(local.tags, { "Name" = "platform-vault-${var.cluster_name}" }) } resource "aws_instance" "vault" { ami = data.aws_ami.ubuntu.id instance_type = "t2.micro" subnet_id = aws_subnet.public_subnet.id key_name = aws_key_pair.main.key_name monitoring = "false" vpc_security_group_ids = [ aws_security_group.vault.id, aws_security_group.custom.id, ] ebs_optimized = false iam_instance_profile = aws_iam_instance_profile.vault-kms-unseal.id tags = merge(local.tags, { "Name" = "platform-vault-${var.cluster_name}" }) user_data = data.template_file.vault.rendered } resource "aws_security_group" "custom" { name = "vault-kms-unseal-${var.cluster_name}-custom" description = "Custom vault access" vpc_id = aws_vpc.vpc.id tags = merge(local.tags, { "Name" = "platform-vault-${var.cluster_name}-custom" }) # SSH ingress { from_port = 22 to_port = 22 protocol = "tcp" cidr_blocks = var.custom_ingress_rules_cidrs } # Vault Client Traffic ingress { from_port = 8200 to_port = 8200 protocol = "tcp" cidr_blocks = var.custom_ingress_rules_cidrs } ingress { from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = var.custom_ingress_rules_cidrs } } resource "aws_security_group" "vault" { name = "vault-kms-unseal-${var.cluster_name}" description = "vault access" vpc_id = aws_vpc.vpc.id tags = merge(local.tags, { "Name" = "platform-vault-${var.cluster_name}" }) ingress { from_port = 8200 to_port = 8200 protocol = "tcp" cidr_blocks = ["${data.aws_nat_gateway.cluster_ip.public_ip}/32"] } ingress { from_port = 8200 to_port = 8200 protocol = "tcp" cidr_blocks = ["${chomp(data.http.external_ip.body)}/32"] } ingress { from_port = 22 to_port = 22 protocol = "tcp" cidr_blocks = ["${chomp(data.http.external_ip.body)}/32"] } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } } resource "null_resource" "user_data_status_check" { provisioner "local-exec" { on_failure = fail interpreter = ["/bin/bash", "-c"] command = <<EOT echo -e "\x1B[31m wait for few minute for instance warm up, adjust accordingly \x1B[0m" timeout ${var.connection_timeout}s bash -c 'while ! nc -w 2 ${aws_eip.vault_ip.public_ip} 22 > /dev/null ; do echo \"Waiting for port SSH open\"; sleep 5; done' \ && ssh -o 'StrictHostKeyChecking no' -o 'ConnectionAttempts 5' -i private.key ubuntu@${aws_eip.vault_ip.public_ip} timeout ${var.connection_timeout}s bash -c "'while [ ! -e /tmp/signal ] ; do echo "user_data signal has not found yet"; sleep 5; done'" if [ $? -eq 0 ]; then echo "user data sucessfully executed" else echo "Failed to execute user data" fi EOT } depends_on = [aws_instance.vault] } resource "null_resource" "vault_init" { provisioner "local-exec" { command = local.wait_for_cluster_cmd interpreter = var.wait_for_cluster_interpreter environment = { ENDPOINT = "http://${aws_eip.vault_ip.public_ip}:8200/" } } depends_on = [null_resource.user_data_status_check] } resource "null_resource" "backup_and_migrate_vault_data" { count = var.enable-vault_data-migration_to_ebs ? 1 : 0 provisioner "remote-exec" { inline = [data.template_file.backup_and_migrate_data.rendered] connection { type = "ssh" host = aws_eip.vault_ip.public_ip user = var.ssh_user private_key = tls_private_key.main.private_key_pem } } depends_on = [ aws_instance.vault, aws_volume_attachment.vault_ebs, null_resource.user_data_status_check ] } module "files" { source = "github.com/matti/terraform-shell-outputs.git" command = "timeout ${var.connection_timeout}s bash -c 'while ! nc -w 2 ${aws_eip.vault_ip.public_ip} 22 > /dev/null ; do echo \"Waiting for SSH port open\" > /dev/null; sleep 5; done' && ssh -o \"StrictHostKeyChecking no\" -o 'ConnectionAttempts 5' ubuntu@${aws_eip.vault_ip.public_ip} -i private.key cat ${var.vault_local_mount_path}/vault/keys | grep Root | awk -F : {'print $2'} | cut -c2-" depends_on = [null_resource.vault_init] }