AWS CLI を使用して IPv6 対応 VPC と IPv6 専用サブネットを作成する
次の例では、AWS CLI コマンドを使用して、IPv6 CIDR ブロックを持つデフォルト以外の VPC、パブリック IPv6 専用サブネット、アウトバウンドのインターネットアクセス専用のプライベート IPv6 専用サブネットを作成します。VPC およびサブネットを作成したら、パブリックサブネット内にインスタンスを起動して、接続できるようになります。プライベートサブネット内のインスタンスを起動し、インターネットに接続できることを確認できます。開始するには、最初に AWS CLI をインストールして設定する必要があります。詳細については、「AWS CLI のインストール」を参照してください。
次の AWS リソースを作成します。
-
VPC
-
2 つのサブネット
-
インターネットゲートウェイ
-
ルートテーブル
-
EC2 インスタンス
タスク
ステップ 1: VPC とサブネットを作成する
最初のステップは、VPC を作成することです。この例では、主に IPv6 に焦点を当てていますが、VPC の IPv4 CIDR ブロックを定義する必要があります。この例では、VPC の IPv4 CIDR ブロック 10.0.0.0/16
を使用しますが、別の CIDR ブロックを選択することもできます。詳細については、「VPC のサイジング」を参照してください。
AWS CLI を使用して VPC およびサブネットを作成するには
-
IPv6 CIDR ブロック (
10.0.0.0/16
) を持つ VPC を作成し、CIDR ブロックを VPC と関連付けます。aws ec2 create-vpc --cidr-block
10.0.0.0/16
--amazon-provided-ipv6-cidr-block返される出力で、VPC ID を書き留めておいてください。
{ "Vpc": { "VpcId": "vpc-2f09a348", ... }
-
VPC に関連付けられている IPv6 CIDR ブロックを得るために、VPC について説明します。
aws ec2 describe-vpcs --vpc-id
vpc-2f09a348
{ "Vpcs": [ { ... "Ipv6CidrBlockAssociationSet": [ { "Ipv6CidrBlock": "2001:db8:1234:1a00::/56", "AssociationId": "vpc-cidr-assoc-17a5407e", "Ipv6CidrBlockState": { "State": "ASSOCIATED" } } ], ... }
-
(前述のステップで返された範囲の)
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-block2001:db8:1234:1a00::/64
--ipv6-native -
2001:db8:1234:1a01::/64
IPv6 CIDR ブロックを持つ VPC で、2 番目の IPv6 専用サブネットを作成します。aws ec2 create-subnet --vpc-id
vpc-2f09a348
--ipv6-cidr-block2001:db8:1234:1a01::/64
--ipv6-native
ステップ 2: パブリックサブネットを設定する
VPC およびサブネットを作成後、VPC にインターネットゲートウェイをアタッチしてカスタムルートテーブルを作成し、インターネットゲートウェイへのサブネットのルーティングを構成すると、IPv6 サブネットの 1 つをパブリックサブネットにすることができます。この例では、IPv6 トラフィックをすべてインターネットゲートウェイへルーティングするルートテーブルが作成されます。
サブネットをパブリックサブネットにするには
-
インターネットゲートウェイを作成します。
aws ec2 create-internet-gateway
返される出力に、インターネットゲートウェイ ID を書き留めます。
{ "InternetGateway": { ... "InternetGatewayId": "igw-1ff7a07b", ... } }
-
前のステップの ID を使用して、VPC にインターネットゲートウェイをアタッチします。
aws ec2 attach-internet-gateway --vpc-id
vpc-2f09a348
--internet-gateway-idigw-1ff7a07b
-
VPC に対してカスタムルートテーブルを作成します。
aws ec2 create-route-table --vpc-id
vpc-2f09a348
返される出力で示されたルートテーブル ID を書き留めます。
{ "RouteTable": { ... "RouteTableId": "rtb-c1c8faa6", ... } }
-
すべての IPv6 トラフィック (
::/0
) をインターネットゲートウェイに向けるルートをルートテーブルに作成します。aws ec2 create-route --route-table-id
rtb-c1c8faa6
--destination-ipv6-cidr-block::/0
--gateway-idigw-1ff7a07b
-
ルートが作成され有効になっていることを確認するには、ルートテーブルを記述して結果を表示できます。
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" } ] } ] }
-
ルートテーブルは、現時点でどのサブネットにも関連付けられていません。サブネットからのトラフィックがインターネットゲートウェイにルーティングされるよう、ルートテーブルを 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" } ]
-
カスタムルートテーブルに関連付けるサブネット、例えば
subnet-b46032ec
を選択できます。このサブネットはパブリックサブネットになります。aws ec2 associate-route-table --subnet-id
subnet-b46032ec
--route-table-idrtb-c1c8faa6
ステップ 3: Egress-Only プライベートサブネットを設定する
2 番目のサブネットを VPC に設定すると、IPv6 の Egress-Only プライベートサブネットとして使用できます。このサブネット内に起動されるインスタンスは、Egress-Only インターネットゲートウェイを通じて IPv6 経由でインターネットにアクセスできますが (例: ソフトウェアアップデートの取得)、インターネットのホストがインスタンスに到達することはできません。
サブネットを Egress-Only プライベートサブネットにするには
-
VPC の Egress-Only インターネットゲートウェイを作成します。返される出力で示されたインターネットゲートウェイ ID を書き留めます。
aws ec2 create-egress-only-internet-gateway --vpc-id
vpc-2f09a348
{ "EgressOnlyInternetGateway": { "EgressOnlyInternetGatewayId": "eigw-015e0e244e24dfe8a", "Attachments": [ { "State": "attached", "VpcId": "vpc-2f09a348" } ] } }
-
VPC に対してカスタムルートテーブルを作成します。返される出力で示されたルートテーブル ID を書き留めます。
aws ec2 create-route-table --vpc-id
vpc-2f09a348
-
すべての IPv6 トラフィック (
::/0
) を Egress-Only インターネットゲートウェイに向けるルートをルートテーブルに作成します。aws ec2 create-route --route-table-id
rtb-abc123ab
--destination-ipv6-cidr-block::/0
--egress-only-internet-gateway-ideigw-015e0e244e24dfe8a
-
ルートテーブルを VPC 内の 2 番目のサブネット (前のセクションで説明済み) に関連付けます 。このサブネットは、Egress-Only IPv6 でインターネットアクセスするプライベートサブネットになります。
aws ec2 associate-route-table --subnet-id
subnet-a46032fc
--route-table-idrtb-abc123ab
ステップ 4: サブネットを変更する
サブネットを作成したら、以下を変更できます。
サブネット内で起動されたインスタンスが IPv6 アドレスを自動的に取得できるように、サブネットの IP アドレス動作を変更できます。サブネットにインスタンスを起動すると、サブネットの範囲内からインスタンスのプライマリネットワークインターフェイス (eth0) に IPv6 アドレスが 1 つ割り当てられます。
サブネットとサブネットに起動されたインスタンスのリソースベースの名前 (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 ユーザーガイドのインスタンス起動ウィザードを使用するインスタンスの起動を参照してください。
パブリックサブネット内のインスタンスを起動して接続するには
-
キーペアを作成して、
--query
オプションと--output
テキストオプションを使用し、.pem
拡張機能でプライベートキーをファイルに直接パイプします。aws ec2 create-key-pair --key-name
MyKeyPair
--query "KeyMaterial" --output text >MyKeyPair.pem
この例では、Amazon Linux インスタンスを起動します。Linux または OS X オペレーティングシステムの SSH クライアントを使用して Linux インスタンスに接続する場合は、次のコマンドを使用してプライベートキーファイルの権限を設定すると、お客様以外のユーザーはそれを読み取ることができないようになります。
chmod 400
MyKeyPair.pem
-
create-security-group コマンドを使用して、VPC にセキュリティグループを作成します。
aws ec2 create-security-group --group-name
SSHAccess
--description "Security group for SSH access
" --vpc-idvpc-2f09a348
{ "GroupId": "sg-e1fb8c9a" }
authorize-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 アドレスまたはアドレス範囲のみがインスタンスへのアクセスを許可されます。 -
作成したセキュリティグループとキーペアを使用して、パブリックサブネット内に IPv6 専用 EC2 インスタンスを起動します。IPv6 専用 EC2 インスタンスを起動するには、Nitro System 上に構築された EC2 インスタンスを使用する必要があります。詳細については、「Amazon DNS サーバー」を参照してください。出力内のインスタンスのインスタンス ID をメモしておきます。
aws ec2 run-instances --image-id
ami-0de53d8956e8dcf80
--count 1 --instance-typet3.micro
--key-nameMyKeyPair
--security-group-idssg-e1fb8c9a
--subnet-idsubnet-b46032ec
注記 この例で、AMI は米国東部 (バージニア北部) リージョンの Amazon Linux AMI です。別のリージョンの場合、リージョン内に適した AMI の AMI ID が必要になります。詳細については、Linux インスタンス用 Amazon EC2 ユーザーガイドの「Linux AMI の検索」を参照してください。
-
インスタンスに接続するには、そのインスタンスが
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" } ... } ] } ] }
-
インスタンスが実行状態にあるときは、次のコマンドで、Linux または OS X コンピューターの SSH クライアントを使用してそのインスタンスに接続できます。ローカルコンピューターに、設定済みの IPv6 アドレスが必要です。
ssh -i "
MyKeyPair.pem
"ec2-user@2001:db8:1234:1a00::123
Windows コンピュータから接続する場合は、「PuTTY を使用した Windows から Linux インスタンスへの接続」の手順を使用します。
ステップ 6: プライベートサブネット内にインスタンスを起動する
Egress-Only プライベートサブネット内のインスタンスがインターネットにアクセスできることをテストするには、プライベートサブネット内のインスタンスを起動し、パブリックサブネット内の踏み台インスタンスを使用してインスタンスに接続します (前のセクションで起動したインスタンスを使用できます)。最初に、インスタンスのセキュリティグループを作成する必要があります。セキュリティグループには、踏み台インスタンスが SSH を使用して接続できるようにするルール、およびインスタンスにインターネットからアクセス可能でないという確認を ping6
コマンド (ICMPv6 トラフィック) に許可するルールが必要です。
-
create-security-group コマンドを使用して、VPC にセキュリティグループを作成します。
aws ec2 create-security-group --group-name
SSHAccessRestricted
--description "Security group for SSH access from bastion
" --vpc-idvpc-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
"}]}]' -
プライベートサブネット内に IPv6 専用インスタンスを起動します。この際、作成したセキュリティグループと、パブリックサブネット内にインスタンスを起動する際に使用したものと同じキーペアを使用します。IPv6 専用 EC2 インスタンスを起動するには、Nitro System 上に構築された EC2 インスタンスを使用する必要があります。
aws ec2 run-instances --image-id
ami-a4827dc9
--count 1 --instance-typet3.micro
--key-nameMyKeyPair
--security-group-idssg-aabb1122
--subnet-idsubnet-a46032fc
describe-instances
コマンドを使用して、インスタンスが稼働していることを確認し、IPv6 アドレスを取得します。 -
ローカルマシンの 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 アドレスを使用して、パブリックサブネットのインスタンスに接続します。
-
パブリックサブネットのインスタンス (踏み台インスタンス) から、IPv6 アドレスを使用して、プライベートサブネットのインスタンスに接続します。
ssh ec2-user@
2001:db8:1234:1a01::456
-
プライベートインスタンスから、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 ...
-
インターネットのホストがプライベートサブネットのインスタンスに到達できないことをテストするには、IPv6 が有効になっているコンピューターから
ping6
コマンドを使用します。タイムアウト応答が返ります。有効なレスポンスが表示される場合、インスタンスはインターネットからアクセス可能です。プライベートサブネットに関連付けられているルートテーブルを確認し、IPv6 トラフィックからインターネットゲートウェイへのルートがないことを確認します。ping6
2001:db8:1234:1a01::456
ステップ 7: クリーンアップ
パブリックサブネットのインスタンスに接続できること、プライベートサブネットのインスタンスがインターネットにアクセスできることを確認したら、不要になったインスタンスを終了できます。これを行うには、terminate-instances コマンドを使用します。この例で作成したそのほかのリソースを削除するには、 の順にコマンドを実行します。
-
セキュリティグループを削除する:
aws ec2 delete-security-group --group-id
sg-e1fb8c9a
aws ec2 delete-security-group --group-id
sg-aabb1122
-
サブネットを削除する:
aws ec2 delete-subnet --subnet-id
subnet-b46032ec
aws ec2 delete-subnet --subnet-id
subnet-a46032fc
-
カスタムルートテーブルを削除する:
aws ec2 delete-route-table --route-table-id
rtb-c1c8faa6
aws ec2 delete-route-table --route-table-id
rtb-abc123ab
-
VPC からのインターネットゲートウェイのデタッチ:
aws ec2 detach-internet-gateway --internet-gateway-id
igw-1ff7a07b
--vpc-idvpc-2f09a348
-
インターネットゲートウェイの削除:
aws ec2 delete-internet-gateway --internet-gateway-id
igw-1ff7a07b
-
Egress-Only インターネットゲートウェイを削除する:
aws ec2 delete-egress-only-internet-gateway --egress-only-internet-gateway-id
eigw-015e0e244e24dfe8a
-
VPC の削除:
aws ec2 delete-vpc --vpc-id
vpc-2f09a348