diff --git a/classes/04class/exercises/c04-iac04/julio-pimentel/README.md b/classes/04class/exercises/c04-iac04/julio-pimentel/README.md new file mode 100644 index 000000000..c4c59dde4 --- /dev/null +++ b/classes/04class/exercises/c04-iac04/julio-pimentel/README.md @@ -0,0 +1,13 @@ +# C04-IAC04 + +## Command Execution Output +- [output.txt](output.txt) +- [terraform-apply.txt](terraform-apply.txt) +- [terraform-code/](terraform-code/) + +## Questions: +- What is the benefit of having the Terraform code for the resources within the module you've created? + - It is a better way to organise the code when you have a project with several resources. + +*** +Answer for exercise [c04-iac04](https://github.com/devopsacademyau/academy/blob/c41e824fb2a2c55e3a30b2371a87e3a7551b6741/classes/04class/exercises/c04-iac04/README.md) diff --git a/classes/04class/exercises/c04-iac04/julio-pimentel/output.txt b/classes/04class/exercises/c04-iac04/julio-pimentel/output.txt new file mode 100644 index 000000000..6d1a3014f --- /dev/null +++ b/classes/04class/exercises/c04-iac04/julio-pimentel/output.txt @@ -0,0 +1,7 @@ +$ curl c04-iac04-alb-370937775.ap-southeast-2.elb.amazonaws.com + +502 Bad Gateway + +

502 Bad Gateway

