mirror of https://gitlab.com/bashrc2/epicyon
				
				
				
			
		
			
	
	
		
			164 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Terraform
		
	
	
		
		
			
		
	
	
			164 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Terraform
		
	
	
| 
								 | 
							
								resource "aws_vpc" "epicyon_vpc" {
							 | 
						||
| 
								 | 
							
								  cidr_block       = var.vpc_cidr_block
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  tags = {
							 | 
						||
| 
								 | 
							
								    Name = "epicyon_vpc"
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								resource "aws_subnet" "epicyon_subnet" {
							 | 
						||
| 
								 | 
							
								  vpc_id     = aws_vpc.epicyon_vpc.id
							 | 
						||
| 
								 | 
							
								  cidr_block = var.subnet_cidr
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  tags = {
							 | 
						||
| 
								 | 
							
								    Name = "epicyon_subnet"
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								resource "aws_internet_gateway" "epicyon_gw" {
							 | 
						||
| 
								 | 
							
								  vpc_id = aws_vpc.epicyon_vpc.id
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  tags = {
							 | 
						||
| 
								 | 
							
								    Name = "epicyon_gw"
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								resource "aws_route_table" "epicyon_route_table" {
							 | 
						||
| 
								 | 
							
								  vpc_id = aws_vpc.epicyon_vpc.id
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  route {
							 | 
						||
| 
								 | 
							
								    cidr_block = var.route_cidr_block
							 | 
						||
| 
								 | 
							
								    gateway_id = aws_internet_gateway.epicyon_gw.id
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								resource "aws_route_table_association" "epicyon_route_table_association" {
							 | 
						||
| 
								 | 
							
								  subnet_id      = aws_subnet.epicyon_subnet.id
							 | 
						||
| 
								 | 
							
								  route_table_id = aws_route_table.epicyon_route_table.id
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								resource "aws_security_group" "epicyon_sg" {
							 | 
						||
| 
								 | 
							
								  name        = "epicyon_sg"
							 | 
						||
| 
								 | 
							
								  description = "Allow all incoming traffic"
							 | 
						||
| 
								 | 
							
								  vpc_id      = aws_vpc.epicyon_vpc.id
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  dynamic "ingress" {
							 | 
						||
| 
								 | 
							
								    for_each = toset(var.domain == "" ? [8080] : [80, 443])
							 | 
						||
| 
								 | 
							
								    content {
							 | 
						||
| 
								 | 
							
								      cidr_blocks = [
							 | 
						||
| 
								 | 
							
								        "0.0.0.0/0"
							 | 
						||
| 
								 | 
							
								      ]
							 | 
						||
| 
								 | 
							
								      from_port = ingress.value
							 | 
						||
| 
								 | 
							
								      to_port   = ingress.value
							 | 
						||
| 
								 | 
							
								      protocol  = "tcp"
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  egress {
							 | 
						||
| 
								 | 
							
								    from_port   = 0
							 | 
						||
| 
								 | 
							
								    to_port     = 0
							 | 
						||
| 
								 | 
							
								    protocol    = "-1"
							 | 
						||
| 
								 | 
							
								    cidr_blocks = ["0.0.0.0/0"]
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								data "aws_ami" "ubuntu" {
							 | 
						||
| 
								 | 
							
								  most_recent = true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  filter {
							 | 
						||
| 
								 | 
							
								    name   = "name"
							 | 
						||
| 
								 | 
							
								    values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  filter {
							 | 
						||
| 
								 | 
							
								    name   = "virtualization-type"
							 | 
						||
| 
								 | 
							
								    values = ["hvm"]
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  owners = ["099720109477"]
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								resource "aws_instance" "epicyon_web" {
							 | 
						||
| 
								 | 
							
								  ami                         = data.aws_ami.ubuntu.id
							 | 
						||
| 
								 | 
							
								  iam_instance_profile        = aws_iam_instance_profile.epicyon_instance_profile.id
							 | 
						||
| 
								 | 
							
								  instance_type               = var.instance_type
							 | 
						||
| 
								 | 
							
								  associate_public_ip_address = true
							 | 
						||
| 
								 | 
							
								  subnet_id                   = aws_subnet.epicyon_subnet.id
							 | 
						||
| 
								 | 
							
								  vpc_security_group_ids      = [aws_security_group.epicyon_sg.id]
							 | 
						||
| 
								 | 
							
								  key_name                    = var.key_name
							 | 
						||
| 
								 | 
							
								  tags = {
							 | 
						||
| 
								 | 
							
								    Name = "epicyon_web"
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								resource "aws_route53_record" "epicyon_route53" {
							 | 
						||
| 
								 | 
							
								  zone_id = var.zone_id
							 | 
						||
| 
								 | 
							
								  name    = var.domain
							 | 
						||
| 
								 | 
							
								  type    = "A"
							 | 
						||
| 
								 | 
							
								  ttl     = 300
							 | 
						||
| 
								 | 
							
								  records = [aws_instance.epicyon_web.public_ip]
							 | 
						||
| 
								 | 
							
								  depends_on = [aws_instance.epicyon_web]
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								resource "aws_iam_role" "epicyon_iam_role" {
							 | 
						||
| 
								 | 
							
								  name = "epicyon_iam_role"
							 | 
						||
| 
								 | 
							
								  assume_role_policy = jsonencode({
							 | 
						||
| 
								 | 
							
								    Version = "2012-10-17"
							 | 
						||
| 
								 | 
							
								    Statement = [
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        Action = "sts:AssumeRole"
							 | 
						||
| 
								 | 
							
								        Effect = "Allow"
							 | 
						||
| 
								 | 
							
								        Sid    = ""
							 | 
						||
| 
								 | 
							
								        Principal = {
							 | 
						||
| 
								 | 
							
								          Service = "ec2.amazonaws.com"
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      },
							 | 
						||
| 
								 | 
							
								    ]
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								resource "aws_iam_instance_profile" "epicyon_instance_profile" {
							 | 
						||
| 
								 | 
							
								  name = var.profile
							 | 
						||
| 
								 | 
							
								  role = aws_iam_role.epicyon_role.id
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								resource "aws_iam_policy_attachment" "epicyon" {
							 | 
						||
| 
								 | 
							
								  name       = format("%s-attachment", epicyon)
							 | 
						||
| 
								 | 
							
								  roles      = [aws_iam_role.epicyon_role.id]
							 | 
						||
| 
								 | 
							
								  policy_arn = "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								resource "aws_eip" "epicyon" {
							 | 
						||
| 
								 | 
							
								  instance = aws_instance.epicyon_web.id
							 | 
						||
| 
								 | 
							
								  vpc      = true
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								resource "aws_eip_association" "epicyon" {
							 | 
						||
| 
								 | 
							
								  instance_id   = aws_instance.epicyon_web.id
							 | 
						||
| 
								 | 
							
								  allocation_id = aws_eip.elastic.id
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								resource "null_resource" "null_resource_epicyon" {
							 | 
						||
| 
								 | 
							
								  depends_on=[aws_route53_record.epicyon_route53]
							 | 
						||
| 
								 | 
							
								  triggers = {
							 | 
						||
| 
								 | 
							
								    id = timestamp()
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								   connection {
							 | 
						||
| 
								 | 
							
								    agent       = false
							 | 
						||
| 
								 | 
							
								    type        = "ssh"
							 | 
						||
| 
								 | 
							
								    host        = [aws_instance.epicyon_web.public_ip]
							 | 
						||
| 
								 | 
							
								    private_key = file(var.private_key)
							 | 
						||
| 
								 | 
							
								    user        = "ubuntu"
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  provisioner "file" {
							 | 
						||
| 
								 | 
							
								    source      = "./templates/startup.sh"
							 | 
						||
| 
								 | 
							
								    destination = "~/startup.sh"
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  provisioner "remote-exec" {
							 | 
						||
| 
								 | 
							
								    inline = [
							 | 
						||
| 
								 | 
							
								      "chmod +x ~/startup.sh",
							 | 
						||
| 
								 | 
							
								      "export domain=${var.epicyon_domain}",
							 | 
						||
| 
								 | 
							
								      "export email=${var.email}",
							 | 
						||
| 
								 | 
							
								      "bash ~/startup.sh"
							 | 
						||
| 
								 | 
							
								    ]
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 |