AWS CLI를 사용하여 IPv6 기반 VPC 및 IPv6 전용 서브넷 생성 - Amazon Virtual Private Cloud

AWS CLI를 사용하여 IPv6 기반 VPC 및 IPv6 전용 서브넷 생성

다음 예에서는 AWS CLI 명령을 사용하여 IPv6 CIDR 블록이 있는 기본이 아닌 VPC, IPv6 CIDR 블록, 퍼블릭 IPv6 전용 서브넷, 그리고 아웃바운드 인터넷 액세스만 가능한 프라이빗 IPv6 전용 서브넷을 만듭니다. VPC와 서브넷을 만든 후, 퍼블릭 서브넷에서 인스턴스를 시작하고 여기에 연결할 수 있습니다. 프라이빗 서브넷에서 인스턴스를 시작하고 인터넷에 연결할 수 있는지 확인할 수 있습니다. 시작하려면 먼저 AWS CLI를 설치하고 구성해야 합니다. 자세한 내용은 AWS CLI 설치 단원을 참조하십시오.

다음과 같은 AWS 리소스를 생성합니다.

  • VPC

  • 두 개의 서브넷

  • 인터넷 게이트웨이

  • 라우팅 테이블

  • EC2 인스턴스

1단계: VPC와 서브넷 만들기

첫 번째 단계는 VPC를 만드는 것입니다. 이 예제에서 IPv6에 주로 초점을 맞추고 있더라도 VPC 대한 IPv4 CIDR 블록을 정의해야 합니다. 이 예에서는 VPC에 대해 IPv4 CIDR 블록 10.0.0.0/16을 사용하지만, 다른 CIDR 블록을 선택할 수 있습니다. 자세한 내용은 섹션을 참조하세요VPC 크기 조정

