brew install jq
# Configuration
VPC_CIDR_BLOCK=10.0.0.0/16
PUBLIC_SUBNET_CIDR_BLOCK=10.0.1.0/24
PRIVATE_SUBNET_CIDR_BLOCK=10.0.2.0/24
KEY_PAIR_NAME=keyPair1
SSH_CIDR=0.0.0.0/0
aws ec2 create-key-pair --key-name $KEY_PAIR_NAME | jq -r '.KeyMaterial' > aws-keyPair1.pem
# Setup VPC and Subnets
VPC_ID=$(aws ec2 create-vpc --cidr-block $VPC_CIDR_BLOCK | jq -r '.Vpc.VpcId')
PUBLIC_SUBNET_ID=$(aws ec2 create-subnet --vpc-id $VPC_ID --cidr-block $PUBLIC_SUBNET_CIDR_BLOCK | jq -r '.Subnet.SubnetId')
PRIVATE_SUBNET_ID=$(aws ec2 create-subnet --vpc-id $VPC_ID --cidr-block $PRIVATE_SUBNET_CIDR_BLOCK | jq -r '.Subnet.SubnetId')
aws ec2 modify-subnet-attribute --subnet-id $PUBLIC_SUBNET_ID --map-public-ip-on-launch
# Setup Internet Gateway
INTERNET_GATEWAY_ID=$(aws ec2 create-internet-gateway | jq -r '.InternetGateway.InternetGatewayId')
aws ec2 attach-internet-gateway --internet-gateway-id $INTERNET_GATEWAY_ID --vpc-id $VPC_ID
# Setup Route Table
ROUTE_TABLE_ID=$(aws ec2 create-route-table --vpc-id $VPC_ID | jq -r '.RouteTable.RouteTableId')
aws ec2 create-route --route-table-id $ROUTE_TABLE_ID --destination-cidr-block 0.0.0.0/0 --gateway-id $INTERNET_GATEWAY_ID
ROUTE_TABLE_ASSOCIATE_ID=$(aws ec2 associate-route-table --route-table-id $ROUTE_TABLE_ID --subnet-id $PUBLIC_SUBNET_ID | jq -r '')
# Setup Security Group
SECURITY_GROUP_ID=$(aws ec2 create-security-group --group-name securityGroup1 --description "Security group 1" --vpc-id $VPC_ID | jq -r '.GroupId')
aws ec2 authorize-security-group-ingress --group-id $SECURITY_GROUP_ID --protocol tcp --port 80 --cidr 0.0.0.0/0
aws ec2 authorize-security-group-ingress --group-id $SECURITY_GROUP_ID --protocol tcp --port 22 --cidr $SSH_CIDR
# Setup EC2 Instances
PUBLIC_INSTANCE_ID=$(aws ec2 run-instances \
--image-id ami-0922553b7b0369273 \
--instance-type t2.micro \
--key-name $KEY_PAIR_NAME \
--subnet-id $PUBLIC_SUBNET_ID \
--security-group-ids $SECURITY_GROUP_ID \
--user-data file://ec2-setup.sh \
--block-device-mappings 'DeviceName=/dev/xvda,Ebs={DeleteOnTermination=true,VolumeSize=8,VolumeType=gp2}' \
| jq -r '.Instances[0].InstanceId')
aws ec2 terminate-instances --instance-ids $PUBLIC_INSTANCE_ID
aws ec2 detach-internet-gateway --internet-gateway-id $INTERNET_GATEWAY_ID --vpc-id $VPC_ID
aws ec2 delete-internet-gateway --internet-gateway-id $INTERNET_GATEWAY_ID
aws ec2 disassociate-route-table --association-id $ROUTE_TABLE_ASSOCIATE_ID
aws ec2 delete-route-table --route-table-id $ROUTE_TABLE_ID
# Should be executed after EC2 instance is terminated
aws ec2 delete-security-group --group-id $SECURITY_GROUP_ID
aws ec2 delete-subnet --subnet-id $PUBLIC_SUBNET_ID
aws ec2 delete-subnet --subnet-id $PRIVATE_SUBNET_ID
aws ec2 delete-vpc --vpc-id $VPC_ID