Created
January 6, 2022 12:16
-
-
Save topriddy/2a6004d69146637e9ea825af186672e5 to your computer and use it in GitHub Desktop.
Sets up a minimal infra for serving a Hello World page to the public running on ec2 instance. 2hrs Terraform Quickstart tutorial
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
provider "aws" { | |
region = "us-east-1" | |
} | |
#1. Create vpc | |
resource "aws_vpc" "prod-vpc" { | |
cidr_block = "10.0.0.0/16" | |
tags = { | |
Name = "production" | |
} | |
} | |
#2. Create Internet Gateway | |
resource "aws_internet_gateway" "gw" { | |
vpc_id = aws_vpc.prod-vpc.id | |
} | |
#3. Create Custom Route Table | |
resource "aws_route_table" "prod-route-table" { | |
vpc_id = aws_vpc.prod-vpc.id | |
route { | |
cidr_block = "0.0.0.0/0" | |
gateway_id = aws_internet_gateway.gw.id | |
} | |
tags = { | |
Name = "production" | |
} | |
} | |
#4. Create a Subnet | |
resource "aws_subnet" "subnet-1" { | |
vpc_id = aws_vpc.prod-vpc.id | |
cidr_block = "10.0.1.0/24" | |
availability_zone = "us-east-1a" | |
tags = { | |
Name = "prod-subnet" | |
} | |
} | |
#5. Associate subnet with Route Table | |
resource "aws_route_table_association" "a" { | |
subnet_id = aws_subnet.subnet-1.id | |
route_table_id = aws_route_table.prod-route-table.id | |
} | |
#6. Create Security Group to allow port 22, 80, 443 | |
resource "aws_security_group" "allow_web" { | |
name = "allow_web_traffic" | |
description = "Allow Web inbound traffic" | |
vpc_id = aws_vpc.prod-vpc.id | |
ingress { | |
description = "HTTPS" | |
from_port = 443 | |
to_port = 443 | |
protocol = "tcp" | |
cidr_blocks = ["0.0.0.0/0"] | |
} | |
ingress { | |
description = "HTTP" | |
from_port = 80 | |
to_port = 80 | |
protocol = "tcp" | |
cidr_blocks = ["0.0.0.0/0"] | |
} | |
ingress { | |
description = "SSH" | |
from_port = 22 | |
to_port = 22 | |
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"] | |
} | |
} | |
#7. Create a newtork interface wth an ip in the subnet that was created in step 4 | |
resource "aws_network_interface" "web-server-nic" { | |
subnet_id = aws_subnet.subnet-1.id | |
private_ips = ["10.0.1.50"] | |
security_groups = [aws_security_group.allow_web.id] | |
} | |
#8. Assign an elastic IP to the network interface created in step 7 | |
resource "aws_eip" "one" { | |
vpc = true | |
network_interface = aws_network_interface.web-server-nic.id | |
associate_with_private_ip = "10.0.1.50" | |
depends_on = [aws_internet_gateway.gw] | |
} | |
#9. Create Ubuntu server and install/enable apache2 | |
resource "aws_instance" "web-server-instance" { | |
ami = "ami-04505e74c0741db8d" | |
instance_type = "t2.micro" | |
availability_zone = "us-east-1a" | |
key_name = "zazoo-key" | |
network_interface { | |
device_index = 0 | |
network_interface_id = aws_network_interface.web-server-nic.id | |
} | |
tags = { | |
Name = "zazoo-web-server" | |
} | |
user_data = <<-EOF | |
#!/bin/bash | |
sudo apt update -y | |
sudo apt install apache2 -y | |
sudo systemctl start apache2 | |
sudo bash -c 'echo your very first web server > /var/www/html/index.html' | |
EOF | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment