From b336d3874c2c1a6abf0c1df374b8ee1bba229c8a Mon Sep 17 00:00:00 2001 From: Chirag Patel Date: Sun, 18 Aug 2024 20:51:20 +0530 Subject: [PATCH] Added Devops assessment code --- .github/workflows/push.yaml | 57 ++++ .gitignore | 6 +- Dockerfile | 20 ++ terraform/autoscaling.tf | 27 ++ terraform/cluster.tf | 3 + terraform/ecr.tf | 3 + terraform/main.tf | 7 + terraform/provider.tf | 3 + terraform/secrets-manager.tf | 0 terraform/service.tf | 33 +++ terraform/terraform.tfstate.backup | 420 +++++++++++++++++++++++++++++ terraform/variables.tf | 4 + terraform/vpc.tf | 71 +++++ 13 files changed, 653 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/push.yaml create mode 100644 Dockerfile delete mode 100644 terraform/secrets-manager.tf create mode 100644 terraform/terraform.tfstate.backup create mode 100644 terraform/variables.tf create mode 100644 terraform/vpc.tf diff --git a/.github/workflows/push.yaml b/.github/workflows/push.yaml new file mode 100644 index 0000000..2d6427f --- /dev/null +++ b/.github/workflows/push.yaml @@ -0,0 +1,57 @@ +name: Push the Docker image to AWS ECR Repo & ECR Service +on: + push: + branches: + - chirag-devops-assessment + +jobs: + Build: + name: Build + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v1 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: ap-south-1 + + - name: Login to Amazon ECR + id: login-ecr + uses: aws-actions/amazon-ecr-login@v1 + + - name: Get commit hash + id: get-commit-hash + run: echo "::set-output name=commit-hash::$(git rev-parse --short HEAD)" + + - name: Get timestamp + id: get-timestamp + run: echo "::set-output name=timestamp::$(date +'%Y-%m-%d-%H-%M')" + + - name: Build, tag, and push the image to Amazon ECR + id: build-image + env: + ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} + ECR_REPOSITORY: ${{ secrets.REPO_NAME }} + IMAGE_TAG: ${{ steps.get-commit-hash.outputs.commit-hash }}-${{ steps.get-timestamp.outputs.timestamp }} + run: | + docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG . + docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG + + - name: Setup Terraform with specified version on the runner + uses: hashicorp/setup-terraform@v2 + with: + terraform_version: 1.7.4 + + - name: Terraform Apply + id: init + run: | + cd terraform/ + terraform init + terraform validate + terraform plan + terraform apply -auto-approve -var image_tag=${{ steps.get-commit-hash.outputs.commit-hash }}-${{ steps.get-timestamp.outputs.timestamp }} + \ No newline at end of file diff --git a/.gitignore b/.gitignore index 98a6e38..e43990d 100644 --- a/.gitignore +++ b/.gitignore @@ -38,4 +38,8 @@ testem.log .DS_Store Thumbs.db -.nx/cache \ No newline at end of file +.nx/cache + +.terraform +.terraform.lock.hcl +terraform.tfstate \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..0d5e803 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,20 @@ +# Use an official Node.js runtime as a parent image +FROM node:21.7.3-alpine3.20 + +# Set the working directory in the container +WORKDIR /app + +# Copy package.json and package-lock.json +COPY package*.json ./ + +# Install dependencies +RUN npm install + +# Copy the rest of the application code +COPY . . + +# Expose the port the app runs on +EXPOSE 3000 + +# Command to run the application +CMD ["npx", "nx", "serve", "pt-notification-service"] \ No newline at end of file diff --git a/terraform/autoscaling.tf b/terraform/autoscaling.tf index e69de29..ed19ca2 100644 --- a/terraform/autoscaling.tf +++ b/terraform/autoscaling.tf @@ -0,0 +1,27 @@ +resource "aws_appautoscaling_target" "ecs_target" { + max_capacity = 2 + min_capacity = 1 + resource_id = "service/${aws_ecs_cluster.devops_assessment_cluster.name}/${aws_ecs_service.devops_assessment_ecs_service.name}" + scalable_dimension = "ecs:service:DesiredCount" + service_namespace = "ecs" +} + + +resource "aws_appautoscaling_policy" "ecs_policy" { + name = "scale-down" + policy_type = "StepScaling" + resource_id = aws_appautoscaling_target.ecs_target.resource_id + scalable_dimension = aws_appautoscaling_target.ecs_target.scalable_dimension + service_namespace = aws_appautoscaling_target.ecs_target.service_namespace + + step_scaling_policy_configuration { + adjustment_type = "ChangeInCapacity" + cooldown = 60 + metric_aggregation_type = "Maximum" + + step_adjustment { + metric_interval_upper_bound = 0 + scaling_adjustment = -1 + } + } +} \ No newline at end of file diff --git a/terraform/cluster.tf b/terraform/cluster.tf index e69de29..45eef56 100644 --- a/terraform/cluster.tf +++ b/terraform/cluster.tf @@ -0,0 +1,3 @@ +resource "aws_ecs_cluster" "devops_assessment_cluster" { + name = "devopsAssessmentCluster" +} \ No newline at end of file diff --git a/terraform/ecr.tf b/terraform/ecr.tf index e69de29..1c805db 100644 --- a/terraform/ecr.tf +++ b/terraform/ecr.tf @@ -0,0 +1,3 @@ +resource "aws_ecr_repository" "devops_assessment_repository" { + name = "devops-assessment-repository" +} \ No newline at end of file diff --git a/terraform/main.tf b/terraform/main.tf index e69de29..6811c6c 100644 --- a/terraform/main.tf +++ b/terraform/main.tf @@ -0,0 +1,7 @@ +terraform { + backend "s3" { + bucket = "devops-assessment-chirag-terraform" + key = "terraform.tfstate" + region = "ap-south-1" + } +} diff --git a/terraform/provider.tf b/terraform/provider.tf index e69de29..9775c84 100644 --- a/terraform/provider.tf +++ b/terraform/provider.tf @@ -0,0 +1,3 @@ +provider "aws" { + region = "ap-south-1" +} \ No newline at end of file diff --git a/terraform/secrets-manager.tf b/terraform/secrets-manager.tf deleted file mode 100644 index e69de29..0000000 diff --git a/terraform/service.tf b/terraform/service.tf index e69de29..c89fe9f 100644 --- a/terraform/service.tf +++ b/terraform/service.tf @@ -0,0 +1,33 @@ +resource "aws_ecs_task_definition" "devops_assessment_etd" { + family = "devopsAssessmentTd" + network_mode = "awsvpc" + requires_compatibilities = ["FARGATE"] + cpu = "256" + memory = "512" + execution_role_arn = "arn:aws:iam::279660579228:role/ecsTaskExecutionRole" + + container_definitions = jsonencode([{ + name = "devops-assessment" + image = "${aws_ecr_repository.devops_assessment_repository.repository_url}:${var.image_tag}" + essential = true + portMappings = [{ + containerPort = 3000 + hostPort = 3000 + }] + }]) +} + +resource "aws_ecs_service" "devops_assessment_ecs_service" { + task_definition = aws_ecs_task_definition.devops_assessment_etd.id + cluster = aws_ecs_cluster.devops_assessment_cluster.id + launch_type = "FARGATE" + name = "devopsAssessmentEcsService" + desired_count = 1 + network_configuration { + subnets = aws_subnet.devops_assessment_subnet[*].id + security_groups = [ + aws_security_group.sg.id + ] + assign_public_ip = true + } +} \ No newline at end of file diff --git a/terraform/terraform.tfstate.backup b/terraform/terraform.tfstate.backup new file mode 100644 index 0000000..bd07fe1 --- /dev/null +++ b/terraform/terraform.tfstate.backup @@ -0,0 +1,420 @@ +{ + "version": 4, + "terraform_version": "1.7.4", + "serial": 67, + "lineage": "4f1e0128-5b06-b33b-a0dd-2de1b3954c0e", + "outputs": {}, + "resources": [ + { + "mode": "managed", + "type": "aws_ecr_repository", + "name": "devops_assessment_repository", + "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]", + "instances": [ + { + "schema_version": 0, + "attributes": { + "arn": "arn:aws:ecr:ap-south-1:279660579228:repository/devops-assessment-repository", + "encryption_configuration": [ + { + "encryption_type": "AES256", + "kms_key": "" + } + ], + "force_delete": null, + "id": "devops-assessment-repository", + "image_scanning_configuration": [ + { + "scan_on_push": false + } + ], + "image_tag_mutability": "MUTABLE", + "name": "devops-assessment-repository", + "registry_id": "279660579228", + "repository_url": "279660579228.dkr.ecr.ap-south-1.amazonaws.com/devops-assessment-repository", + "tags": {}, + "tags_all": {}, + "timeouts": null + }, + "sensitive_attributes": [], + "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiZGVsZXRlIjoxMjAwMDAwMDAwMDAwfX0=" + } + ] + }, + { + "mode": "managed", + "type": "aws_ecs_cluster", + "name": "devops_assessment_cluster", + "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]", + "instances": [ + { + "schema_version": 0, + "attributes": { + "arn": "arn:aws:ecs:ap-south-1:279660579228:cluster/devopsAssessmentCluster", + "configuration": [], + "id": "arn:aws:ecs:ap-south-1:279660579228:cluster/devopsAssessmentCluster", + "name": "devopsAssessmentCluster", + "service_connect_defaults": [], + "setting": [ + { + "name": "containerInsights", + "value": "disabled" + } + ], + "tags": {}, + "tags_all": {} + }, + "sensitive_attributes": [], + "private": "bnVsbA==" + } + ] + }, + { + "mode": "managed", + "type": "aws_ecs_service", + "name": "devops_assessment_ecs_service", + "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]", + "instances": [ + { + "schema_version": 1, + "attributes": { + "alarms": [], + "capacity_provider_strategy": [], + "cluster": "arn:aws:ecs:ap-south-1:279660579228:cluster/devopsAssessmentCluster", + "deployment_circuit_breaker": [ + { + "enable": false, + "rollback": false + } + ], + "deployment_controller": [ + { + "type": "ECS" + } + ], + "deployment_maximum_percent": 200, + "deployment_minimum_healthy_percent": 100, + "desired_count": 1, + "enable_ecs_managed_tags": false, + "enable_execute_command": false, + "force_delete": null, + "force_new_deployment": null, + "health_check_grace_period_seconds": 0, + "iam_role": "/aws-service-role/ecs.amazonaws.com/AWSServiceRoleForECS", + "id": "arn:aws:ecs:ap-south-1:279660579228:service/devopsAssessmentCluster/devopsAssessmentEcsService", + "launch_type": "FARGATE", + "load_balancer": [], + "name": "devopsAssessmentEcsService", + "network_configuration": [ + { + "assign_public_ip": true, + "security_groups": [ + "sg-0b0edba160630647c" + ], + "subnets": [ + "subnet-0816729da4e32856d" + ] + } + ], + "ordered_placement_strategy": [], + "placement_constraints": [], + "platform_version": "LATEST", + "propagate_tags": "NONE", + "scheduling_strategy": "REPLICA", + "service_connect_configuration": [], + "service_registries": [], + "tags": {}, + "tags_all": {}, + "task_definition": "devopsAssessmentTd:6", + "timeouts": null, + "triggers": {}, + "volume_configuration": [], + "wait_for_steady_state": false + }, + "sensitive_attributes": [], + "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInVwZGF0ZSI6MTIwMDAwMDAwMDAwMH0sInNjaGVtYV92ZXJzaW9uIjoiMSJ9", + "dependencies": [ + "aws_ecr_repository.devops_assessment_repository", + "aws_ecs_cluster.devops_assessment_cluster", + "aws_ecs_task_definition.devops_assessment_etd", + "aws_security_group.sg", + "aws_subnet.devops_assessment_subnet", + "aws_vpc.devops_assessment_vpc" + ] + } + ] + }, + { + "mode": "managed", + "type": "aws_ecs_task_definition", + "name": "devops_assessment_etd", + "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]", + "instances": [ + { + "schema_version": 1, + "attributes": { + "arn": "arn:aws:ecs:ap-south-1:279660579228:task-definition/devopsAssessmentTd:6", + "arn_without_revision": "arn:aws:ecs:ap-south-1:279660579228:task-definition/devopsAssessmentTd", + "container_definitions": "[{\"environment\":[],\"essential\":true,\"image\":\"279660579228.dkr.ecr.ap-south-1.amazonaws.com/devops-assessment-repository:c75bebd-2024-08-18-16-16\",\"mountPoints\":[],\"name\":\"devops-assessment\",\"portMappings\":[{\"containerPort\":3000,\"hostPort\":3000,\"protocol\":\"tcp\"}],\"systemControls\":[],\"volumesFrom\":[]}]", + "cpu": "256", + "ephemeral_storage": [], + "execution_role_arn": "arn:aws:iam::279660579228:role/ecsTaskExecutionRole", + "family": "devopsAssessmentTd", + "id": "devopsAssessmentTd", + "inference_accelerator": [], + "ipc_mode": "", + "memory": "512", + "network_mode": "awsvpc", + "pid_mode": "", + "placement_constraints": [], + "proxy_configuration": [], + "requires_compatibilities": [ + "FARGATE" + ], + "revision": 6, + "runtime_platform": [], + "skip_destroy": false, + "tags": null, + "tags_all": {}, + "task_role_arn": "", + "track_latest": false, + "volume": [] + }, + "sensitive_attributes": [], + "private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ==", + "dependencies": [ + "aws_ecr_repository.devops_assessment_repository" + ] + } + ] + }, + { + "mode": "managed", + "type": "aws_internet_gateway", + "name": "devops_assessment_igw", + "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]", + "instances": [ + { + "schema_version": 0, + "attributes": { + "arn": "arn:aws:ec2:ap-south-1:279660579228:internet-gateway/igw-040d0d0eaaef4f741", + "id": "igw-040d0d0eaaef4f741", + "owner_id": "279660579228", + "tags": { + "Name": "devops_assessment_igw" + }, + "tags_all": { + "Name": "devops_assessment_igw" + }, + "timeouts": null, + "vpc_id": "vpc-026c8adbbdd34f254" + }, + "sensitive_attributes": [], + "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInVwZGF0ZSI6MTIwMDAwMDAwMDAwMH19", + "dependencies": [ + "aws_vpc.devops_assessment_vpc" + ] + } + ] + }, + { + "mode": "managed", + "type": "aws_route_table", + "name": "devops_assessment_rt", + "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]", + "instances": [ + { + "schema_version": 0, + "attributes": { + "arn": "arn:aws:ec2:ap-south-1:279660579228:route-table/rtb-06ef8f4c249626a09", + "id": "rtb-06ef8f4c249626a09", + "owner_id": "279660579228", + "propagating_vgws": [], + "route": [ + { + "carrier_gateway_id": "", + "cidr_block": "0.0.0.0/0", + "core_network_arn": "", + "destination_prefix_list_id": "", + "egress_only_gateway_id": "", + "gateway_id": "igw-040d0d0eaaef4f741", + "ipv6_cidr_block": "", + "local_gateway_id": "", + "nat_gateway_id": "", + "network_interface_id": "", + "transit_gateway_id": "", + "vpc_endpoint_id": "", + "vpc_peering_connection_id": "" + } + ], + "tags": { + "Name": "igw-route" + }, + "tags_all": { + "Name": "igw-route" + }, + "timeouts": null, + "vpc_id": "vpc-026c8adbbdd34f254" + }, + "sensitive_attributes": [], + "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjozMDAwMDAwMDAwMDAsImRlbGV0ZSI6MzAwMDAwMDAwMDAwLCJ1cGRhdGUiOjEyMDAwMDAwMDAwMH19", + "dependencies": [ + "aws_internet_gateway.devops_assessment_igw", + "aws_vpc.devops_assessment_vpc" + ] + } + ] + }, + { + "mode": "managed", + "type": "aws_security_group", + "name": "sg", + "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]", + "instances": [ + { + "schema_version": 1, + "attributes": { + "arn": "arn:aws:ec2:ap-south-1:279660579228:security-group/sg-0b0edba160630647c", + "description": "Managed by Terraform", + "egress": [ + { + "cidr_blocks": [ + "0.0.0.0/0" + ], + "description": "", + "from_port": 0, + "ipv6_cidr_blocks": [], + "prefix_list_ids": [], + "protocol": "-1", + "security_groups": [], + "self": false, + "to_port": 0 + } + ], + "id": "sg-0b0edba160630647c", + "ingress": [ + { + "cidr_blocks": [ + "0.0.0.0/0" + ], + "description": "", + "from_port": 0, + "ipv6_cidr_blocks": [], + "prefix_list_ids": [], + "protocol": "-1", + "security_groups": [], + "self": false, + "to_port": 0 + } + ], + "name": "terraform-20240818161528788500000001", + "name_prefix": "terraform-", + "owner_id": "279660579228", + "revoke_rules_on_delete": false, + "tags": { + "Name": "sg" + }, + "tags_all": { + "Name": "sg" + }, + "timeouts": null, + "vpc_id": "vpc-026c8adbbdd34f254" + }, + "sensitive_attributes": [], + "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjo2MDAwMDAwMDAwMDAsImRlbGV0ZSI6OTAwMDAwMDAwMDAwfSwic2NoZW1hX3ZlcnNpb24iOiIxIn0=", + "dependencies": [ + "aws_vpc.devops_assessment_vpc" + ] + } + ] + }, + { + "mode": "managed", + "type": "aws_subnet", + "name": "devops_assessment_subnet", + "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]", + "instances": [ + { + "schema_version": 1, + "attributes": { + "arn": "arn:aws:ec2:ap-south-1:279660579228:subnet/subnet-0816729da4e32856d", + "assign_ipv6_address_on_creation": false, + "availability_zone": "ap-south-1a", + "availability_zone_id": "aps1-az1", + "cidr_block": "10.1.0.0/16", + "customer_owned_ipv4_pool": "", + "enable_dns64": false, + "enable_lni_at_device_index": 0, + "enable_resource_name_dns_a_record_on_launch": false, + "enable_resource_name_dns_aaaa_record_on_launch": false, + "id": "subnet-0816729da4e32856d", + "ipv6_cidr_block": "", + "ipv6_cidr_block_association_id": "", + "ipv6_native": false, + "map_customer_owned_ip_on_launch": false, + "map_public_ip_on_launch": false, + "outpost_arn": "", + "owner_id": "279660579228", + "private_dns_hostname_type_on_launch": "ip-name", + "tags": { + "Name": "subnet-ap-south-1a" + }, + "tags_all": { + "Name": "subnet-ap-south-1a" + }, + "timeouts": null, + "vpc_id": "vpc-026c8adbbdd34f254" + }, + "sensitive_attributes": [], + "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjo2MDAwMDAwMDAwMDAsImRlbGV0ZSI6MTIwMDAwMDAwMDAwMH0sInNjaGVtYV92ZXJzaW9uIjoiMSJ9", + "dependencies": [ + "aws_vpc.devops_assessment_vpc" + ] + } + ] + }, + { + "mode": "managed", + "type": "aws_vpc", + "name": "devops_assessment_vpc", + "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]", + "instances": [ + { + "schema_version": 1, + "attributes": { + "arn": "arn:aws:ec2:ap-south-1:279660579228:vpc/vpc-026c8adbbdd34f254", + "assign_generated_ipv6_cidr_block": false, + "cidr_block": "10.1.0.0/16", + "default_network_acl_id": "acl-077b8686fbbc4ed76", + "default_route_table_id": "rtb-0752a1584c6bcb15f", + "default_security_group_id": "sg-084ac142f35a0f8a6", + "dhcp_options_id": "dopt-f27c659a", + "enable_dns_hostnames": true, + "enable_dns_support": true, + "enable_network_address_usage_metrics": false, + "id": "vpc-026c8adbbdd34f254", + "instance_tenancy": "default", + "ipv4_ipam_pool_id": null, + "ipv4_netmask_length": null, + "ipv6_association_id": "", + "ipv6_cidr_block": "", + "ipv6_cidr_block_network_border_group": "", + "ipv6_ipam_pool_id": "", + "ipv6_netmask_length": 0, + "main_route_table_id": "rtb-0752a1584c6bcb15f", + "owner_id": "279660579228", + "tags": { + "Name": "devopsAssessmentVpc" + }, + "tags_all": { + "Name": "devopsAssessmentVpc" + } + }, + "sensitive_attributes": [], + "private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ==" + } + ] + } + ], + "check_results": null +} diff --git a/terraform/variables.tf b/terraform/variables.tf new file mode 100644 index 0000000..4edb1d3 --- /dev/null +++ b/terraform/variables.tf @@ -0,0 +1,4 @@ +variable "image_tag" { + type = string + default = "latest" +} \ No newline at end of file diff --git a/terraform/vpc.tf b/terraform/vpc.tf new file mode 100644 index 0000000..a4f4db8 --- /dev/null +++ b/terraform/vpc.tf @@ -0,0 +1,71 @@ +resource "aws_vpc" "devops_assessment_vpc" { + cidr_block = "10.1.0.0/16" + instance_tenancy = "default" + enable_dns_hostnames = "true" + tags = { + Name = "devopsAssessmentVpc" + } +} + +resource "aws_security_group" "sg" { + vpc_id = aws_vpc.devops_assessment_vpc.id + + ingress { + from_port = 0 + to_port = 0 + protocol = "-1" + cidr_blocks = ["0.0.0.0/0"] + } + + ingress { + 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"] + } + tags = { + Name = "sg" + } +} + +resource "aws_subnet" "devops_assessment_subnet" { + vpc_id = aws_vpc.devops_assessment_vpc.id + cidr_block = "10.1.0.0/16" + availability_zone = "ap-south-1a" + tags = { + Name = "subnet-ap-south-1a" + } +} + +resource "aws_internet_gateway" "devops_assessment_igw" { + vpc_id = aws_vpc.devops_assessment_vpc.id + + tags = { + Name = "devops_assessment_igw" + } +} + +resource "aws_route_table" "devops_assessment_rt" { + vpc_id = aws_vpc.devops_assessment_vpc.id + + route { + cidr_block = "0.0.0.0/0" + gateway_id = aws_internet_gateway.devops_assessment_igw.id + } + + tags = { + Name = "igw-route" + } +} + +resource "aws_route_table_association" "subnet_association" { + subnet_id = aws_subnet.devops_assessment_subnet.id + route_table_id = aws_route_table.devops_assessment_rt.id +} \ No newline at end of file