Check in IaC files.
This commit is contained in:
parent
c731e024c6
commit
c6efa83224
31
terraform/compute.tf
Normal file
31
terraform/compute.tf
Normal file
@ -0,0 +1,31 @@
|
||||
module "ec2_ssh_key" {
|
||||
source = "terraform-aws-modules/key-pair/aws"
|
||||
key_name = join("-", [var.tags.builder, var.tags.project, var.tags.environment])
|
||||
public_key = var.ssh_public_key
|
||||
|
||||
tags = var.tags
|
||||
}
|
||||
|
||||
module "standalone_ec2" {
|
||||
for_each = var.ec2_template[*]
|
||||
source = "terraform-aws-modules/ec2-instance/aws"
|
||||
|
||||
name = each.value["hostname"]
|
||||
ami = each.value["ami"]
|
||||
|
||||
instance_type = each.value["family"]
|
||||
key_name = module.ec2_ssh_key.key_pair_name
|
||||
monitoring = true
|
||||
|
||||
vpc_security_group_ids = [module.ec2_rdp_sg.security_group_id]
|
||||
subnet_id = each.value["subnet"]
|
||||
|
||||
root_block_device = [
|
||||
{
|
||||
volume_size = each.value["disksize"]
|
||||
encrypted = true
|
||||
}
|
||||
]
|
||||
|
||||
tags = var.tags
|
||||
}
|
20
terraform/data.tf
Normal file
20
terraform/data.tf
Normal file
@ -0,0 +1,20 @@
|
||||
# Attempt to programmatically fetch AMI ARNs
|
||||
|
||||
# data "aws_ami" "compute_ami" {
|
||||
# most_recent = true
|
||||
|
||||
# filter {
|
||||
# name = "name"
|
||||
# values = var.compute_ami
|
||||
# }
|
||||
|
||||
# filter {
|
||||
# name = "virtualization-type"
|
||||
# values = ["hvm"]
|
||||
# }
|
||||
|
||||
# filter {
|
||||
# name = "architecture"
|
||||
# values = ["x86_64"]
|
||||
# }
|
||||
# }
|
11
terraform/database.tf
Normal file
11
terraform/database.tf
Normal file
@ -0,0 +1,11 @@
|
||||
module "db_psql" {
|
||||
source = "terraform-aws-modules/rds/aws"
|
||||
for_each = var.db_template[*]
|
||||
identifier = each.value["name"]
|
||||
|
||||
engine = each.value["engine"]
|
||||
engine_version = each.value["engine_version"]
|
||||
instance_class = each.value["family"]
|
||||
|
||||
tags = var.tags
|
||||
}
|
38
terraform/main.tf
Normal file
38
terraform/main.tf
Normal file
@ -0,0 +1,38 @@
|
||||
terraform {
|
||||
required_providers {
|
||||
aws = {
|
||||
source = "hashicorp/aws"
|
||||
version = "~> 5.3"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
provider "aws" {
|
||||
|
||||
region = var.region
|
||||
|
||||
|
||||
# Configure Terraform to plan
|
||||
# against localstack Docker container
|
||||
# instead of AWS
|
||||
access_key = "ak"
|
||||
secret_key = "sk"
|
||||
skip_credentials_validation = true
|
||||
skip_metadata_api_check = true
|
||||
skip_requesting_account_id = true
|
||||
|
||||
endpoints {
|
||||
iam = "http://localstack:4566"
|
||||
sts = "http://localstack:4566"
|
||||
s3 = "http://localstack:4566"
|
||||
ec2 = "http://localstack:4566"
|
||||
ssm = "http://localstack:4566"
|
||||
rds = "http://localstack:4566"
|
||||
}
|
||||
|
||||
# Just in case I want to use a service account
|
||||
#assume_role {
|
||||
# role_arn = "arn:aws:iam::AWSACCOUNT:role/ROLE"
|
||||
# session_name = "Temporary IaC provisioning role"
|
||||
#}
|
||||
}
|
85
terraform/networking.tf
Normal file
85
terraform/networking.tf
Normal file
@ -0,0 +1,85 @@
|
||||
module "vpc" {
|
||||
source = "terraform-aws-modules/vpc/aws"
|
||||
name = join("-", [var.tags.builder, var.tags.project, var.tags.environment])
|
||||
cidr = var.vpc_cidr
|
||||
|
||||
azs = var.disaster_zones
|
||||
private_subnets = var.private_cidrs
|
||||
public_subnets = var.public_cidrs
|
||||
|
||||
enable_nat_gateway = true
|
||||
one_nat_gateway_per_az = true
|
||||
|
||||
tags = var.tags
|
||||
}
|
||||
|
||||
module "loadbalancer" {
|
||||
source = "terraform-aws-modules/alb/aws"
|
||||
name = join("-", [var.tags.builder, var.tags.project, var.tags.environment])
|
||||
load_balancer_type = "application"
|
||||
|
||||
vpc_id = module.vpc.vpc_id
|
||||
subnets = module.vpc.private_subnets
|
||||
|
||||
security_groups = [
|
||||
module.ec2_web_sg.security_group_id
|
||||
]
|
||||
|
||||
http_tcp_listeners = [
|
||||
{
|
||||
port = var.exposed_ports[0]
|
||||
protocol = "HTTP"
|
||||
}
|
||||
]
|
||||
|
||||
target_groups = [
|
||||
{
|
||||
target_type = "ip"
|
||||
backend_protocol = "TCP"
|
||||
backend_port = var.exposed_ports[0]
|
||||
}
|
||||
]
|
||||
|
||||
tags = var.tags
|
||||
}
|
||||
|
||||
module "ec2_web_sg" {
|
||||
source = "terraform-aws-modules/security-group/aws//modules/http-80"
|
||||
name = join("-", [var.tags.builder, var.tags.project, var.tags.environment, "http"])
|
||||
description = "The primary security group for EC2s serving HTTP."
|
||||
|
||||
vpc_id = module.vpc.vpc_id
|
||||
ingress_cidr_blocks = var.private_cidrs
|
||||
|
||||
tags = var.tags
|
||||
}
|
||||
|
||||
module "ec2_rdp_sg" {
|
||||
source = "terraform-aws-modules/security-group/aws//modules/ssh"
|
||||
name = join("-", [var.tags.builder, var.tags.project, var.tags.environment, "ssh"])
|
||||
description = "This security group allows remote desktop access."
|
||||
|
||||
vpc_id = module.vpc.vpc_id
|
||||
ingress_cidr_blocks = var.public_cidrs
|
||||
|
||||
tags = var.tags
|
||||
}
|
||||
|
||||
module "db_psql_sg" {
|
||||
source = "terraform-aws-modules/security-group/aws//modules/postgresql"
|
||||
name = join("-", [var.tags.builder, var.tags.project, var.tags.environment, "db"])
|
||||
description = "This security group helps our compute access the database(s)."
|
||||
vpc_id = module.vpc.vpc_id
|
||||
|
||||
ingress_with_cidr_blocks = [
|
||||
{
|
||||
from_port = 5432
|
||||
to_port = 5432
|
||||
protocol = "tcp"
|
||||
description = "PostgreSQL access from within VPC"
|
||||
cidr_blocks = module.vpc.vpc_cidr_block
|
||||
}
|
||||
]
|
||||
|
||||
tags = var.tags
|
||||
}
|
9
terraform/outputs.tf
Normal file
9
terraform/outputs.tf
Normal file
@ -0,0 +1,9 @@
|
||||
# output "compute_ami" {
|
||||
# description = "Prints the image AMI installed on our EC2s."
|
||||
# value = data.aws_ami.compute_ami
|
||||
# }
|
||||
|
||||
output "public_ec2" {
|
||||
description = "Prints the ARN for the publicly accessible EC2"
|
||||
value = module.standalone_ec2.arn
|
||||
}
|
55
terraform/terraform.tfvars
Normal file
55
terraform/terraform.tfvars
Normal file
@ -0,0 +1,55 @@
|
||||
region = "us-gov-west-1"
|
||||
disaster_zones = ["us-gov-west-1a", "us-gov-west-1b"]
|
||||
|
||||
vpc_cidr = "10.1.0.0/16"
|
||||
private_cidrs = ["10.1.2.0/24", "10.1.3.0/24", "10.1.4.0/24", "10.1.5.0/24"]
|
||||
public_cidrs = ["10.1.0.0/24", "10.1.1.0/24"]
|
||||
exposed_ports = ["80", "22"]
|
||||
|
||||
ec2_template = [
|
||||
{
|
||||
hostname = "bastion1"
|
||||
ami = "winami"
|
||||
elastic_ip = false
|
||||
family = "t3a.medium"
|
||||
disksize = "50"
|
||||
subnet = "10.1.0.0/24"
|
||||
},
|
||||
{
|
||||
hostname = "wpserver1"
|
||||
ami = "rhelami"
|
||||
elastic_ip = false
|
||||
family = "t3a.micro"
|
||||
disksize = "20"
|
||||
subnet = "10.1.2.0/24"
|
||||
},
|
||||
{
|
||||
hostname = "wpserver2"
|
||||
ami = "rhelami"
|
||||
elastic_ip = false
|
||||
family = "t3a.micro"
|
||||
disksize = "20"
|
||||
subnet = "10.1.3.0/24"
|
||||
}
|
||||
]
|
||||
|
||||
db_template = [
|
||||
{
|
||||
name = "RDS1"
|
||||
engine = "postgres"
|
||||
engine_version = 11
|
||||
family = "db.t3.micro"
|
||||
subnet = "10.1.5.0/24"
|
||||
}
|
||||
]
|
||||
|
||||
ssh_public_key = "sooper sekrit"
|
||||
|
||||
tags = {
|
||||
lob = "cloud"
|
||||
owner = "matt@coalfire.com"
|
||||
environment = "dev"
|
||||
open_to_internet = "true"
|
||||
builder = "terraform"
|
||||
project = "coalfire-3tier"
|
||||
}
|
70
terraform/variables.tf
Normal file
70
terraform/variables.tf
Normal file
@ -0,0 +1,70 @@
|
||||
variable "tags" {
|
||||
description = "Helpful tags for resource organization."
|
||||
type = map(any)
|
||||
default = {}
|
||||
}
|
||||
|
||||
variable "region" {
|
||||
description = "Where you want to deploy your resources."
|
||||
type = string
|
||||
default = "us-east-1"
|
||||
}
|
||||
|
||||
variable "disaster_zones" {
|
||||
description = "A list of availability zones for resource redundancy."
|
||||
type = list(string)
|
||||
default = []
|
||||
}
|
||||
|
||||
variable "vpc_cidr" {
|
||||
description = "The VPC subnet that supports the entire application plane."
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "public_cidrs" {
|
||||
description = "This subnet will support VMs with a route to the public internet."
|
||||
type = list(string)
|
||||
default = []
|
||||
}
|
||||
|
||||
variable "private_cidrs" {
|
||||
description = "This subnet will support VMs with DB or internal access."
|
||||
type = list(string)
|
||||
default = []
|
||||
}
|
||||
|
||||
variable "exposed_ports" {
|
||||
description = "A list of ports that are punched through the firewall."
|
||||
type = list(number)
|
||||
default = []
|
||||
}
|
||||
|
||||
variable "ssh_public_key" {
|
||||
description = "A public key signature for secure shell access."
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "ec2_template" {
|
||||
description = "A structured template for mostly uniform EC2s."
|
||||
type = list(object({
|
||||
hostname = string
|
||||
ami = string
|
||||
elastic_ip = bool
|
||||
family = string
|
||||
disksize = number
|
||||
subnet = string
|
||||
}))
|
||||
}
|
||||
|
||||
variable "db_template" {
|
||||
description = "A structured template for mostly uniform Amazon RDSes."
|
||||
type = list(object({
|
||||
name = string
|
||||
engine = string
|
||||
engine_version = number
|
||||
family = string
|
||||
subnet = string
|
||||
}))
|
||||
}
|
Loading…
Reference in New Issue
Block a user