What we will be doing Today:
In this tutorial we will setup a VPC on AWS with the AWS CLI tools, and also Launching an EC2 Instance to our newly created VPC.
This will include:
- Creating the VPC, Enabling DNS and DNS Hostname Support
- Creating and Attaching our Internet Gateway
- Creating our Subnets, associating our Route Tables
- Creating a Security Group, authorizing SSH traffic
- Creating a SSH KeyPair
- Launching an Amazon Linux Instance on EC2
- and Finally, connecting to our Instance
Getting Started:
Create the VPC, you will be returned with the vpcid
:
$ aws ec2 create-vpc --cidr-block 192.168.0.0/16 --query 'Vpc.VpcId'
``` <p>
`"vpc-abcfddde"`
Enable DNS and DNS Hostname Support:
```language-bash
$ aws ec2 modify-vpc-attribute --vpc-id <returned-vpcid> --enable-dns-support "{\"Value\":true}"
$ aws ec2 modify-vpc-attribute --vpc-id <returned-vpcid> --enable-dns-hostnames "{\"Value\":true}"
``` <p>
Create an Internet Gateway and associate the Internet Gateway to your VPC:
```language-bash
$ aws ec2 create-internet-gateway --query 'InternetGateway.InternetGatewayId'
"igw-bb8604df"
$ aws ec2 attach-internet-gateway --internet-gateway-id <returned-igw> --vpc-id <returned-vpcid>
``` <p>
Create a Subnet, Specify your CIDR, and associate it to your VPC.
Then create a Routing Table by specifying the VPC you would like to associate the Routing Table to and then associate the returned routing table id with your returned subnet id. Then create a routing entry to the default gateway which will be the Internet Gateway (IGW)
```language-bash
$ aws ec2 create-subnet --vpc-id <returned-vpcid> --cidr-block 192.168.0.0/16 --query 'Subnet.SubnetId'
"subnet-dc143384"
$ aws ec2 create-route-table --vpc-id <returned-vpcid> --query 'RouteTable.RouteTableId'
"rtb-9c6ddffb"
$ aws ec2 associate-route-table --route-table-id <returned-route-tblid> --subnet-id <returned-subnetid>
$ aws ec2 create-route --route-table-id <returned-route-tblid> --destination-cidr-block 0.0.0.0/0 --gateway-id <returned-igw>
``` <p>
Create a Security Group and add an inbound rule to allow SSH traffic from everywhere:
```language-bash
$ aws ec2 create-security-group --group-name my-security-group --description "my-security-group" --vpc-id <returned-vpcid> --query 'GroupId'
"sg-ca4b85b3"
$ aws ec2 authorize-security-group-ingress --group-id <returned-security-groupid> --protocol tcp --port 22 --cidr 0.0.0.0/0
``` <p>
Create a KeyPair, output it to disk:
```language-bash
$ aws ec2 create-key-pair --key-name myKey --query 'KeyMaterial' --output text > ~/.ssh/myKey.pem
``` <p>
Apply needed permissions:
```language-bash
$ chmod 400 ~/.ssh/myKey.pem
``` <p>
Now we will launch an EC2 Instance into our VPC. When looking for the Latest Amazon Linux HVM AMI, you can call a describe-images call and [thanks to](https://recursive.cloud/blog/latest-amazon-ami/):
```language-bash
$ aws ec2 describe-images --owners amazon --filters 'Name=name,Values=amzn-ami-hvm-????.??.?.x86_64-gp2' 'Name=state,Values=available' | jq -r '.Images | sort_by(.CreationDate) | last(.[]).ImageId'
ami-f9dd458a
``` <p>
Launch EC2 Instance:
```language-bash
$ aws ec2 run-instances --image-id ami-f9dd458a --count 1 --instance-type t2.micro --key-name myKey --security-group-ids <returned-security-groupid> --subnet-id <returned-subnetid> --associate-public-ip-address --query 'Instances[0].InstanceId'
"i-1234528abce88b44"
``` <p>
Get the Public IP by calling the Describe-Instances API call:
```language-bash
$ aws ec2 describe-instances --instance-ids <returned-instance-id --query 'Reservations[0].Instances[0].PublicDnsName'
"ec2-34-12-34-56.eu-west-1.compute.amazonaws.com"
``` <p>
SSH into your EC2 Instance with your KeyPair and Public IP:
```language-bash
$ ssh -i ~/.ssh/myKey.pem [email protected]
[ec2-user@ip-192-168-103-84 ~]$
``` <p>
Aditionally, you can also tag your resource, by doing the following:
```language-bash
$ aws ec2 create-tags --resources "i-1234528abce88b44" --tags 'Key="ENV",Value=DEV'
``` <p>
Comments