+ + \ No newline at end of file diff --git a/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-apply.txt b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-apply.txt new file mode 100644 index 000000000..bfee9556b --- /dev/null +++ b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-apply.txt @@ -0,0 +1,616 @@ +$ terraform apply +var.ami_id + Enter a value: ami-0c641f2290e9cd048 + +var.asg_desired + Enter a value: 2 + +var.asg_max + Enter a value: 3 + +var.asg_min + Enter a value: 1 + +var.instance_type + Enter a value: t2.micro + +var.pub_sub_cidr_1 + Enter a value: 10.0.1.0/24 + +var.pub_sub_cidr_2 + Enter a value: 10.0.2.0/24 + +var.pub_sub_cidr_3 + Enter a value: 10.0.3.0/24 + +var.pub_sub_name_1 + Enter a value: public-subnet-1 + +var.pub_sub_name_2 + Enter a value: public-subnet-2 + +var.pub_sub_name_3 + Enter a value: public-subnet-3 + +var.vpc_cidr + VPC CIDR + + Enter a value: 10.0.0.0/16 + + +Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + + create + +Terraform will perform the following actions: + + # module.c04_iac04_alb.aws_alb.alb_01 will be created + + resource "aws_alb" "alb_01" { + + arn = (known after apply) + + arn_suffix = (known after apply) + + desync_mitigation_mode = "defensive" + + dns_name = (known after apply) + + drop_invalid_header_fields = false + + enable_deletion_protection = false + + enable_http2 = true + + enable_waf_fail_open = false + + id = (known after apply) + + idle_timeout = 60 + + internal = false + + ip_address_type = (known after apply) + + load_balancer_type = "application" + + name = "c04-iac04-alb" + + preserve_host_header = false + + security_groups = (known after apply) + + subnets = (known after apply) + + tags = { + + "Name" = "c04-iac04-alb" + } + + tags_all = { + + "Name" = "c04-iac04-alb" + } + + vpc_id = (known after apply) + + zone_id = (known after apply) + + + subnet_mapping { + + allocation_id = (known after apply) + + ipv6_address = (known after apply) + + outpost_id = (known after apply) + + private_ipv4_address = (known after apply) + + subnet_id = (known after apply) + } + } + + # module.c04_iac04_alb.aws_alb_listener.alb_listener will be created + + resource "aws_alb_listener" "alb_listener" { + + arn = (known after apply) + + id = (known after apply) + + load_balancer_arn = (known after apply) + + port = 80 + + protocol = "HTTP" + + ssl_policy = (known after apply) + + tags_all = (known after apply) + + + default_action { + + order = (known after apply) + + target_group_arn = (known after apply) + + type = "forward" + } + } + + # module.c04_iac04_alb.aws_alb_target_group.alb_tg will be created + + resource "aws_alb_target_group" "alb_tg" { + + arn = (known after apply) + + arn_suffix = (known after apply) + + connection_termination = false + + deregistration_delay = "300" + + id = (known after apply) + + ip_address_type = (known after apply) + + lambda_multi_value_headers_enabled = false + + load_balancing_algorithm_type = (known after apply) + + name = "alb-tg" + + port = 80 + + preserve_client_ip = (known after apply) + + protocol = "HTTP" + + protocol_version = (known after apply) + + proxy_protocol_v2 = false + + slow_start = 0 + + tags = { + + "Name" = "alb_tg_c04-iac04" + } + + tags_all = { + + "Name" = "alb_tg_c04-iac04" + } + + target_type = "instance" + + vpc_id = (known after apply) + + + health_check { + + enabled = (known after apply) + + healthy_threshold = (known after apply) + + interval = (known after apply) + + matcher = (known after apply) + + path = (known after apply) + + port = (known after apply) + + protocol = (known after apply) + + timeout = (known after apply) + + unhealthy_threshold = (known after apply) + } + + + stickiness { + + cookie_duration = (known after apply) + + cookie_name = (known after apply) + + enabled = (known after apply) + + type = (known after apply) + } + } + + # module.c04_iac04_asg.aws_autoscaling_group.asg_1 will be created + + resource "aws_autoscaling_group" "asg_1" { + + arn = (known after apply) + + availability_zones = (known after apply) + + default_cooldown = (known after apply) + + desired_capacity = 2 + + force_delete = true + + force_delete_warm_pool = false + + health_check_grace_period = 300 + + health_check_type = "EC2" + + id = (known after apply) + + launch_configuration = (known after apply) + + max_size = 3 + + metrics_granularity = "1Minute" + + min_size = 1 + + name = "c04-iac04-asg" + + name_prefix = (known after apply) + + protect_from_scale_in = false + + service_linked_role_arn = (known after apply) + + target_group_arns = (known after apply) + + vpc_zone_identifier = (known after apply) + + wait_for_capacity_timeout = "10m" + + + tag { + + key = "Name" + + propagate_at_launch = true + + value = "c04-iac04-asg" + } + } + + # module.c04_iac04_asg.aws_autoscaling_policy.ec2_scale_in_policy will be created + + resource "aws_autoscaling_policy" "ec2_scale_in_policy" { + + adjustment_type = "ChangeInCapacity" + + arn = (known after apply) + + autoscaling_group_name = "c04-iac04-asg" + + cooldown = 300 + + enabled = true + + id = (known after apply) + + metric_aggregation_type = (known after apply) + + name = "ec2_scale_in_policy" + + policy_type = "SimpleScaling" + + scaling_adjustment = -1 + } + + # module.c04_iac04_asg.aws_autoscaling_policy.ec2_scale_out_policy will be created + + resource "aws_autoscaling_policy" "ec2_scale_out_policy" { + + adjustment_type = "ChangeInCapacity" + + arn = (known after apply) + + autoscaling_group_name = "c04-iac04-asg" + + cooldown = 300 + + enabled = true + + id = (known after apply) + + metric_aggregation_type = (known after apply) + + name = "ec2_scale_out_policy" + + policy_type = "SimpleScaling" + + scaling_adjustment = 1 + } + + # module.c04_iac04_asg.aws_cloudwatch_metric_alarm.ec2_scale_in_policy_alarm will be created + + resource "aws_cloudwatch_metric_alarm" "ec2_scale_in_policy_alarm" { + + actions_enabled = true + + alarm_actions = (known after apply) + + alarm_description = "Alert ec2 CPU low usage" + + alarm_name = "ec2-scale-in-policy-alarm" + + arn = (known after apply) + + comparison_operator = "LessThanOrEqualToThreshold" + + dimensions = { + + "AutoScalingGroupName" = "c04-iac04-asg" + } + + evaluate_low_sample_count_percentiles = (known after apply) + + evaluation_periods = 2 + + id = (known after apply) + + metric_name = "CPUUtilization" + + namespace = "AWS/EC2" + + period = 60 + + statistic = "Average" + + tags_all = (known after apply) + + threshold = 30 + + treat_missing_data = "missing" + } + + # module.c04_iac04_asg.aws_cloudwatch_metric_alarm.ec2_scale_out_policy_alarm will be created + + resource "aws_cloudwatch_metric_alarm" "ec2_scale_out_policy_alarm" { + + actions_enabled = true + + alarm_actions = (known after apply) + + alarm_description = "Alert ec2 CPU high usage" + + alarm_name = "ec2-scale-out-policy-alarm" + + arn = (known after apply) + + comparison_operator = "GreaterThanOrEqualToThreshold" + + dimensions = { + + "AutoScalingGroupName" = "c04-iac04-asg" + } + + evaluate_low_sample_count_percentiles = (known after apply) + + evaluation_periods = 2 + + id = (known after apply) + + metric_name = "CPUUtilization" + + namespace = "AWS/EC2" + + period = 60 + + statistic = "Average" + + tags_all = (known after apply) + + threshold = 75 + + treat_missing_data = "missing" + } + + # module.c04_iac04_asg.aws_launch_configuration.launch_config will be created + + resource "aws_launch_configuration" "launch_config" { + + arn = (known after apply) + + associate_public_ip_address = (known after apply) + + ebs_optimized = (known after apply) + + enable_monitoring = true + + id = (known after apply) + + image_id = "ami-0c641f2290e9cd048" + + instance_type = "t2.micro" + + key_name = "kp-devops-academy" + + name = (known after apply) + + name_prefix = "c04-iac04-lc-" + + security_groups = (known after apply) + + + ebs_block_device { + + delete_on_termination = (known after apply) + + device_name = (known after apply) + + encrypted = (known after apply) + + iops = (known after apply) + + no_device = (known after apply) + + snapshot_id = (known after apply) + + throughput = (known after apply) + + volume_size = (known after apply) + + volume_type = (known after apply) + } + + + metadata_options { + + http_endpoint = (known after apply) + + http_put_response_hop_limit = (known after apply) + + http_tokens = (known after apply) + } + + + root_block_device { + + delete_on_termination = (known after apply) + + encrypted = (known after apply) + + iops = (known after apply) + + throughput = (known after apply) + + volume_size = (known after apply) + + volume_type = (known after apply) + } + } + + # module.c04_iac04_sg.aws_security_group.alb_sg_1 will be created + + resource "aws_security_group" "alb_sg_1" { + + arn = (known after apply) + + description = "Allow HTTP traffic" + + egress = [ + + { + + cidr_blocks = [ + + "0.0.0.0/0", + ] + + description = "Allow all egress traffic to anywhere" + + from_port = 0 + + ipv6_cidr_blocks = [] + + prefix_list_ids = [] + + protocol = "-1" + + security_groups = [] + + self = false + + to_port = 0 + }, + ] + + id = (known after apply) + + ingress = [ + + { + + cidr_blocks = [ + + "0.0.0.0/0", + ] + + description = "Allow HTTP ingress traffic from anywhere" + + from_port = 80 + + ipv6_cidr_blocks = [] + + prefix_list_ids = [] + + protocol = "tcp" + + security_groups = [] + + self = false + + to_port = 80 + }, + + { + + cidr_blocks = [ + + "0.0.0.0/0", + ] + + description = "Allow SSH ingress through port 22" + + from_port = 22 + + ipv6_cidr_blocks = [] + + prefix_list_ids = [] + + protocol = "tcp" + + security_groups = [] + + self = false + + to_port = 22 + }, + ] + + name = "c04-iac04-alb-sg" + + name_prefix = (known after apply) + + owner_id = (known after apply) + + revoke_rules_on_delete = false + + tags = { + + "Name" = "c04-iac04-alb-sg" + } + + tags_all = { + + "Name" = "c04-iac04-alb-sg" + } + + vpc_id = (known after apply) + } + + # module.c04_iac04_vpc.aws_internet_gateway.igw will be created + + resource "aws_internet_gateway" "igw" { + + arn = (known after apply) + + id = (known after apply) + + owner_id = (known after apply) + + tags = { + + "Name" = "c04-iac04-igw" + } + + tags_all = { + + "Name" = "c04-iac04-igw" + } + + vpc_id = (known after apply) + } + + # module.c04_iac04_vpc.aws_route_table.pub_rt will be created + + resource "aws_route_table" "pub_rt" { + + arn = (known after apply) + + id = (known after apply) + + owner_id = (known after apply) + + propagating_vgws = (known after apply) + + route = [ + + { + + carrier_gateway_id = "" + + cidr_block = "0.0.0.0/0" + + core_network_arn = "" + + destination_prefix_list_id = "" + + egress_only_gateway_id = "" + + gateway_id = (known after apply) + + instance_id = "" + + ipv6_cidr_block = "" + + local_gateway_id = "" + + nat_gateway_id = "" + + network_interface_id = "" + + transit_gateway_id = "" + + vpc_endpoint_id = "" + + vpc_peering_connection_id = "" + }, + ] + + tags = { + + "Name" = "c04-iac04-public-rt" + } + + tags_all = { + + "Name" = "c04-iac04-public-rt" + } + + vpc_id = (known after apply) + } + + # module.c04_iac04_vpc.aws_route_table_association.pub_subnet_1 will be created + + resource "aws_route_table_association" "pub_subnet_1" { + + id = (known after apply) + + route_table_id = (known after apply) + + subnet_id = (known after apply) + } + + # module.c04_iac04_vpc.aws_route_table_association.pub_subnet_2 will be created + + resource "aws_route_table_association" "pub_subnet_2" { + + id = (known after apply) + + route_table_id = (known after apply) + + subnet_id = (known after apply) + } + + # module.c04_iac04_vpc.aws_route_table_association.pub_subnet_3 will be created + + resource "aws_route_table_association" "pub_subnet_3" { + + id = (known after apply) + + route_table_id = (known after apply) + + subnet_id = (known after apply) + } + + # module.c04_iac04_vpc.aws_subnet.pub_sub_1 will be created + + resource "aws_subnet" "pub_sub_1" { + + arn = (known after apply) + + assign_ipv6_address_on_creation = false + + availability_zone = "ap-southeast-2a" + + availability_zone_id = (known after apply) + + cidr_block = "10.0.1.0/24" + + enable_dns64 = false + + enable_resource_name_dns_a_record_on_launch = false + + enable_resource_name_dns_aaaa_record_on_launch = false + + id = (known after apply) + + ipv6_cidr_block_association_id = (known after apply) + + ipv6_native = false + + map_public_ip_on_launch = true + + owner_id = (known after apply) + + private_dns_hostname_type_on_launch = (known after apply) + + tags = { + + "Name" = "public-subnet-1" + } + + tags_all = { + + "Name" = "public-subnet-1" + } + + vpc_id = (known after apply) + } + + # module.c04_iac04_vpc.aws_subnet.pub_sub_2 will be created + + resource "aws_subnet" "pub_sub_2" { + + arn = (known after apply) + + assign_ipv6_address_on_creation = false + + availability_zone = "ap-southeast-2b" + + availability_zone_id = (known after apply) + + cidr_block = "10.0.2.0/24" + + enable_dns64 = false + + enable_resource_name_dns_a_record_on_launch = false + + enable_resource_name_dns_aaaa_record_on_launch = false + + id = (known after apply) + + ipv6_cidr_block_association_id = (known after apply) + + ipv6_native = false + + map_public_ip_on_launch = true + + owner_id = (known after apply) + + private_dns_hostname_type_on_launch = (known after apply) + + tags = { + + "Name" = "public-subnet-2" + } + + tags_all = { + + "Name" = "public-subnet-2" + } + + vpc_id = (known after apply) + } + + # module.c04_iac04_vpc.aws_subnet.pub_sub_3 will be created + + resource "aws_subnet" "pub_sub_3" { + + arn = (known after apply) + + assign_ipv6_address_on_creation = false + + availability_zone = "ap-southeast-2c" + + availability_zone_id = (known after apply) + + cidr_block = "10.0.3.0/24" + + enable_dns64 = false + + enable_resource_name_dns_a_record_on_launch = false + + enable_resource_name_dns_aaaa_record_on_launch = false + + id = (known after apply) + + ipv6_cidr_block_association_id = (known after apply) + + ipv6_native = false + + map_public_ip_on_launch = true + + owner_id = (known after apply) + + private_dns_hostname_type_on_launch = (known after apply) + + tags = { + + "Name" = "public-subnet-3" + } + + tags_all = { + + "Name" = "public-subnet-3" + } + + vpc_id = (known after apply) + } + + # module.c04_iac04_vpc.aws_vpc.vpc_1 will be created + + resource "aws_vpc" "vpc_1" { + + arn = (known after apply) + + cidr_block = "10.0.0.0/16" + + default_network_acl_id = (known after apply) + + default_route_table_id = (known after apply) + + default_security_group_id = (known after apply) + + dhcp_options_id = (known after apply) + + enable_classiclink = (known after apply) + + enable_classiclink_dns_support = (known after apply) + + enable_dns_hostnames = true + + enable_dns_support = true + + id = (known after apply) + + instance_tenancy = "default" + + ipv6_association_id = (known after apply) + + ipv6_cidr_block = (known after apply) + + ipv6_cidr_block_network_border_group = (known after apply) + + main_route_table_id = (known after apply) + + owner_id = (known after apply) + + tags = { + + "Name" = "c04-iac04-vpc" + } + + tags_all = { + + "Name" = "c04-iac04-vpc" + } + } + +Plan: 19 to add, 0 to change, 0 to destroy. + +Changes to Outputs: + + alb_dns_name = (known after apply) + + public_subnet_1_id = (known after apply) + + public_subnet_2_id = (known after apply) + + public_subnet_3_id = (known after apply) + + vpc_id = (known after apply) +╷ +│ Warning: Version constraints inside provider configuration blocks are deprecated +│ +│ on _provider.tf line 3, in provider "aws": +│ 3: version = "~> 4.0" +│ +│ Terraform 0.13 and earlier allowed provider version constraints inside the provider configuration block, but that is now deprecated and will be removed in a future version of Terraform. To silence this +│ warning, move the provider version constraint into the required_providers block. +╵ + +Do you want to perform these actions? + Terraform will perform the actions described above. + Only 'yes' will be accepted to approve. + + Enter a value: yes + +module.c04_iac04_vpc.aws_vpc.vpc_1: Creating... +module.c04_iac04_vpc.aws_vpc.vpc_1: Still creating... [10s elapsed] +module.c04_iac04_vpc.aws_vpc.vpc_1: Creation complete after 11s [id=vpc-06458e6e06b106ec2] +module.c04_iac04_vpc.aws_internet_gateway.igw: Creating... +module.c04_iac04_vpc.aws_subnet.pub_sub_3: Creating... +module.c04_iac04_vpc.aws_subnet.pub_sub_1: Creating... +module.c04_iac04_vpc.aws_subnet.pub_sub_2: Creating... +module.c04_iac04_vpc.aws_internet_gateway.igw: Creation complete after 0s [id=igw-03d23ebcc167ba6a2] +module.c04_iac04_vpc.aws_route_table.pub_rt: Creating... +module.c04_iac04_vpc.aws_route_table.pub_rt: Creation complete after 1s [id=rtb-0f18ff8d1af7dd3b8] +module.c04_iac04_vpc.aws_subnet.pub_sub_3: Still creating... [10s elapsed] +module.c04_iac04_vpc.aws_subnet.pub_sub_2: Still creating... [10s elapsed] +module.c04_iac04_vpc.aws_subnet.pub_sub_1: Still creating... [10s elapsed] +module.c04_iac04_vpc.aws_subnet.pub_sub_2: Creation complete after 11s [id=subnet-08d28fff4a85e7f4c] +module.c04_iac04_vpc.aws_route_table_association.pub_subnet_2: Creating... +module.c04_iac04_vpc.aws_subnet.pub_sub_1: Creation complete after 11s [id=subnet-02aacb94a956466d6] +module.c04_iac04_vpc.aws_route_table_association.pub_subnet_1: Creating... +module.c04_iac04_vpc.aws_subnet.pub_sub_3: Creation complete after 11s [id=subnet-0a818a6ffa24d46b4] +module.c04_iac04_vpc.aws_route_table_association.pub_subnet_3: Creating... +module.c04_iac04_vpc.aws_route_table_association.pub_subnet_2: Creation complete after 0s [id=rtbassoc-0c9b2e311b107658a] +module.c04_iac04_vpc.aws_route_table_association.pub_subnet_3: Creation complete after 0s [id=rtbassoc-00b84c31486add4d2] +module.c04_iac04_vpc.aws_route_table_association.pub_subnet_1: Creation complete after 0s [id=rtbassoc-071045fc0bba4e0c2] +module.c04_iac04_sg.aws_security_group.alb_sg_1: Creating... +module.c04_iac04_sg.aws_security_group.alb_sg_1: Creation complete after 2s [id=sg-0b9c76bb5ffb68615] +module.c04_iac04_alb.aws_alb.alb_01: Creating... +module.c04_iac04_asg.aws_launch_configuration.launch_config: Creating... +module.c04_iac04_alb.aws_alb_target_group.alb_tg: Creating... +module.c04_iac04_alb.aws_alb_target_group.alb_tg: Creation complete after 0s [id=arn:aws:elasticloadbalancing:ap-southeast-2:191273369808:targetgroup/alb-tg/cb2eb085a3748c3f] +module.c04_iac04_asg.aws_launch_configuration.launch_config: Creation complete after 0s [id=c04-iac04-lc-20220821082516591100000001] +module.c04_iac04_asg.aws_autoscaling_group.asg_1: Creating... +module.c04_iac04_alb.aws_alb.alb_01: Still creating... [10s elapsed] +module.c04_iac04_asg.aws_autoscaling_group.asg_1: Still creating... [10s elapsed] +module.c04_iac04_alb.aws_alb.alb_01: Still creating... [20s elapsed] +module.c04_iac04_asg.aws_autoscaling_group.asg_1: Still creating... [20s elapsed] +module.c04_iac04_alb.aws_alb.alb_01: Still creating... [30s elapsed] +module.c04_iac04_asg.aws_autoscaling_group.asg_1: Still creating... [30s elapsed] +module.c04_iac04_alb.aws_alb.alb_01: Still creating... [40s elapsed] +module.c04_iac04_asg.aws_autoscaling_group.asg_1: Still creating... [40s elapsed] +module.c04_iac04_alb.aws_alb.alb_01: Still creating... [50s elapsed] +module.c04_iac04_asg.aws_autoscaling_group.asg_1: Still creating... [50s elapsed] +module.c04_iac04_alb.aws_alb.alb_01: Still creating... [1m0s elapsed] +module.c04_iac04_asg.aws_autoscaling_group.asg_1: Still creating... [1m0s elapsed] +module.c04_iac04_asg.aws_autoscaling_group.asg_1: Creation complete after 1m5s [id=c04-iac04-asg] +module.c04_iac04_asg.aws_autoscaling_policy.ec2_scale_out_policy: Creating... +module.c04_iac04_asg.aws_autoscaling_policy.ec2_scale_in_policy: Creating... +module.c04_iac04_asg.aws_autoscaling_policy.ec2_scale_in_policy: Creation complete after 0s [id=ec2_scale_in_policy] +module.c04_iac04_asg.aws_cloudwatch_metric_alarm.ec2_scale_in_policy_alarm: Creating... +module.c04_iac04_asg.aws_autoscaling_policy.ec2_scale_out_policy: Creation complete after 0s [id=ec2_scale_out_policy] +module.c04_iac04_asg.aws_cloudwatch_metric_alarm.ec2_scale_out_policy_alarm: Creating... +module.c04_iac04_asg.aws_cloudwatch_metric_alarm.ec2_scale_in_policy_alarm: Creation complete after 0s [id=ec2-scale-in-policy-alarm] +module.c04_iac04_asg.aws_cloudwatch_metric_alarm.ec2_scale_out_policy_alarm: Creation complete after 1s [id=ec2-scale-out-policy-alarm] +module.c04_iac04_alb.aws_alb.alb_01: Still creating... [1m10s elapsed] +module.c04_iac04_alb.aws_alb.alb_01: Still creating... [1m20s elapsed] +module.c04_iac04_alb.aws_alb.alb_01: Still creating... [1m30s elapsed] +module.c04_iac04_alb.aws_alb.alb_01: Still creating... [1m40s elapsed] +module.c04_iac04_alb.aws_alb.alb_01: Still creating... [1m50s elapsed] +module.c04_iac04_alb.aws_alb.alb_01: Still creating... [2m0s elapsed] +module.c04_iac04_alb.aws_alb.alb_01: Creation complete after 2m1s [id=arn:aws:elasticloadbalancing:ap-southeast-2:191273369808:loadbalancer/app/c04-iac04-alb/a56962b02a3797e8] +module.c04_iac04_alb.aws_alb_listener.alb_listener: Creating... +module.c04_iac04_alb.aws_alb_listener.alb_listener: Creation complete after 0s [id=arn:aws:elasticloadbalancing:ap-southeast-2:191273369808:listener/app/c04-iac04-alb/a56962b02a3797e8/cf44580411523fa5] + +Apply complete! Resources: 19 added, 0 changed, 0 destroyed. + +Outputs: + +alb_dns_name = "c04-iac04-alb-370937775.ap-southeast-2.elb.amazonaws.com" +public_subnet_1_id = "subnet-02aacb94a956466d6" +public_subnet_2_id = "subnet-08d28fff4a85e7f4c" +public_subnet_3_id = "subnet-0a818a6ffa24d46b4" +vpc_id = "vpc-06458e6e06b106ec2" \ No newline at end of file diff --git a/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/_backend.tf b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/_backend.tf new file mode 100644 index 000000000..16a54793b --- /dev/null +++ b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/_backend.tf @@ -0,0 +1,6 @@ +# Define where the terraform state will be stored +terraform { + backend "local" { + path = "./terraform.tfstate" + } +} \ No newline at end of file diff --git a/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/_provider.tf b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/_provider.tf new file mode 100644 index 000000000..16c03ffb2 --- /dev/null +++ b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/_provider.tf @@ -0,0 +1,5 @@ +# Configure the AWS Provider +provider "aws" { + version = "~> 4.0" + region = "ap-southeast-2" +} \ No newline at end of file diff --git a/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_alb/main.tf b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_alb/main.tf new file mode 100644 index 000000000..dce6380ac --- /dev/null +++ b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_alb/main.tf @@ -0,0 +1,36 @@ +resource "aws_alb" "alb_01" { + name = var.alb_name + internal = false + load_balancer_type = "application" + security_groups = [var.alb_sg_id] + subnets = [var.pub_cidr_id_1, var.pub_cidr_id_2, var.pub_cidr_id_3] + + enable_deletion_protection = false + + tags = { + Name = var.alb_name + } +} + +resource "aws_alb_target_group" "alb_tg" { + name = "alb-tg" + target_type = "instance" + port = 80 + protocol = "HTTP" + vpc_id = var.vpc_id + + tags = { + Name = "alb_tg_c04-iac04" + } +} + +resource "aws_alb_listener" "alb_listener" { + load_balancer_arn = aws_alb.alb_01.arn + port = 80 + protocol = "HTTP" + + default_action { + type = "forward" + target_group_arn = aws_alb_target_group.alb_tg.arn + } +} \ No newline at end of file diff --git a/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_alb/output.tf b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_alb/output.tf new file mode 100644 index 000000000..82c40f4f2 --- /dev/null +++ b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_alb/output.tf @@ -0,0 +1,9 @@ +output "alb_dns_name" { + description = "ALB DNS name" + value = aws_alb.alb_01.dns_name +} + +output "alb_tg_arn" { + description = "ALB TG ARN" + value = aws_alb_target_group.alb_tg.arn +} \ No newline at end of file diff --git a/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_alb/variables.tf b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_alb/variables.tf new file mode 100644 index 000000000..532df1191 --- /dev/null +++ b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_alb/variables.tf @@ -0,0 +1,26 @@ +#Public subnet CIDRs +variable "pub_cidr_id_1" { + type = string +} + +variable "pub_cidr_id_2" { + type = string +} + +variable "pub_cidr_id_3" { + type = string +} + +#ALB values +variable "alb_name" { + type = string +} + +variable "alb_sg_id" { + type = string +} + +variable "vpc_id" { + type = string +} + diff --git a/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_asg/main.tf b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_asg/main.tf new file mode 100644 index 000000000..9104485f8 --- /dev/null +++ b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_asg/main.tf @@ -0,0 +1,94 @@ +#Launch configuration +resource "aws_launch_configuration" "launch_config" { + name_prefix = "c04-iac04-lc-" + image_id = var.ami_id + instance_type = var.instance_type + security_groups = [var.alb_sg_id] + key_name = "kp-devops-academy" + + lifecycle { + create_before_destroy = true + } +} + +#ASG +resource "aws_autoscaling_group" "asg_1" { + name = "c04-iac04-asg" + min_size = var.asg_min + desired_capacity = var.asg_desired + max_size = var.asg_max + + vpc_zone_identifier = [var.pub_cidr_id_1, var.pub_cidr_id_2, var.pub_cidr_id_3] + force_delete = true + launch_configuration = aws_launch_configuration.launch_config.name + health_check_type = "EC2" + target_group_arns = [var.alb_tg_arn] + + tag { + key = "Name" + value = "c04-iac04-asg" + propagate_at_launch = true + } + + depends_on = [aws_launch_configuration.launch_config] +} + +# ASG Policies +resource "aws_autoscaling_policy" "ec2_scale_out_policy" { + name = "ec2_scale_out_policy" + scaling_adjustment = 1 + adjustment_type = "ChangeInCapacity" + cooldown = 300 + autoscaling_group_name = aws_autoscaling_group.asg_1.name + policy_type = "SimpleScaling" +} + +resource "aws_autoscaling_policy" "ec2_scale_in_policy" { + name = "ec2_scale_in_policy" + scaling_adjustment = -1 + adjustment_type = "ChangeInCapacity" + cooldown = 300 + autoscaling_group_name = aws_autoscaling_group.asg_1.name + policy_type = "SimpleScaling" +} + +#Cloud Watch alarms +resource "aws_cloudwatch_metric_alarm" "ec2_scale_out_policy_alarm" { + alarm_name = "ec2-scale-out-policy-alarm" + alarm_description = "Alert ec2 CPU high usage" + namespace = "AWS/EC2" + comparison_operator = "GreaterThanOrEqualToThreshold" + metric_name = "CPUUtilization" + statistic = "Average" + actions_enabled = true + + evaluation_periods = 2 + period = 60 + threshold = 75 + + dimensions = { + "AutoScalingGroupName" = aws_autoscaling_group.asg_1.name + } + + alarm_actions = [aws_autoscaling_policy.ec2_scale_out_policy.arn] +} + +resource "aws_cloudwatch_metric_alarm" "ec2_scale_in_policy_alarm" { + alarm_name = "ec2-scale-in-policy-alarm" + alarm_description = "Alert ec2 CPU low usage" + namespace = "AWS/EC2" + comparison_operator = "LessThanOrEqualToThreshold" + metric_name = "CPUUtilization" + statistic = "Average" + actions_enabled = true + + evaluation_periods = 2 + period = 60 + threshold = 30 + + dimensions = { + "AutoScalingGroupName" = aws_autoscaling_group.asg_1.name + } + + alarm_actions = [aws_autoscaling_policy.ec2_scale_in_policy.arn] +} \ No newline at end of file diff --git a/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_asg/output.tf b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_asg/output.tf new file mode 100644 index 000000000..a4da275b9 --- /dev/null +++ b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_asg/output.tf @@ -0,0 +1,4 @@ +output "asg_id" { + description = "ASG id" + value = aws_autoscaling_group.asg_1.id +} \ No newline at end of file diff --git a/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_asg/variables.tf b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_asg/variables.tf new file mode 100644 index 000000000..1f63c1490 --- /dev/null +++ b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_asg/variables.tf @@ -0,0 +1,43 @@ +#EC2 instance +variable "ami_id" { + type = string +} + +variable "instance_type" { + type = string +} + +#Public subnets CIDR IDs +variable "pub_cidr_id_1" { + type = string +} + +variable "pub_cidr_id_2" { + type = string +} + +variable "pub_cidr_id_3" { + type = string +} + +#ASG policy values +variable "asg_desired" { + type = string +} + +variable "asg_min" { + type = string +} + +variable "asg_max" { + type = string +} + +#ALB target group ARN +variable "alb_tg_arn" { + type = string +} + +variable "alb_sg_id" { + type = string +} \ No newline at end of file diff --git a/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_sg/main.tf b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_sg/main.tf new file mode 100644 index 000000000..a07cc99a1 --- /dev/null +++ b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_sg/main.tf @@ -0,0 +1,33 @@ +resource "aws_security_group" "alb_sg_1" { + name = var.alb_sg_name + description = "Allow HTTP traffic" + vpc_id = var.vpc_id + + ingress { + description = "Allow HTTP ingress traffic from anywhere" + protocol = "tcp" + from_port = 80 + to_port = 80 + cidr_blocks = ["0.0.0.0/0"] + } + + ingress { + description = "Allow SSH ingress through port 22" + protocol = "tcp" + from_port = 22 + to_port = 22 + cidr_blocks = ["0.0.0.0/0"] + } + + egress { + description = "Allow all egress traffic to anywhere" + from_port = 0 + to_port = 0 + protocol = "-1" + cidr_blocks = ["0.0.0.0/0"] + } + + tags = { + Name = var.alb_sg_name + } +} \ No newline at end of file diff --git a/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_sg/output.tf b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_sg/output.tf new file mode 100644 index 000000000..72c4e2c50 --- /dev/null +++ b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_sg/output.tf @@ -0,0 +1,4 @@ +output "alb_sg_id" { + description = "ALB SG ID" + value = aws_security_group.alb_sg_1.id +} \ No newline at end of file diff --git a/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_sg/variables.tf b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_sg/variables.tf new file mode 100644 index 000000000..9588e1aa2 --- /dev/null +++ b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_sg/variables.tf @@ -0,0 +1,7 @@ +variable "vpc_id" { + type = string +} + +variable "alb_sg_name" { + type = string +} \ No newline at end of file diff --git a/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_vpc/main.tf b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_vpc/main.tf new file mode 100644 index 000000000..5f95bc034 --- /dev/null +++ b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_vpc/main.tf @@ -0,0 +1,82 @@ +#VPC +resource "aws_vpc" "vpc_1" { + cidr_block = var.vpc_cidr + enable_dns_support = "true" # + enable_dns_hostnames = "true" # + + tags = { + Name = var.vpc_name + } +} + +#Public subnets +resource "aws_subnet" "pub_sub_1" { + vpc_id = aws_vpc.vpc_1.id + cidr_block = var.pub_sub_cidr_1 + availability_zone = var.az_a + map_public_ip_on_launch = true + + tags = { + Name = var.pub_sub_name_1 + } +} + +resource "aws_subnet" "pub_sub_2" { + vpc_id = aws_vpc.vpc_1.id + cidr_block = var.pub_sub_cidr_2 + availability_zone = var.az_b + map_public_ip_on_launch = true + + tags = { + Name = var.pub_sub_name_2 + } +} + +resource "aws_subnet" "pub_sub_3" { + vpc_id = aws_vpc.vpc_1.id + cidr_block = var.pub_sub_cidr_3 + availability_zone = var.az_c + map_public_ip_on_launch = true + + tags = { + Name = var.pub_sub_name_3 + } +} + +#Internet gateway +resource "aws_internet_gateway" "igw" { + vpc_id = aws_vpc.vpc_1.id + + tags = { + Name = var.igw_name + } +} + +resource "aws_route_table" "pub_rt" { + vpc_id = aws_vpc.vpc_1.id + + route { + cidr_block = "0.0.0.0/0" + gateway_id = aws_internet_gateway.igw.id + } + + tags = { + Name = var.pub_rt_name + } +} + +#Associated route tables +resource "aws_route_table_association" "pub_subnet_1" { + subnet_id = aws_subnet.pub_sub_1.id + route_table_id = aws_route_table.pub_rt.id +} + +resource "aws_route_table_association" "pub_subnet_2" { + subnet_id = aws_subnet.pub_sub_2.id + route_table_id = aws_route_table.pub_rt.id +} + +resource "aws_route_table_association" "pub_subnet_3" { + subnet_id = aws_subnet.pub_sub_3.id + route_table_id = aws_route_table.pub_rt.id +} \ No newline at end of file diff --git a/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_vpc/output.tf b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_vpc/output.tf new file mode 100644 index 000000000..bd80fe010 --- /dev/null +++ b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_vpc/output.tf @@ -0,0 +1,16 @@ +output "vpc_id" { + description = "VPC ID" + value = aws_vpc.vpc_1.id +} + +output "pub_cidr_id_1" { + value = aws_subnet.pub_sub_1.id +} + +output "pub_cidr_id_2" { + value = aws_subnet.pub_sub_2.id +} + +output "pub_cidr_id_3" { + value = aws_subnet.pub_sub_3.id +} \ No newline at end of file diff --git a/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_vpc/variables.tf b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_vpc/variables.tf new file mode 100644 index 000000000..2fbb652be --- /dev/null +++ b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/iac-04-module/c04_iac04_vpc/variables.tf @@ -0,0 +1,57 @@ +#VPC +variable "vpc_cidr" { + description = "VPC CIDR" + type = string +} + +variable "vpc_name" { + description = "Name to set on the VPC" + type = string +} + +#Availability zones +variable "az_a" { + type = string +} + +variable "az_b" { + type = string +} + +variable "az_c" { + type = string +} + +#Public subnet values +variable "pub_sub_name_1" { + type = string +} + +variable "pub_sub_name_2" { + type = string +} + +variable "pub_sub_name_3" { + type = string +} + +variable "pub_sub_cidr_1" { + type = string +} + +variable "pub_sub_cidr_2" { + type = string +} + +variable "pub_sub_cidr_3" { + type = string +} + +#Internet Gateway +variable "igw_name" { + type = string +} + +variable "pub_rt_name" { + type = string +} \ No newline at end of file diff --git a/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/main.tf b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/main.tf new file mode 100644 index 000000000..b3f18b02c --- /dev/null +++ b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/main.tf @@ -0,0 +1,57 @@ +module "c04_iac04_vpc" { + source = "./iac-04-module/c04_iac04_vpc" + + vpc_cidr = var.vpc_cidr + vpc_name = var.vpc_name + az_a = var.az_a + az_b = var.az_b + az_c = var.az_c + pub_sub_name_1 = var.pub_sub_name_1 + pub_sub_name_2 = var.pub_sub_name_2 + pub_sub_name_3 = var.pub_sub_name_3 + pub_sub_cidr_1 = var.pub_sub_cidr_1 + pub_sub_cidr_2 = var.pub_sub_cidr_2 + pub_sub_cidr_3 = var.pub_sub_cidr_3 + igw_name = var.igw_name + pub_rt_name = var.pub_rt_name +} + +module "c04_iac04_sg" { + source = "./iac-04-module/c04_iac04_sg" + + vpc_id = module.c04_iac04_vpc.vpc_id + alb_sg_name = var.alb_sg_name + + depends_on = [module.c04_iac04_vpc] +} + +module "c04_iac04_alb" { + source = "./iac-04-module/c04_iac04_alb" + + pub_cidr_id_1 = module.c04_iac04_vpc.pub_cidr_id_1 + pub_cidr_id_2 = module.c04_iac04_vpc.pub_cidr_id_2 + pub_cidr_id_3 = module.c04_iac04_vpc.pub_cidr_id_3 + alb_name = var.alb_name + alb_sg_id = module.c04_iac04_sg.alb_sg_id + vpc_id = module.c04_iac04_vpc.vpc_id + + depends_on = [module.c04_iac04_vpc, module.c04_iac04_sg] +} + + +module "c04_iac04_asg" { + source = "./iac-04-module/c04_iac04_asg" + + ami_id = var.ami_id + instance_type = var.instance_type + pub_cidr_id_1 = module.c04_iac04_vpc.pub_cidr_id_1 + pub_cidr_id_2 = module.c04_iac04_vpc.pub_cidr_id_2 + pub_cidr_id_3 = module.c04_iac04_vpc.pub_cidr_id_3 + asg_desired = var.asg_desired + asg_min = var.asg_min + asg_max = var.asg_max + alb_tg_arn = module.c04_iac04_alb.alb_tg_arn + alb_sg_id = module.c04_iac04_sg.alb_sg_id + + depends_on = [module.c04_iac04_vpc, module.c04_iac04_sg] +} \ No newline at end of file diff --git a/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/main.tfvars b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/main.tfvars new file mode 100644 index 000000000..5bbd1a182 --- /dev/null +++ b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/main.tfvars @@ -0,0 +1,19 @@ +#VPC values +vpc_cidr = "10.0.0.0/16" + +#Public subnet values +pub_sub_name_1 = "public-subnet-1" +pub_sub_name_2 = "public-subnet-2" +pub_sub_name_3 = "public-subnet-3" +pub_sub_cidr_1 = "10.0.1.0/24" +pub_sub_cidr_2 = "10.0.2.0/24" +pub_sub_cidr_3 = "10.0.3.0/24" + +#AMI Image +ami_id = "ami-0c641f2290e9cd048" +instance_type = "t2.micro" + +#ASG policy +asg_min = "1" +asg_desired = "2" +asg_max = "3" \ No newline at end of file diff --git a/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/output.tf b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/output.tf new file mode 100644 index 000000000..660c14953 --- /dev/null +++ b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/output.tf @@ -0,0 +1,24 @@ +output "vpc_id" { + description = "VPC ID" + value = module.c04_iac04_vpc.vpc_id +} + +output "public_subnet_1_id" { + description = "Public Subnet ID for AZ-a" + value = module.c04_iac04_vpc.pub_cidr_id_1 +} + +output "public_subnet_2_id" { + description = "Public Subnet ID for AZ-b" + value = module.c04_iac04_vpc.pub_cidr_id_2 +} + +output "public_subnet_3_id" { + description = "Public Subnet ID for AZ-c" + value = module.c04_iac04_vpc.pub_cidr_id_3 +} + +output "alb_dns_name" { + description = "ALB DNS name" + value = module.c04_iac04_alb.alb_dns_name +} \ No newline at end of file diff --git a/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/variables.tf b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/variables.tf new file mode 100644 index 000000000..a33e914e3 --- /dev/null +++ b/classes/04class/exercises/c04-iac04/julio-pimentel/terraform-code/variables.tf @@ -0,0 +1,100 @@ +# Region and AZs +variable "aws_region" { + default = "ap-southeast-2" +} + +variable "az_a" { + type = string + default = "ap-southeast-2a" +} + +variable "az_b" { + type = string + default = "ap-southeast-2b" +} + +variable "az_c" { + type = string + default = "ap-southeast-2c" +} + +#VPC +variable "vpc_cidr" { + description = "VPC CIDR" + type = string +} + +variable "vpc_name" { + description = "Name to set on the VPC" + type = string + default = "c04-iac04-vpc" +} + +#Public subnet values +variable "pub_sub_name_1" { + type = string +} + +variable "pub_sub_name_2" { + type = string +} + +variable "pub_sub_name_3" { + type = string +} + +variable "pub_sub_cidr_1" { + type = string +} + +variable "pub_sub_cidr_2" { + type = string +} + +variable "pub_sub_cidr_3" { + type = string +} + +#Internet Gateway +variable "igw_name" { + type = string + default = "c04-iac04-igw" +} + +variable "pub_rt_name" { + type = string + default = "c04-iac04-public-rt" +} + +#ALB +variable "alb_name" { + type = string + default = "c04-iac04-alb" +} + +variable "alb_sg_name" { + type = string + default = "c04-iac04-alb-sg" +} + +#EC2 instance +variable "ami_id" { + type = string +} + +variable "instance_type" { + type = string +} + +#ASG policy values +variable "asg_min" { + type = string +} + +variable "asg_desired" { + type = string +} + +variable "asg_max" { + type = string +} \ No newline at end of file