mirror of
https://github.com/mr-vercetti/tf-aws-demo.git
synced 2025-01-18 11:25:35 +01:00
Add demo-app autoscaling group
This commit is contained in:
parent
180ae13b94
commit
9cef061162
89
modules/app/main.tf
Executable file
89
modules/app/main.tf
Executable file
@ -0,0 +1,89 @@
|
|||||||
|
resource "aws_security_group" "this" {
|
||||||
|
name = "demo-app-autoscaling-group-sg"
|
||||||
|
|
||||||
|
vpc_id = var.VPC_ID
|
||||||
|
|
||||||
|
ingress {
|
||||||
|
description = "Self all"
|
||||||
|
from_port = 0
|
||||||
|
to_port = 65535
|
||||||
|
protocol = "tcp"
|
||||||
|
self = true
|
||||||
|
}
|
||||||
|
|
||||||
|
ingress {
|
||||||
|
description = "SSH"
|
||||||
|
from_port = 22
|
||||||
|
to_port = 22
|
||||||
|
protocol = "tcp"
|
||||||
|
cidr_blocks = ["0.0.0.0/0"]
|
||||||
|
}
|
||||||
|
|
||||||
|
ingress {
|
||||||
|
description = "HTTP"
|
||||||
|
from_port = 80
|
||||||
|
to_port = 80
|
||||||
|
protocol = "tcp"
|
||||||
|
cidr_blocks = ["0.0.0.0/0"]
|
||||||
|
}
|
||||||
|
|
||||||
|
ingress {
|
||||||
|
description = "HTTPS"
|
||||||
|
from_port = 443
|
||||||
|
to_port = 443
|
||||||
|
protocol = "tcp"
|
||||||
|
cidr_blocks = ["0.0.0.0/0"]
|
||||||
|
}
|
||||||
|
|
||||||
|
egress {
|
||||||
|
from_port = 0
|
||||||
|
to_port = 0
|
||||||
|
protocol = "-1"
|
||||||
|
cidr_blocks = ["0.0.0.0/0"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data "template_file" "bootstrap" {
|
||||||
|
template = file("${path.module}/resources/bootstrap.sh")
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_launch_configuration" "this" {
|
||||||
|
name = "demo-app-launch-configuration"
|
||||||
|
|
||||||
|
image_id = var.EC2_IMAGE_ID
|
||||||
|
instance_type = var.EC2_TYPE
|
||||||
|
|
||||||
|
key_name = var.EC2_KEY_NAME
|
||||||
|
security_groups = [aws_security_group.this.id]
|
||||||
|
user_data = data.template_file.bootstrap.rendered
|
||||||
|
|
||||||
|
lifecycle {
|
||||||
|
create_before_destroy = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_autoscaling_group" "this" {
|
||||||
|
name = "demo-app-autoscaling-group"
|
||||||
|
|
||||||
|
min_size = var.ASG_MIN_SIZE
|
||||||
|
max_size = var.ASG_MAX_SIZE
|
||||||
|
|
||||||
|
launch_configuration = aws_launch_configuration.this.name
|
||||||
|
vpc_zone_identifier = var.VPC_SUBNETS_IDS
|
||||||
|
health_check_type = "ELB"
|
||||||
|
health_check_grace_period = "90"
|
||||||
|
|
||||||
|
tag {
|
||||||
|
key = "Name"
|
||||||
|
value = "demo-app-instance"
|
||||||
|
propagate_at_launch = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_autoscaling_policy" "this" {
|
||||||
|
name = "demo-app-autoscaling-policy"
|
||||||
|
scaling_adjustment = 1
|
||||||
|
adjustment_type = "ChangeInCapacity"
|
||||||
|
cooldown = 300
|
||||||
|
autoscaling_group_name = aws_autoscaling_group.this.name
|
||||||
|
}
|
0
modules/app/outputs.tf
Executable file
0
modules/app/outputs.tf
Executable file
12
modules/app/resources/bootstrap.sh
Executable file
12
modules/app/resources/bootstrap.sh
Executable file
@ -0,0 +1,12 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
yum update -y
|
||||||
|
amazon-linux-extras install docker
|
||||||
|
service docker start
|
||||||
|
usermod -a -G docker ec2-user
|
||||||
|
chkconfig docker on
|
||||||
|
|
||||||
|
docker run \
|
||||||
|
-p 80:80 \
|
||||||
|
--restart unless-stopped \
|
||||||
|
nginxdemos/hello
|
30
modules/app/variables.tf
Executable file
30
modules/app/variables.tf
Executable file
@ -0,0 +1,30 @@
|
|||||||
|
# VPC
|
||||||
|
variable "VPC_ID" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "VPC_SUBNETS_IDS" {
|
||||||
|
type = list(string)
|
||||||
|
}
|
||||||
|
|
||||||
|
# EC2
|
||||||
|
variable "EC2_IMAGE_ID" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "EC2_TYPE" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "EC2_KEY_NAME" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
# ASG
|
||||||
|
variable "ASG_MIN_SIZE" {
|
||||||
|
type = number
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "ASG_MAX_SIZE" {
|
||||||
|
type = number
|
||||||
|
}
|
55
prod/main.tf
55
prod/main.tf
@ -5,7 +5,7 @@ provider "aws" {
|
|||||||
|
|
||||||
# Create VPC with NAT Gateway and route tables
|
# Create VPC with NAT Gateway and route tables
|
||||||
module "vpc" {
|
module "vpc" {
|
||||||
source = "terraform-aws-modules/vpc/aws"
|
source = "terraform-aws-modules/vpc/aws"
|
||||||
version = "3.14.2"
|
version = "3.14.2"
|
||||||
|
|
||||||
name = var.DEMO_VPC_NAME
|
name = var.DEMO_VPC_NAME
|
||||||
@ -15,22 +15,22 @@ module "vpc" {
|
|||||||
private_subnets = var.DEMO_VPC_PRIVATE_SUBNET_CIDRS
|
private_subnets = var.DEMO_VPC_PRIVATE_SUBNET_CIDRS
|
||||||
public_subnets = var.DEMO_VPC_PUBLIC_SUBNET_CIDRS
|
public_subnets = var.DEMO_VPC_PUBLIC_SUBNET_CIDRS
|
||||||
|
|
||||||
enable_nat_gateway = true
|
enable_nat_gateway = true
|
||||||
single_nat_gateway = true
|
single_nat_gateway = true
|
||||||
one_nat_gateway_per_az = false
|
one_nat_gateway_per_az = false
|
||||||
|
|
||||||
tags = {
|
tags = {
|
||||||
Terraform = "true"
|
Terraform = "true"
|
||||||
Project = var.PROJECT_TAG
|
Project = var.PROJECT_TAG
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Get VPC data
|
# Get VPC data
|
||||||
module "vpc_data" {
|
module "vpc_data" {
|
||||||
depends_on = [module.vpc]
|
depends_on = [module.vpc]
|
||||||
source = "../modules/vpc_data"
|
source = "../modules/vpc_data"
|
||||||
|
|
||||||
VPC_NAME = var.DEMO_VPC_NAME
|
VPC_NAME = var.DEMO_VPC_NAME
|
||||||
BASTION_HOST_AZ = var.DEMO_BASTION_HOST_AZ
|
BASTION_HOST_AZ = var.DEMO_BASTION_HOST_AZ
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -38,9 +38,46 @@ module "vpc_data" {
|
|||||||
module "bastion_host" {
|
module "bastion_host" {
|
||||||
source = "../modules/bastion_host"
|
source = "../modules/bastion_host"
|
||||||
|
|
||||||
VPC_ID = module.vpc_data.vpc.id
|
VPC_ID = module.vpc_data.vpc.id
|
||||||
SUBNET_ID = module.vpc_data.bastion_host_subnet.id
|
SUBNET_ID = module.vpc_data.bastion_host_subnet.id
|
||||||
|
|
||||||
INSTANCE_TYPE = var.DEMO_BASTION_HOST_TYPE
|
INSTANCE_TYPE = var.DEMO_BASTION_HOST_TYPE
|
||||||
INSTANCE_NAME = var.DEMO_BASTION_HOST_NAME
|
INSTANCE_NAME = var.DEMO_BASTION_HOST_NAME
|
||||||
KEY_NAME = var.DEMO_BASTION_HOST_KEY_NAME
|
KEY_NAME = var.DEMO_BASTION_HOST_KEY_NAME
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data "aws_ami" "amazon-linux" {
|
||||||
|
most_recent = true
|
||||||
|
|
||||||
|
filter {
|
||||||
|
name = "name"
|
||||||
|
values = ["amzn2-ami-*-gp2"]
|
||||||
|
}
|
||||||
|
|
||||||
|
filter {
|
||||||
|
name = "architecture"
|
||||||
|
values = ["x86_64"]
|
||||||
|
}
|
||||||
|
|
||||||
|
filter {
|
||||||
|
name = "virtualization-type"
|
||||||
|
values = ["hvm"]
|
||||||
|
}
|
||||||
|
|
||||||
|
owners = ["amazon"]
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create demo app
|
||||||
|
module "app" {
|
||||||
|
source = "../modules/app"
|
||||||
|
|
||||||
|
VPC_ID = module.vpc_data.vpc.id
|
||||||
|
VPC_SUBNETS_IDS = module.vpc_data.private_subnets.ids
|
||||||
|
|
||||||
|
EC2_IMAGE_ID = data.aws_ami.amazon-linux.id
|
||||||
|
EC2_TYPE = var.DEMO_APP_EC2_TYPE
|
||||||
|
EC2_KEY_NAME = var.DEMO_APP_EC2_KEY_NAME
|
||||||
|
|
||||||
|
ASG_MIN_SIZE = var.DEMO_APP_ASG_MIN_SIZE
|
||||||
|
ASG_MAX_SIZE = var.DEMO_APP_ASG_MAX_SIZE
|
||||||
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
output "demo_vpc_id" {
|
output "demo_vpc_id" {
|
||||||
value = module.vpc_data.vpc.id
|
value = module.vpc_data.vpc.id
|
||||||
}
|
}
|
||||||
|
|
||||||
output "public_subnets" {
|
output "public_subnets" {
|
||||||
@ -11,11 +11,7 @@ output "private_subnets" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
output "demo_bastion_host_subnet_id" {
|
output "demo_bastion_host_subnet_id" {
|
||||||
value = module.vpc_data.bastion_host_subnet.id
|
value = module.vpc_data.bastion_host_subnet.id
|
||||||
}
|
|
||||||
|
|
||||||
output "demo_bastion_host_private_ip" {
|
|
||||||
value = module.bastion_host.bastion_host_private_ip
|
|
||||||
}
|
}
|
||||||
|
|
||||||
output "demo_bastion_host_public_ip" {
|
output "demo_bastion_host_public_ip" {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# General
|
# general
|
||||||
variable "REGION" {
|
variable "REGION" {
|
||||||
type = string
|
type = string
|
||||||
default = "eu-west-3"
|
default = "eu-west-3"
|
||||||
@ -8,7 +8,7 @@ variable "PROJECT_TAG" {
|
|||||||
type = string
|
type = string
|
||||||
}
|
}
|
||||||
|
|
||||||
# DEMO_VPC (network, network_data)
|
# vpc
|
||||||
variable "DEMO_VPC_NAME" {
|
variable "DEMO_VPC_NAME" {
|
||||||
type = string
|
type = string
|
||||||
}
|
}
|
||||||
@ -30,7 +30,7 @@ variable "DEMO_VPC_PUBLIC_SUBNET_CIDRS" {
|
|||||||
type = list(string)
|
type = list(string)
|
||||||
}
|
}
|
||||||
|
|
||||||
# Bastion host (bastion_host)
|
# bastion host
|
||||||
variable "DEMO_BASTION_HOST_TYPE" {
|
variable "DEMO_BASTION_HOST_TYPE" {
|
||||||
type = string
|
type = string
|
||||||
default = "t2.micro"
|
default = "t2.micro"
|
||||||
@ -47,3 +47,20 @@ variable "DEMO_BASTION_HOST_KEY_NAME" {
|
|||||||
variable "DEMO_BASTION_HOST_AZ" {
|
variable "DEMO_BASTION_HOST_AZ" {
|
||||||
type = string
|
type = string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# demo app
|
||||||
|
variable "DEMO_APP_EC2_TYPE" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "DEMO_APP_EC2_KEY_NAME" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "DEMO_APP_ASG_MIN_SIZE" {
|
||||||
|
type = number
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "DEMO_APP_ASG_MAX_SIZE" {
|
||||||
|
type = number
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user