AWS CLI를 사용하여 VPC와 서브넷을 만들려면

  1. 10.0.0.0/16 CIDR 블록이 있는 VPC를 생성하여 IPv6 CIDR 블록을 VPC와 연결합니다.

    aws ec2 create-vpc --cidr-block 10.0.0.0/16 --amazon-provided-ipv6-cidr-block

    반환된 출력에 표시된 VPC ID를 메모해 둡니다.

    { "Vpc": { "VpcId": "vpc-2f09a348", ... }
  2. VPC를 설명하여 VPC에 연결된 IPv6 CIDR 블록을 가져옵니다.

    aws ec2 describe-vpcs --vpc-id vpc-2f09a348
    { "Vpcs": [ { ... "Ipv6CidrBlockAssociationSet": [ { "Ipv6CidrBlock": "2001:db8:1234:1a00::/56", "AssociationId": "vpc-cidr-assoc-17a5407e", "Ipv6CidrBlockState": { "State": "ASSOCIATED" } } ], ... }
  3. 2001:db8:1234:1a00::/64 IPv6 CIDR 블록으로(이전 단계에서 반환된 범위에 속함) VPC에 IPv6 전용 서브넷을 만듭니다. IPv6 전용 옵션에 대한 자세한 내용은 AWS CLI 명령 참조VPC에서 서브넷 생성 또는 create-subnet을 참조하세요.

    aws ec2 create-subnet --vpc-id vpc-2f09a348 --ipv6-cidr-block 2001:db8:1234:1a00::/64 --ipv6-native
  4. 2001:db8:1234:1a01::/64 IPv6 CIDR 블록으로 VPC에 두 번째 IPv6 전용 서브넷을 만듭니다.

    aws ec2 create-subnet --vpc-id vpc-2f09a348 --ipv6-cidr-block 2001:db8:1234:1a01::/64 --ipv6-native

2단계: 퍼블릭 서브넷 구성

VPC와 서브넷을 만든 후, VPC에 인터넷 게이트웨이를 연결하고, 사용자 지정 라우팅 테이블을 만들고, 서브넷이 인터넷 게이트웨이로 라우팅되도록 구성하여 IPv6 서브넷 중 하나를 퍼블릭 서브넷으로 만들 수 있습니다. 이 예시에서는 모든 IPv6 트래픽을 인터넷 게이트웨이로 라우팅하는 라우팅 테이블이 생성됩니다.

서브넷을 퍼블릭 서브넷으로 만들려면

  1. 인터넷 게이트웨이를 만듭니다.

    aws ec2 create-internet-gateway

    반환된 출력에 표시된 인터넷 게이트웨이 ID를 메모해 둡니다.

    { "InternetGateway": { ... "InternetGatewayId": "igw-1ff7a07b", ... } }
  2. 이전 단계에서 메모해 둔 ID를 사용하여 VPC에 인터넷 게이트웨이를 연결합니다.

    aws ec2 attach-internet-gateway --vpc-id vpc-2f09a348 --internet-gateway-id igw-1ff7a07b
  3. VPC에 대해 사용자 지정 라우팅 테이블 만듭니다.

    aws ec2 create-route-table --vpc-id vpc-2f09a348

    반환된 출력에 표시된 라우팅 테이블 ID를 메모해 둡니다.

    { "RouteTable": { ... "RouteTableId": "rtb-c1c8faa6", ... } }
  4. 라우팅 테이블에 모든 IPv6 트래픽(::/0)이 인터넷 게이트웨이를 가리키는 경로를 만듭니다.

    aws ec2 create-route --route-table-id rtb-c1c8faa6 --destination-ipv6-cidr-block ::/0 --gateway-id igw-1ff7a07b
  5. 경로가 만들어졌고 활성 상태인지 확인하려면 라우팅 테이블을 설명하고 그 결과를 볼 수 있습니다.

    aws ec2 describe-route-tables --route-table-id rtb-c1c8faa6
    { "RouteTables": [ { "Associations": [], "RouteTableId": "rtb-c1c8faa6", "VpcId": "vpc-2f09a348", "PropagatingVgws": [], "Tags": [], "Routes": [ { "GatewayId": "local", "DestinationCidrBlock": "10.0.0.0/16", "State": "active", "Origin": "CreateRouteTable" }, { "GatewayId": "local", "Origin": "CreateRouteTable", "State": "active", "DestinationIpv6CidrBlock": "2001:db8:1234:1a00::/56" }, { "GatewayId": "igw-1ff7a07b", "Origin": "CreateRoute", "State": "active", "DestinationIpv6CidrBlock": "::/0" } ] } ] }
  6. 라우팅 테이블이 현재 서브넷과 연결되어 있지 않습니다. 서브넷에서 보내는 트래픽이 인터넷 게이트웨이로 라우팅되도록 라우팅 테이블을 VPC의 해당 서브넷과 연결합니다. 먼저 서브넷을 설명하여 ID를 얻습니다. --filter 옵션을 사용하여 새 VPC의 서브넷만 반환하고, --query 옵션을 사용하여 서브넷 ID와 그 IPv6 CIDR 블록만 반환할 수 있습니다.

    aws ec2 describe-subnets --filters "Name=vpc-id,Values=vpc-2f09a348" --query "Subnets[*].{ID:SubnetId,IPv6CIDR:Ipv6CidrBlockAssociationSet[*].Ipv6CidrBlock}"
    [ { "ID": "subnet-b46032ec", "IPv6CIDR": [ "2001:db8:1234:1a01::/64" ], "ID": "subnet-a46032fc", "IPv6CIDR": [ "2001:db8:1234:1a01::/64" } ]
  7. 사용자 지정 라우팅 테이블과 연결할 서브넷을 선택할 수 있습니다(예: subnet-b46032ec). 이 서브넷이 퍼블릭 서브넷이 됩니다.

    aws ec2 associate-route-table --subnet-id subnet-b46032ec --route-table-id rtb-c1c8faa6

3단계: 외부 전용 프라이빗 서브넷 구성

VPC의 두 번째 서브넷이 IPv6 외부 전용 프라이빗 서브넷이 되도록 구성할 수 있습니다. 이 서브넷에서 시작하는 인스턴스는 외부 전용 인터넷 게이트웨이를 사용하여 IPv6를 통해 인터넷에 액세스할 수 있지만(예: 소프트웨어 업데이트 작업), 인터넷의 호스트는 인스턴스에 접속할 수 없습니다.

서브넷을 외부 전용 프라이빗 서브넷으로 만들려면

  1. VPC에 외부 전용 인터넷 게이트웨이를 생성합니다. 반환된 출력에 표시된 게이트웨이 ID를 메모해 둡니다.

    aws ec2 create-egress-only-internet-gateway --vpc-id vpc-2f09a348
    { "EgressOnlyInternetGateway": { "EgressOnlyInternetGatewayId": "eigw-015e0e244e24dfe8a", "Attachments": [ { "State": "attached", "VpcId": "vpc-2f09a348" } ] } }
  2. VPC에 대해 사용자 지정 라우팅 테이블 만듭니다. 반환된 출력에 표시된 라우팅 테이블 ID를 메모해 둡니다.

    aws ec2 create-route-table --vpc-id vpc-2f09a348
  3. 라우팅 테이블에 모든 IPv6 트래픽(::/0)이 외부 전용 인터넷 게이트웨이를 가리키는 경로를 만듭니다.

    aws ec2 create-route --route-table-id rtb-abc123ab --destination-ipv6-cidr-block ::/0 --egress-only-internet-gateway-id eigw-015e0e244e24dfe8a
  4. 라우팅 테이블을 VPC의 두 번째 서브넷에 연결합니다(앞 섹션에서 정의한 서브넷). 이 서브넷은 외부 전용 IPv6 인터넷 액세스가 가능한 프라이빗 서브넷이 됩니다.

    aws ec2 associate-route-table --subnet-id subnet-a46032fc --route-table-id rtb-abc123ab

4단계: 서브넷 수정

서브넷을 생성하면 다음을 수정할 수 있습니다.

  • 서브넷에서 시작된 인스턴스가 IPv6 주소를 자동으로 받도록 서브넷의 IP 주소 지정 동작을 수정할 수 있습니다. 서브넷에서 인스턴스를 시작할 경우, 단일 IPv6 주소는 서브넷의 범위로부터 인스턴스의 주 네트워크 인터페이스(eth0)에 할당됩니다.

  • 서브넷에서 시작된 서브넷 및 인스턴스에 대한 리소스 기반 이름(RBN) 설정입니다. RBN에 대한 자세한 내용은 Amazon EC2 사용 설명서Amazon EC2 인스턴스 호스트 이름 유형을 참조하십시오. 이 단원에 사용된 RBN 옵션에 대한 자세한 내용은 AWS CLI 명령 참조modify-subnet-attribute 또는 Amazon EC2 사용 설명서RBN 구성 수정을 참조하십시오.

aws ec2 modify-subnet-attribute --subnet-id subnet-b46032ec --assign-ipv6-address-on-creation --private-dns-hostname-type-on-launch resource-name --enable-resource-name-dns-aaaa-record-on-launch --enable-resource-name-dns-a-record-on-launch
aws ec2 modify-subnet-attribute --subnet-id subnet-a46032fc --assign-ipv6-address-on-creation --private-dns-hostname-type-on-launch resource-name --enable-resource-name-dns-aaaa-record-on-launch --enable-resource-name-dns-a-record-on-launch

5단계: 퍼블릭 서브넷에서 인스턴스 시작

퍼블릭 서브넷이 퍼블릭인지, 그리고 인터넷을 통해 해당 서브넷의 인스턴스에 액세스할 수 있는지 테스트하려면, 퍼블릭 서브넷에서 인스턴스를 시작하여 여기에 연결합니다. 먼저 인스턴스와 연결할 보안 그룹과 인스턴스에 연결하는 데 사용할 키 페어를 만들어야 합니다. 보안 그룹에 대한 자세한 내용은 보안 그룹을 사용하여 리소스에 대한 트래픽 제어 섹션을 참조하세요. 키 페어 액세스에 대한 자세한 내용은 Linux 인스턴스용 Amazon EC2 사용 설명서Amazon EC2 키 페어를 참조하십시오.

인스턴스를 실행할 때 사용할 수 있는 옵션에 대한 자세한 내용은 AWS CLI 명령 참조run-instances 또는 Amazon EC2 사용 설명서인스턴스 시작 마법사를 사용하여 인스턴스 시작 단원을 참조하십시오.

퍼블릭 서브넷에서 인스턴스를 시작하고 연결하려면

  1. 키 페어를 만든 다음 --query 옵션과 --output 텍스트 옵션을 사용하여 확장자가 .pem인 파일에 직접 프라이빗 키를 파이프합니다.

    aws ec2 create-key-pair --key-name MyKeyPair --query "KeyMaterial" --output text > MyKeyPair.pem

    이 예에서는 Amazon Linux 인스턴스를 시작합니다. Linux 또는 OS X 운영 체제에서 SSH 클라이언트를 사용하여 인스턴스에 연결하려면, 사용자만 프라이빗 키 파일을 읽을 수 있도록 다음 명령으로 해당 권한을 설정합니다.

    chmod 400 MyKeyPair.pem
  2. create-security-group 명령을 사용하여 VPC 보안 그룹을 생성합니다.

    aws ec2 create-security-group --group-name SSHAccess --description "Security group for SSH access" --vpc-id vpc-2f09a348
    { "GroupId": "sg-e1fb8c9a" }

    authoriz-security-group-ingress 명령을 사용하여 IPv6 주소에서 SSH 액세스를 허용하는 규칙을 추가합니다. 다음 구문은 Linux 및 macOS에서만 작동합니다. Windows에서 작동하는 구문에 대해서는 AWS CLI 명령 참조에서 섹션을 참조하세요.

    aws ec2 authorize-security-group-ingress --group-id sg-e1fb8c9a --ip-permissions '[{"IpProtocol": "tcp", "FromPort": 22, "ToPort": 22, "Ipv6Ranges": [{"CidrIpv6": "::/0"}]}]'
    참고

    ::/0을 사용하면 모든 IPv6 주소에서 SSH를 사용하여 인스턴스에 액세스할 수 있습니다. 이 예에서 잠시 사용하는 것은 괜찮지만 프로덕션 환경에서는 특정 IP 주소 또는 주소 범위만 인스턴스에 액세스하도록 승인하세요.

  3. 생성한 보안 그룹과 키 페어를 사용하여 퍼블릭 서브넷에서 IPv6 전용 EC2 인스턴스를 시작합니다. IPv6 전용 EC2 인스턴스를 시작하려면 Nitro 시스템에 구축된 EC2 인스턴스를 사용해야 합니다. 자세한 내용은 Amazon DNS 서버 섹션을 참조하세요. 출력에 표시된 인스턴스의 인스턴스 ID를 메모해 둡니다.

    aws ec2 run-instances --image-id ami-0de53d8956e8dcf80 --count 1 --instance-type t3.micro --key-name MyKeyPair --security-group-ids sg-e1fb8c9a --subnet-id subnet-b46032ec
    참고

    이 예에서 AMI는 미국 동부(버지니아 북부) 리전의 Amazon Linux AMI입니다. 다른 리전에 있는 경우, 해당 리전에 적합한 AMI의 AMI ID가 필요합니다. 자세한 내용은 Linux 인스턴스용 Amazon EC2 사용 설명서Linux AMI 찾기를 참조하세요.

  4. 인스턴스에 연결하려면 인스턴스가 running 상태에 있어야 합니다. 인스턴스를 설명하고 인스턴스의 상태를 확인한 다음, 해당 IPv6 주소를 메모해 둡니다.

    aws ec2 describe-instances --instance-id i-0146854b7443af453

    다음은 예제 출력입니다.

    { "Reservations": [ { ... "Instances": [ { ... "State": { "Code": 16, "Name": "running" }, ... "NetworkInterfaces": { "Ipv6Addresses": { "Ipv6Address": "2001:db8:1234:1a00::123" } ... } ] } ] }
  5. 인스턴스가 실행 상태에 있는 경우, 다음 명령을 사용하여 Linux 또는 OS X 컴퓨터에서 SSH 클라이언트를 통해 인스턴스에 연결할 수 있습니다. 로컬 컴퓨터에 IPv6 주소가 구성되어 있어야 합니다.

    ssh -i "MyKeyPair.pem" ec2-user@2001:db8:1234:1a00::123

    Windows 컴퓨터에서 연결하는 경우에는 PuTTY를 사용하여 Windows에서 Linux 인스턴스에 연결 지침을 따릅니다.

6단계: 프라이빗 서브넷으로 인스턴스 시작

외부 전용 프라이빗 서브넷의 인스턴스가 인터넷에 접속할 수 있는지 테스트하려면 프라이빗 서브넷에서 인스턴스를 시작하여 퍼블릭 서브넷의 배스천 인스턴스를 사용하여 그 인스턴스에 연결합니다(앞 섹션에서 시작한 인스턴스를 사용할 수 있음). 먼저 그 인스턴스에 대한 보안 그룹을 생성해야 합니다. 보안 그룹에는 배스천 인스턴스가 SSH를 사용하여 연결하도록 허용하는 규칙, 그리고 인터넷에 접속할 수 없는 인스턴스를 확인해야 하는 ping6 명령(ICMPv6 트래픽)을 허용하는 규칙이 있어야 합니다.

  1. create-security-group 명령을 사용하여 사용자의 VPC에서 보안 그룹을 생성합니다.

    aws ec2 create-security-group --group-name SSHAccessRestricted --description "Security group for SSH access from bastion" --vpc-id vpc-2f09a348

    authorize-security-group-ingress 명령을 사용하여 다음 규칙을 추가합니다. 퍼블릭 서브넷에 있는 인스턴스의 IPv6 주소에서 인바운드 SSH 액세스를 허용하는 규칙과 모든 ICMPv6 트래픽을 허용하는 규칙입니다. 다음 구문은 Linux 및 macOS에서만 작동합니다. Windows에서 작동하는 구문에 대해서는 AWS CLI 명령 참조에서 섹션을 참조하세요.

    { "GroupId": "sg-aabb1122" }
    aws ec2 authorize-security-group-ingress --group-id sg-aabb1122 --ip-permissions '[{"IpProtocol": "tcp", "FromPort": 22, "ToPort": 22, "Ipv6Ranges": [{"CidrIpv6": "2001:db8:1234:1a00::123/128"}]}]'
    aws ec2 authorize-security-group-ingress --group-id sg-aabb1122 --ip-permissions '[{"IpProtocol": "58", "FromPort": -1, "ToPort": -1, "Ipv6Ranges": [{"CidrIpv6": "::/0"}]}]'
  2. 생성한 보안 그룹과 퍼블릭 서브넷에서 인스턴스를 시작하기 위해 사용했던 키 페어를 사용하여 프라이빗 서브넷에서 IPv6 전용 인스턴스를 시작합니다. IPv6 전용 EC2 인스턴스를 시작하려면 Nitro 시스템에 구축된 EC2 인스턴스를 사용해야 합니다.

    aws ec2 run-instances --image-id ami-a4827dc9 --count 1 --instance-type t3.micro --key-name MyKeyPair --security-group-ids sg-aabb1122 --subnet-id subnet-a46032fc

    describe-instances 명령을 사용하여 인스턴스가 실행 중인지 확인하고 IPv6 주소를 얻습니다.

  3. 로컬 컴퓨터에서 SSH 에이전트 전달을 구성한 다음, 퍼블릭 서브넷의 인스턴스에 접속합니다.

    Linux의 경우 다음 명령을 사용합니다.

    ssh-add MyKeyPair.pem ssh -A ec2-user@2001:db8:1234:1a00::123

    OS X의 경우 다음 명령을 사용합니다.

    ssh-add -K MyKeyPair.pem ssh -A ec2-user@2001:db8:1234:1a00::123

    Windows에서는 Windows(PuTTY)에 대한 SSH 에이전트 전달을 구성하려면의 지침을 사용합니다. 인스턴스의 IPv6 주소를 사용하여 퍼블릭 서브넷의 인스턴스에 접속합니다.

  4. 퍼블릭 서브넷의 인스턴스(배스천 인스턴스)에서 IPv6 주소를 사용하여 프라이빗 서브넷의 인스턴스에 접속합니다.

    ssh ec2-user@2001:db8:1234:1a01::456
  5. 프라이빗 인스턴스에서 ICMP를 활성화한 웹 사이트에 대해 ping6 명령을 실행하여 인터넷에 연결할 수 있는지 테스트합니다. 예를 들면 다음과 같습니다.

    ping6 -n ietf.org
    PING ietf.org(2001:1900:3001:11::2c) 56 data bytes 64 bytes from 2001:1900:3001:11::2c: icmp_seq=1 ttl=46 time=73.9 ms 64 bytes from 2001:1900:3001:11::2c: icmp_seq=2 ttl=46 time=73.8 ms 64 bytes from 2001:1900:3001:11::2c: icmp_seq=3 ttl=46 time=73.9 ms ...
  6. 인터넷의 호스트가 프라이빗 서브넷의 인스턴스에 접속할 수 없는지 테스트하려면 IPv6를 사용할 수 있는 컴퓨터에서 ping6 명령을 사용합니다. 제한 시간 응답을 얻어야 합니다. 유효한 응답을 얻으면 인터넷에서 인스턴스에 액세스할 수 있습니다. 프라이빗 서브넷과 연결된 라우팅 테이블을 확인하고 인터넷 게이트웨이에 대한 IPv6 트래픽 경로가 있는지 확인하세요.

    ping6 2001:db8:1234:1a01::456

7단계: 정리

퍼블릭 서브넷의 인스턴스에 접속할 수 있고 프라이빗 서브넷의 인스턴스가 인터넷에 접속할 수 있음을 확인한 후에는, 필요 없는 인스턴스를 종료할 수 있습니다. 이렇게 하려면 terminate-instances 명령을 사용합니다. 이 예에서 만든 리소스를 삭제하려면 다음 명령을 나열된 순서대로 사용합니다.

  1. 보안 그룹 삭제:

    aws ec2 delete-security-group --group-id sg-e1fb8c9a
    aws ec2 delete-security-group --group-id sg-aabb1122
  2. 서브넷 삭제:

    aws ec2 delete-subnet --subnet-id subnet-b46032ec
    aws ec2 delete-subnet --subnet-id subnet-a46032fc
  3. 사용자 지정 라우팅 테이블 삭제:

    aws ec2 delete-route-table --route-table-id rtb-c1c8faa6
    aws ec2 delete-route-table --route-table-id rtb-abc123ab
  4. VPC에서 인터넷 게이트웨이 분리:

    aws ec2 detach-internet-gateway --internet-gateway-id igw-1ff7a07b --vpc-id vpc-2f09a348
  5. 인터넷 게이트웨이 삭제:

    aws ec2 delete-internet-gateway --internet-gateway-id igw-1ff7a07b
  6. 외부 전용 인터넷 게이트웨이 삭제:

    aws ec2 delete-egress-only-internet-gateway --egress-only-internet-gateway-id eigw-015e0e244e24dfe8a
  7. VPC 삭제:

    aws ec2 delete-vpc --vpc-id vpc-2f09a348