例: AWS CLI を使用して IPv6 VPC とサブネットを作成 - Amazon Virtual Private Cloud

例: AWS CLI を使用して IPv6 VPC とサブネットを作成

次の例では、AWS CLI コマンドを使用して、IPv6 CIDR ブロックを持つデフォルト以外の VPC 、パブリックサブネット、アウトバウンドのインターネットアクセス専用のプライベートサブネットを作成します。VPC およびサブネットを作成したら、パブリックサブネット内にインスタンスを起動して、接続できるようになります。プライベートサブネット内のインスタンスを起動し、インターネットに接続できることを確認できます。開始するには、最初に AWS CLI をインストールして設定する必要があります。詳細については、「AWS CLI のインストール」を参照してください。

次の AWS リソースを作成します。

  • VPC

  • 2 つのサブネット

  • インターネットゲートウェイ

  • ルートテーブル

  • EC2 インスタンス

ステップ 1: VPC とサブネットを作成する

最初のステップは、VPC、2 つのサブネットを作成することです。この例では、VPC の IPv4 CIDR ブロック 10.0.0.0/16 を使用しますが、別の CIDR ブロックを選択することもできます。詳細については、「VPC とサブネットのサイズ設定」を参照してください。

AWS CLI を使用して VPC およびサブネットを作成するには

  1. 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", ... }
  2. 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" } } ], ... }
  3. (前述のステップで返された範囲の) 10.0.0.0/24IPv4 CIDR ブロックと 2001:db8:1234:1a00::/64IPv6 CIDR ブロックを持つサブネット作成します 。

    aws ec2 create-subnet --vpc-id vpc-2f09a348 --cidr-block 10.0.0.0/24 --ipv6-cidr-block 2001:db8:1234:1a00::/64
  4. 10.0.1.0/24IPv4 CIDR ブロックと 2001:db8:1234:1a01::/64IPv6 CIDR ブロックを持つ VPC に 2 番目のサブネットを作成します。

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

ステップ 2: パブリックサブネットを設定する

VPC およびサブネットを作成した後、VPC にインターネットゲートウェイをアタッチして、カスタムルートテーブルを作成し、インターネットゲートウェイへのサブネットのルーティングを構成すると、サブネットをパブリックサブネットにすることができます。この例では、IPv4 トラフィックと 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
    注記

    IPv4 トラフィックに対してもパブリックサブネットを使用する場合は、インターネットゲートウェイを指す 0.0.0.0/0 トラフィック のルートを別途追加する必要があります。

  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 と IPv4 および IPv6 CIDR ブロックだけを返します。

    aws ec2 describe-subnets --filters "Name=vpc-id,Values=vpc-2f09a348" --query "Subnets[*].{ID:SubnetId,IPv4CIDR:CidrBlock,IPv6CIDR:Ipv6CidrBlockAssociationSet[*].Ipv6CidrBlock}"
    [ { "IPv6CIDR": [ "2001:db8:1234:1a00::/64" ], "ID": "subnet-b46032ec", "IPv4CIDR": "10.0.0.0/24" }, { "IPv6CIDR": [ "2001:db8:1234:1a01::/64" ], "ID": "subnet-a46032fc", "IPv4CIDR": "10.0.1.0/24" } ]
  7. カスタムルートテーブルに関連付けるサブネット、例えば subnet-b46032ec を選択できます。このサブネットはパブリックサブネットになります。

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

ステップ 3: Egress-Only プライベートサブネットを設定する

2 番目のサブネットを VPC に設定すると、IPv6 の Egress-Only プライベートサブネットとして使用できます。このサブネット内に起動されるインスタンスは、Egress-Only インターネットゲートウェイを通じて IPv6 経由でインターネットにアクセスできますが (例: ソフトウェアアップデートの取得)、インターネットのホストがインスタンスに到達することはできません。

サブネットを Egress-Only プライベートサブネットにするには

  1. 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" } ] } }
  2. VPC に対してカスタムルートテーブルを作成します。返される出力で示されたルートテーブル ID を書き留めます。

    aws ec2 create-route-table --vpc-id vpc-2f09a348
  3. すべての IPv6 トラフィック (::/0) を Egress-Only インターネットゲートウェイに向けるルートをルートテーブルに作成します。

    aws ec2 create-route --route-table-id rtb-abc123ab --destination-ipv6-cidr-block ::/0 --egress-only-internet-gateway-id eigw-015e0e244e24dfe8a
  4. ルートテーブルを VPC 内の 2 番目のサブネット (前のセクションで説明済み) に関連付けます 。このサブネットは、Egress-Only IPv6 でインターネットアクセスするプライベートサブネットになります。

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

ステップ 4: サブネットの IPv6 アドレス動作を変更する

サブネット内で起動されたインスタンスが IPv6 アドレスを自動的に取得できるように、サブネットの IP アドレス動作を変更できます。サブネットにインスタンスを起動すると、サブネットのアドレス範囲内からインスタンスのプライマリネットワークインターフェイス (eth0) に IPv6 アドレスが 1 つ割り当てられます。

aws ec2 modify-subnet-attribute --subnet-id subnet-b46032ec --assign-ipv6-address-on-creation
aws ec2 modify-subnet-attribute --subnet-id subnet-a46032fc --assign-ipv6-address-on-creation

ステップ 5: パブリックサブネット内にインスタンスを起動する

パブリックサブネットがパブリックであること、および、サブネット内のインスタンスにインターネットでアクセスできることをテストするには、パブリックサブネット内でインスタンスを起動して接続します。最初に、インスタンスに関連付けるセキュリティグループと、インスタンスに接続するキーペアを作成する必要があります。セキュリティグループの詳細については、VPC のセキュリティグループ を参照してください。キーペアの詳細については、Linux インスタンス用 Amazon EC2 ユーザーガイドの「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 クライアントを使用して Linux インスタンスに接続する場合は、次のコマンドを使用してプライベートキーファイルの権限を設定すると、お客様以外のユーザーはそれを読み取ることができないようになります。

    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" }

    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 アドレスまたはアドレス範囲のみがインスタンスへのアクセスを許可されます。

  3. 作成したセキュリティグループとキーペアを使用して、パブリックサブネット内にインスタンスを起動します。出力内のインスタンスのインスタンス ID をメモしておきます。

    aws ec2 run-instances --image-id ami-0de53d8956e8dcf80 --count 1 --instance-type t2.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: プライベートサブネット内にインスタンスを起動する

Egress-Only プライベートサブネット内のインスタンスがインターネットにアクセスできることをテストするには、プライベートサブネット内のインスタンスを起動し、パブリックサブネット内の踏み台インスタンスを使用してインスタンスに接続します (前のセクションで起動したインスタンスを使用できます)。最初に、インスタンスのセキュリティグループを作成する必要があります。セキュリティグループには、踏み台インスタンスが 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. プライベートサブネット内にインスタンスを起動します。この際、作成したセキュリティグループと、パブリックサブネット内にインスタンスを起動する際に使用したのと同一のキーペアを使用します。

    aws ec2 run-instances --image-id ami-a4827dc9 --count 1 --instance-type t2.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. Egress-Only インターネットゲートウェイを削除する:

    aws ec2 delete-egress-only-internet-gateway --egress-only-internet-gateway-id eigw-015e0e244e24dfe8a
  7. VPC の削除:

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