Create Instances

Creating us-instances.tf file with the configurations below:

# Create EC2 for VPC4
resource "aws_instance" "vpc4_instance" {
    provider = aws.region_virginia

    ami = "ami-0ebfd941bbafe70c6"  # Amazon Linux AMI 2023
    instance_type = "t2.micro"
    subnet_id = aws_subnet.VPC4-Subnet-Private.id
    security_groups = [aws_security_group.VPC4-SG-Private.id]
    associate_public_ip_address = false
    key_name = "aws-lab-us"

    tags = {
        Name = "vpc4_instance"
    }
}

# Create EC2 for VPC5
resource "aws_instance" "vpc5_instance" {
    provider = aws.region_virginia

    ami = "ami-0ebfd941bbafe70c6"  # Amazon Linux AMI 2023
    instance_type = "t2.micro"
    subnet_id = aws_subnet.VPC5-Subnet-Private.id
    security_groups = [aws_security_group.VPC5-SG-Private.id]
    associate_public_ip_address = false
    key_name = "aws-lab-us"

    tags = {
        Name = "vpc5_instance"
    }
}


#########################################################################################################
# Create on-premise server for vpn connection
#########################################################################################################
# create static ip
resource "aws_eip" "on_premise" {provider = aws.region_virginia}
# associate static ip with ec2 instance
resource "aws_eip_association" "on_premise" {
    provider = aws.region_virginia
    instance_id = aws_instance.vpc6_instance.id
    allocation_id = aws_eip.on_premise.id
}

# collect all needed data
locals {
    on_premise_public_ip = aws_eip.on_premise.public_ip
    tunnel1_public_ip = aws_vpn_connection.transit_vpn.tunnel1_address
    tunnel2_public_ip = aws_vpn_connection.transit_vpn.tunnel2_address
    cidr_cloud = var.cidr_block_allvpc
    cidr_on_premise = var.cidr_block_onpremise
}

# create server
resource "aws_instance" "vpc6_instance" {
    provider = aws.region_virginia

    ami = "ami-0866a3c8686eaeeba"  # Ubuntu Server 24.04 LTS
    instance_type = "t2.micro"
    subnet_id = aws_subnet.VPC6-Subnet-Public.id
    security_groups = [aws_security_group.VPC6-SG-Public.id]
    associate_public_ip_address = true
    key_name = "aws-lab-us"

    tags = {
        Name = "vpc6_instance"
    }

    # Run Shell script to install LibreSwan
    user_data = <<-EOF
    #!/bin/bash
    sudo -i
    apt update -y && apt install libreswan net-tools -y
    
    file="/etc/sysctl.conf"
    [[ -z "$(grep '^\s*net\.ipv4\.ip_forward' $file)" ]] && echo 'net.ipv4.ip_forward = 1' >> $file
    [[ -z "$(grep '^\s*net\.ipv4\.conf\.default\.rp_filter' $file)" ]] && echo 'net.ipv4.conf.default.rp_filter = 0' >> $file
    [[ -z "$(grep '^\s*net\.ipv4\.conf\.default\.accept_source_route' $file)" ]] && echo 'net.ipv4.conf.default.accept_source_route = 0' >> $file
    sysctl -p # applying new change

    file="/etc/ipsec.conf"
    [[ -z "$(grep '^\s*include\s*\/etc\/ipsec.d\/\*\.conf' $file)" ]] && echo 'include /etc/ipsec.d/*.conf' >> $file

    file="/etc/ipsec.d/aws.conf"
    echo '
    conn Tunnel1
        authby=secret
        auto=start
        left=%defaultroute
        leftid=${local.on_premise_public_ip}
        right=${local.tunnel1_public_ip}
        type=tunnel
        ikelifetime=8h
        keylife=1h
        phase2alg=aes128-sha1;modp2048
        ike=aes128-sha1;modp2048
        keyingtries=%forever
        keyexchange=ike
        leftsubnet=${local.cidr_on_premise}
        rightsubnet=${local.cidr_cloud}
        dpddelay=10
        dpdtimeout=30
        dpdaction=restart_by_peer

    conn Tunnel2
        authby=secret
        auto=start
        left=%defaultroute
        leftid=${local.on_premise_public_ip}
        right=${local.tunnel2_public_ip}
        type=tunnel
        ikelifetime=8h
        keylife=1h
        phase2alg=aes128-sha1;modp2048
        ike=aes128-sha1;modp2048
        keyingtries=%forever
        keyexchange=ike
        leftsubnet=${local.cidr_on_premise}
        rightsubnet=${local.cidr_cloud}
        dpddelay=10
        dpdtimeout=30
        dpdaction=restart_by_peer

    ' > $file

    file="/etc/ipsec.d/aws.secrets"
    echo '
    ${local.on_premise_public_ip} ${local.tunnel1_public_ip}: PSK "${var.psk[0]}"
    ${local.on_premise_public_ip} ${local.tunnel2_public_ip}: PSK "${var.psk[1]}"
    ' > $file

    netplan apply
    systemctl enable ipsec
    systemctl start ipsec
    systemctl status ipsec

    ipsec status

    EOF
}

If you create key pair from AWS website interface, this key is only available for current region. In other regions, please create the new one to access your EC2.