# [ VPC ]Setting Up a VPC on AWS

### Project Architecture

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1723617640431/60d6f884-5dbe-41e8-a9f1-fa6437c65615.png align="center")

### 1\. VPC Setup

#### 1.1 Create VPC

* **CIDR Block**: `10.10.0.0/16`
    
* **Command**:
    
    ```bash
    vpc_id=$(aws ec2 create-vpc --cidr-block 10.10.0.0/16 --query 'Vpc.VpcId' --output text)
    echo "VPC ID: $vpc_id"
    ```
    

#### 1.2 Internet Gateway Configuration

* **Purpose**: Enable VPC to communicate with the internet.
    
* **Commands**:
    
    ```bash
    igw_id=$(aws ec2 create-internet-gateway --query 'InternetGateway.InternetGatewayId' --output text)
    aws ec2 attach-internet-gateway --vpc-id $vpc_id --internet-gateway-id $igw_id
    echo "New Internet Gateway ID: $igw_id"
    ```
    

#### 1.3 Create Subnets

* **Public Subnets**:
    
    ```bash
    public_subnet_id_1=$(aws ec2 create-subnet --vpc-id $vpc_id --cidr-block 10.10.0.0/28 --availability-zone ap-northeast-2a --query 'Subnet.SubnetId' --output text)
    public_subnet_id_2=$(aws ec2 create-subnet --vpc-id $vpc_id --cidr-block 10.10.0.16/28 --availability-zone ap-northeast-2b --query 'Subnet.SubnetId' --output text)
    echo "Public Subnet 1 ID: $public_subnet_id_1"
    echo "Public Subnet 2 ID: $public_subnet_id_2"
    ```
    
* **Private Subnets**:
    
    ```bash
    private_subnet_id_1=$(aws ec2 create-subnet --vpc-id $vpc_id --cidr-block 10.10.1.0/24 --availability-zone ap-northeast-2a --query 'Subnet.SubnetId' --output text)
    private_subnet_id_2=$(aws ec2 create-subnet --vpc-id $vpc_id --cidr-block 10.10.2.0/24 --availability-zone ap-northeast-2b --query 'Subnet.SubnetId' --output text)
    echo "Private Subnet 1 ID: $private_subnet_id_1"
    echo "Private Subnet 2 ID: $private_subnet_id_2"
    ```
    
* **<mark>Tagging Subnets</mark>**<mark>: -&gt; FOR EKS CLUSTER LATER</mark>
    
* [REF AWS DOC](https://docs.aws.amazon.com/eks/latest/userguide/network_reqs.html) <mark> &lt;- CHECK!!!</mark>
    
    ```bash
    aws ec2 create-tags --resources $public_subnet_id_1 $public_subnet_id_2 --tags Key=kubernetes.io/cluster/spoid-cluster,Value=shared
    aws ec2 create-tags --resources $public_subnet_id_1 $public_subnet_id_2 --tags Key=kubernetes.io/role/elb,Value=1
    aws ec2 create-tags --resources $private_subnet_id_1 $private_subnet_id_2 --tags Key=kubernetes.io/cluster/spoid-cluster,Value=shared
    aws ec2 create-tags --resources $private_subnet_id_1 $private_subnet_id_2 --tags Key=kubernetes.io/role/internal-elb,Value=1
    ```
    

#### 1.4 NAT Gateway Setup

* **Purpose**: Allow private subnets to access the internet.
    
* **Commands**:
    
    ```bash
    eip_allocation_id=$(aws ec2 allocate-address --domain vpc --query 'AllocationId' --output text)
    nat_gateway_id=$(aws ec2 create-nat-gateway --subnet-id $public_subnet_id_1 --allocation-id $eip_allocation_id --query 'NatGateway.NatGatewayId' --output text)
    echo "NAT Gateway ID: $nat_gateway_id"
    ```
    

#### 1.5 Routing Table Configuration

* **Public Subnet Routing Table**:
    
    ```bash
    public_route_table_id=$(aws ec2 describe-route-tables --filters "Name=vpc-id,Values=$vpc_id" --query 'RouteTables[0].RouteTableId' --output text)
    aws ec2 create-route --route-table-id $public_route_table_id --destination-cidr-block 0.0.0.0/0 --gateway-id $igw_id
    ```
    
* **Private Subnet Routing Tables**:
    
    ```bash
    private_route_table_id_1=$(aws ec2 create-route-table --vpc-id $vpc_id --query 'RouteTable.RouteTableId' --output text)
    private_route_table_id_2=$(aws ec2 create-route-table --vpc-id $vpc_id --query 'RouteTable.RouteTableId' --output text)
    
    aws ec2 associate-route-table --route-table-id $public_route_table_id --subnet-id $public_subnet_id_1
    aws ec2 associate-route-table --route-table-id $public_route_table_id --subnet-id $public_subnet_id_2
    
    aws ec2 associate-route-table --route-table-id $private_route_table_id_1 --subnet-id $private_subnet_id_1
    aws ec2 associate-route-table --route-table-id $private_route_table_id_2 --subnet-id $private_subnet_id_2
    
    echo "Public Route Table ID: $public_route_table_id"
    echo "Private Route Table 1 ID: $private_route_table_id_1"
    echo "Private Route Table 2 ID: $private_route_table_id_2"
    ```
    
* **NAT Gateway Route for Private Subnets**:
    
    ```bash
    aws ec2 create-route --route-table-id $private_route_table_id_1 --destination-cidr-block 0.0.0.0/0 --gateway-id $nat_gateway_id
    aws ec2 create-route --route-table-id $private_route_table_id_2 --destination-cidr-block 0.0.0.0/0 --gateway-id $nat_gateway_id
    ```
    

---

### Next Post

In the next post, we'll address a CIDR range issue encountered during the Load Balancer setup and how to troubleshoot it effectively.
