diff --git a/modules/ami_data/main.tf b/modules/ami_data/main.tf new file mode 100755 index 0000000..f4a9ac9 --- /dev/null +++ b/modules/ami_data/main.tf @@ -0,0 +1,20 @@ +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"] +} \ No newline at end of file diff --git a/modules/ami_data/outputs.tf b/modules/ami_data/outputs.tf new file mode 100755 index 0000000..62a047d --- /dev/null +++ b/modules/ami_data/outputs.tf @@ -0,0 +1,3 @@ +output "amazon_linux" { + value = data.aws_ami.amazon_linux +} \ No newline at end of file diff --git a/modules/app/main.tf b/modules/app/main.tf index 725bbff..8754079 100755 --- a/modules/app/main.tf +++ b/modules/app/main.tf @@ -50,12 +50,12 @@ data "template_file" "bootstrap" { resource "aws_launch_configuration" "this" { name = "demo-app-launch-configuration" - image_id = var.EC2_IMAGE_ID + image_id = var.EC2_AMI instance_type = var.EC2_TYPE - key_name = var.EC2_KEY_NAME + key_name = var.EC2_KEY_NAME security_groups = [aws_security_group.this.id] - user_data = data.template_file.bootstrap.rendered + user_data = data.template_file.bootstrap.rendered lifecycle { create_before_destroy = true @@ -65,8 +65,8 @@ resource "aws_launch_configuration" "this" { resource "aws_autoscaling_group" "this" { name = "demo-app-autoscaling-group" - min_size = var.ASG_MIN_SIZE - max_size = var.ASG_MAX_SIZE + 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 @@ -80,10 +80,62 @@ resource "aws_autoscaling_group" "this" { } } -resource "aws_autoscaling_policy" "this" { - name = "demo-app-autoscaling-policy" - scaling_adjustment = 1 - adjustment_type = "ChangeInCapacity" - cooldown = 300 +# asg scale up policy +resource "aws_autoscaling_policy" "cpu-policy" { + name = "demo-app-cpu-policy" + autoscaling_group_name = aws_autoscaling_group.this.name + adjustment_type = "ChangeInCapacity" + scaling_adjustment = "1" + cooldown = "300" + policy_type = "SimpleScaling" +} + +resource "aws_cloudwatch_metric_alarm" "cpu-alarm" { + alarm_name = "cpu-alarm" + alarm_description = "cpu-alarm" + comparison_operator = "GreaterThanOrEqualToThreshold" + evaluation_periods = "2" + metric_name = "CPUUtilization" + namespace = "AWS/EC2" + period = "120" + statistic = "Average" + threshold = "30" + + dimensions = { + "AutoScalingGroupName" = "${aws_autoscaling_group.this.name}" + } + + actions_enabled = true + alarm_actions = ["${aws_autoscaling_policy.cpu-policy.arn}"] +} + +# asg scale down policy +resource "aws_autoscaling_policy" "cpu-policy-scaledown" { + name = "demo-app-cpu-policy-scaledown" + + autoscaling_group_name = aws_autoscaling_group.this.name + adjustment_type = "ChangeInCapacity" + scaling_adjustment = "-1" + cooldown = "300" + policy_type = "SimpleScaling" +} + +resource "aws_cloudwatch_metric_alarm" "cpu-alarm-scaledown" { + alarm_name = "cpu-alarm-scaledown" + alarm_description = "cpu-alarm-scaledown" + comparison_operator = "LessThanOrEqualToThreshold" + evaluation_periods = "2" + metric_name = "CPUUtilization" + namespace = "AWS/EC2" + period = "120" + statistic = "Average" + threshold = "5" + + dimensions = { + "AutoScalingGroupName" = "${aws_autoscaling_group.this.name}" + } + + actions_enabled = true + alarm_actions = ["${aws_autoscaling_policy.cpu-policy-scaledown.arn}"] } \ No newline at end of file diff --git a/modules/app/variables.tf b/modules/app/variables.tf index 1e9fbd6..2f01576 100755 --- a/modules/app/variables.tf +++ b/modules/app/variables.tf @@ -8,7 +8,7 @@ variable "VPC_SUBNETS_IDS" { } # EC2 -variable "EC2_IMAGE_ID" { +variable "EC2_AMI" { type = string } diff --git a/modules/bastion_host/main.tf b/modules/bastion_host/main.tf index 1b4b3e0..55e9572 100755 --- a/modules/bastion_host/main.tf +++ b/modules/bastion_host/main.tf @@ -1,24 +1,3 @@ -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"] -} - resource "aws_security_group" "this" { name = "bastion-host-sg" @@ -50,9 +29,9 @@ resource "aws_network_interface" "this" { } resource "aws_instance" "this" { - ami = data.aws_ami.amazon-linux.id - instance_type = var.INSTANCE_TYPE - key_name = var.KEY_NAME + ami = var.EC2_AMI + instance_type = var.EC2_TYPE + key_name = var.EC2_KEY_NAME network_interface { network_interface_id = aws_network_interface.this.id @@ -60,6 +39,6 @@ resource "aws_instance" "this" { } tags = { - Name = var.INSTANCE_NAME + Name = var.EC2_INSTANCE_NAME } } \ No newline at end of file diff --git a/modules/bastion_host/variables.tf b/modules/bastion_host/variables.tf index a8afe5d..166adfe 100755 --- a/modules/bastion_host/variables.tf +++ b/modules/bastion_host/variables.tf @@ -6,15 +6,19 @@ variable "SUBNET_ID" { type = string } -variable "INSTANCE_TYPE" { +variable "EC2_AMI" { + type = string +} + +variable "EC2_TYPE" { type = string default = "t2.micro" } -variable "INSTANCE_NAME" { +variable "EC2_INSTANCE_NAME" { type = string } -variable "KEY_NAME" { +variable "EC2_KEY_NAME" { type = string } \ No newline at end of file diff --git a/prod/main.tf b/prod/main.tf index 082635a..4bd7b79 100755 --- a/prod/main.tf +++ b/prod/main.tf @@ -27,13 +27,18 @@ module "vpc" { # Get VPC data module "vpc_data" { - depends_on = [module.vpc] source = "../modules/vpc_data" + depends_on = [module.vpc] VPC_NAME = var.DEMO_VPC_NAME BASTION_HOST_AZ = var.DEMO_BASTION_HOST_AZ } +# Get AMI data +module "ami_data" { + source = "../modules/ami_data" +} + # Create bastion host module "bastion_host" { source = "../modules/bastion_host" @@ -41,30 +46,10 @@ module "bastion_host" { VPC_ID = module.vpc_data.vpc.id SUBNET_ID = module.vpc_data.bastion_host_subnet.id - INSTANCE_TYPE = var.DEMO_BASTION_HOST_TYPE - INSTANCE_NAME = var.DEMO_BASTION_HOST_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"] + EC2_AMI = module.ami_data.amazon_linux.id + EC2_TYPE = var.DEMO_BASTION_HOST_TYPE + EC2_INSTANCE_NAME = var.DEMO_BASTION_HOST_NAME + EC2_KEY_NAME = var.DEMO_BASTION_HOST_KEY_NAME } # Create demo app @@ -74,10 +59,10 @@ module "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_AMI = module.ami_data.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 + ASG_MIN_SIZE = var.DEMO_APP_ASG_MIN_SIZE + ASG_MAX_SIZE = var.DEMO_APP_ASG_MAX_SIZE }