1. Answers
  2. How To Set Up A VPC With IPv6, Subnets, And Gateways?

How to Set Up a VPC With IPv6, Subnets, and Gateways?

Introduction

In this guide, we will walk through setting up a Virtual Private Cloud (VPC) with IPv6 support, subnets, and gateways using Pulumi in TypeScript. We will use AWS as our cloud provider, which aligns with the organization’s preferences.

Step-by-Step Explanation

Step 1: Install Pulumi and AWS SDK

First, ensure you have Pulumi and the AWS SDK installed. You can install them using npm:

npm install @pulumi/pulumi @pulumi/aws

Step 2: Create a New Pulumi Project

Create a new Pulumi project if you don’t already have one:

pulumi new aws-typescript

Step 3: Define the VPC

In your index.ts file, define the VPC with IPv6 support:

import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";

// Create a new VPC
const vpc = new aws.ec2.Vpc("my-vpc", {
    cidrBlock: "10.0.0.0/16",
    assignGeneratedIpv6CidrBlock: true,
});

Step 4: Create Subnets

Create public and private subnets within the VPC:

// Create a public subnet
const publicSubnet = new aws.ec2.Subnet("public-subnet", {
    vpcId: vpc.id,
    cidrBlock: "10.0.1.0/24",
    mapPublicIpOnLaunch: true,
});

// Create a private subnet
const privateSubnet = new aws.ec2.Subnet("private-subnet", {
    vpcId: vpc.id,
    cidrBlock: "10.0.2.0/24",
});

Step 5: Create an Internet Gateway

Create an Internet Gateway and attach it to the VPC:

// Create an Internet Gateway
const internetGateway = new aws.ec2.InternetGateway("internet-gateway", {
    vpcId: vpc.id,
});

Step 6: Create a NAT Gateway

Create a NAT Gateway for the private subnet:

// Create an Elastic IP for the NAT Gateway
const eip = new aws.ec2.Eip("nat-eip", {
    vpc: true,
});

// Create a NAT Gateway
const natGateway = new aws.ec2.NatGateway("nat-gateway", {
    subnetId: publicSubnet.id,
    allocationId: eip.id,
});

Step 7: Create Route Tables

Create route tables for the public and private subnets:

// Create a route table for the public subnet
const publicRouteTable = new aws.ec2.RouteTable("public-route-table", {
    vpcId: vpc.id,
    routes: [
        {
            cidrBlock: "0.0.0.0/0",
            gatewayId: internetGateway.id,
        },
        {
            ipv6CidrBlock: "::/0",
            gatewayId: internetGateway.id,
        },
    ],
});

// Associate the route table with the public subnet
new aws.ec2.RouteTableAssociation("public-route-table-association", {
    subnetId: publicSubnet.id,
    routeTableId: publicRouteTable.id,
});

// Create a route table for the private subnet
const privateRouteTable = new aws.ec2.RouteTable("private-route-table", {
    vpcId: vpc.id,
    routes: [
        {
            cidrBlock: "0.0.0.0/0",
            natGatewayId: natGateway.id,
        },
    ],
});

// Associate the route table with the private subnet
new aws.ec2.RouteTableAssociation("private-route-table-association", {
    subnetId: privateSubnet.id,
    routeTableId: privateRouteTable.id,
});

Conclusion

By following these steps, you have successfully set up a VPC with IPv6 support, public and private subnets, an Internet Gateway, and a NAT Gateway using Pulumi in TypeScript. This setup provides a robust network infrastructure for your AWS resources.

Full Code Example

import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";

// Create a new VPC
const vpc = new aws.ec2.Vpc("my-vpc", {
    cidrBlock: "10.0.0.0/16",
    assignGeneratedIpv6CidrBlock: true,
});

// Create a public subnet
const publicSubnet = new aws.ec2.Subnet("public-subnet", {
    vpcId: vpc.id,
    cidrBlock: "10.0.1.0/24",
    mapPublicIpOnLaunch: true,
});

// Create a private subnet
const privateSubnet = new aws.ec2.Subnet("private-subnet", {
    vpcId: vpc.id,
    cidrBlock: "10.0.2.0/24",
});

// Create an Internet Gateway
const internetGateway = new aws.ec2.InternetGateway("internet-gateway", {
    vpcId: vpc.id,
});

// Create an Elastic IP for the NAT Gateway
const eip = new aws.ec2.Eip("nat-eip", {
    vpc: true,
});

// Create a NAT Gateway
const natGateway = new aws.ec2.NatGateway("nat-gateway", {
    subnetId: publicSubnet.id,
    allocationId: eip.id,
});

// Create a route table for the public subnet
const publicRouteTable = new aws.ec2.RouteTable("public-route-table", {
    vpcId: vpc.id,
    routes: [
        {
            cidrBlock: "0.0.0.0/0",
            gatewayId: internetGateway.id,
        },
        {
            ipv6CidrBlock: "::/0",
            gatewayId: internetGateway.id,
        },
    ],
});

// Associate the route table with the public subnet
new aws.ec2.RouteTableAssociation("public-route-table-association", {
    subnetId: publicSubnet.id,
    routeTableId: publicRouteTable.id,
});

// Create a route table for the private subnet
const privateRouteTable = new aws.ec2.RouteTable("private-route-table", {
    vpcId: vpc.id,
    routes: [
        {
            cidrBlock: "0.0.0.0/0",
            natGatewayId: natGateway.id,
        },
    ],
});

// Associate the route table with the private subnet
new aws.ec2.RouteTableAssociation("private-route-table-association", {
    subnetId: privateSubnet.id,
    routeTableId: privateRouteTable.id,
});

Deploy this code

Want to deploy this code? Sign up for a free Pulumi account to deploy in a few clicks.

Sign up

New to Pulumi?

Want to deploy this code? Sign up with Pulumi to deploy in a few clicks.

Sign up