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