Google Cloud と AWS 間の HA VPN 接続を作成する

このチュートリアルでは、2 つのクラウド プラットフォームで VPC ネットワーク間の直接通信を実現するために、Google Cloud とアマゾン ウェブ サービス(AWS)間で高可用性の VPN 接続を作成する方法について説明します。

このチュートリアルでは、Virtual Private Cloud(VPC)ネットワーク、Border Gateway Protocol(BGP)、バーチャル プライベート ネットワーク(VPN)、IPsec トンネルの基本コンセプトについて理解していることを前提としています。

Google Cloud では、高可用性(HA)VPN サービスを使用して、IPsec VPN 接続経由で VPC ネットワークを Google Cloud の外部で(オンプレミスや AWS などで)実行されている環境に接続できます。HA VPN は、Google のベスト プラクティスに基づいて構成した場合、99.99% のサービス可用性の SLA を実現します。

アーキテクチャの概要

このドキュメントで説明するアーキテクチャには、次のコンポーネントが含まれています。

  • Cloud Router: 完全に分散されたフルマネージドの Google Cloud サービスを使用して、VPC ネットワークで BGP による動的ルーティングを実現できます。
  • HA VPN ゲートウェイ: Google Cloud 上で実行される Google 管理の VPN ゲートウェイ。各 HA VPN ゲートウェイは、それぞれ独自の外部 IP アドレスを持つインターフェース 0 と 1 の 2 つのインターフェースがあるリージョン リソースです。
  • VPN トンネル: 暗号化されたトラフィックが通過する HA VPN ゲートウェイから AWS 上のピア VPN ゲートウェイへの接続。
  • ピア VPN ゲートウェイ: 2 つの AWS サイト間 VPN エンドポイント。AWS 仮想プライベート ゲートウェイまたは AWS トランジット ゲートウェイのいずれかから指定できます。

各ピア VPN ゲートウェイ接続には、1 つのカスタマー ゲートウェイ(この場合は Google Cloud HA VPN インターフェース)を指すように事前構成された 2 つのトンネルがあります。この構成では、99.99% のサービス可用性 SLA を満たすトンネルの最小数は 4 です。

VPN トンネルを介したルーティング オプションと組み合わせる帯域幅は、AWS 側で使用されるサイト間 VPN オプションによって異なります。

次の図にアーキテクチャを示します。

アーキテクチャの概要。

目標

  • Google Cloud で VPC ネットワークを作成します。
  • Google Cloud で HA VPN ゲートウェイと Cloud Router を作成します。
  • AWS でカスタマー ゲートウェイを作成します。
  • AWS で動的ルーティングを使用して VPN 接続を作成します。
  • Google Cloud で外部 VPN ゲートウェイと VPN トンネルを作成します。
  • Google Cloud と AWS で VPC ネットワーク間の VPN 接続を検証し、テストします。

費用

このチュートリアルでは、以下のものをはじめとする Google Cloud の課金対象となるコンポーネントを使用します。

Google Cloud コンポーネントの費用を見積もるには、Google Cloud 料金計算ツールを使用してください。

このチュートリアルでは、以下のものをはじめとするアマゾン ウェブ サービス(AWS)の課金対象となるコンポーネントを使用します。

  • AWS トランジット ゲートウェイ
  • AWS サイト間 VPN

AWS コンポーネントの費用を見積もるには、AWS 料金計算ツールを使用してください。

始める前に

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Enable the Compute Engine API.

    Enable the API

  4. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

  5. ネットワーク コンポーネントの構成に必要な管理者ロールを付与されていることを確認します。

    • ネットワーク管理者: compute.networkAdmin
    • セキュリティ管理者: compute.securityAdmin
    • Compute 管理者: compute.admin

    これらのロールの目的の詳細については、ネットワーク関連ジョブ機能の IAM のロールをご覧ください。

Google Cloud で HA VPN ゲートウェイと Cloud Router を作成する

このセクションでは、Google Cloud で VPC ネットワーク、HA VPN ゲートウェイ、Cloud Router を作成します。

  1. Cloud Shell で、ご自身が作成または選択した Google Cloud プロジェクトで作業していることを確認します。

    gcloud config set project YOUR_PROJECT_ID
    
    export PROJECT_ID=`gcloud config list --format="value(core.project)"`

    YOUR_PROJECT_ID を実際の Google Cloud プロジェクト ID に置き換えます。

  2. 単一のサブネットを使用して、カスタム VPC ネットワークを作成します。

    gcloud compute networks create NETWORK \
        --subnet-mode SUBNET_MODE \
        --bgp-routing-mode BGP_ROUTING_MODE

    次のように置き換えます。

    コマンドは次の例のようになります。

    gcloud compute networks create gc-vpc \
        --subnet-mode custom \
        --bgp-routing-mode global
    
  3. テスト用 VM をホストするサブネットを 1 つ作成します。

    gcloud compute networks subnets create SUBNET_NAME \
        --network NETWORK \
        --region SUBNET_REGION \
        --range IP_ADDRESS_RANGE

    次のように置き換えます。

    コマンドは次の例のようになります。

    gcloud compute networks subnets create subnet-east4  \
        --network gc-vpc \
        --region us-east4 \
        --range 10.1.1.0/24
    
  4. HA VPN ゲートウェイを作成します。

    gcloud compute vpn-gateways create HA_VPN_GATEWAY_NAME \
        --network NETWORK \
        --region REGION

    HA_VPN_GATEWAY_NAME は HA VPN ゲートウェイの名前に置き換えます。

  5. Cloud Router を作成します。

    gcloud compute routers create ROUTER_NAME \
        --region REGION \
        --network NETWORK \
        --asn GOOGLE_ASN \
        --advertisement-mode custom \
        --set-advertisement-groups all_subnets

    次のように置き換えます。

    • ROUTER_NAME: Cloud Router の名前
    • GOOGLE_ASN: 作成する Cloud Router のプライベート ASN(自律システム番号)64512~65534 または 4200000000~4294967294 の範囲の任意のプライベート ASN を指定できます。ただし、同じリージョンおよびネットワークでまだピア ASN として使用していないことが条件です。

    コマンドは次の例のようになります。

    gcloud compute routers create cloud-router \
        --region us-east4 \
        --network gc-vpc \
        --asn 65534 \
        --advertisement-mode custom \
        --set-advertisement-groups all_subnets
    

この手順では、2 つのインターフェースを持つ VPN ゲートウェイを作成します。AWS 側で環境を設定するときに使用できるように、外部アドレスをメモしておきます。

AWS でゲートウェイと VPN 接続を作成する

このセクションでは、カスタマー ゲートウェイ、ターゲット ゲートウェイ、動的ルーティングを使用する VPN 接続を作成します。

AWS コマンドを実行するには、AWS コマンドライン インターフェースを使用します。

  1. 次の AWS コマンドを使用してカスタマー ゲートウェイを 2 つ作成します。

    aws ec2 create-customer-gateway --type ipsec.1 --public-ip INTERFACE_0_IP_ADDRESS --bgp-asn GOOGLE_ASN
    
    aws ec2 create-customer-gateway --type ipsec.1 --public-ip INTERFACE_1_IP_ADDRESS --bgp-asn GOOGLE_ASN

    INTERFACE_0_IP_ADDRESSINTERFACE_1_IP_ADDRESS は、前のセクションの最後のステップで取得したパブリック IP アドレスに置き換えます。

  2. ターゲット ゲートウェイを作成し、VPC ネットワークに接続します。

    ターゲット ゲートウェイは、仮想プライベート ゲートウェイまたはトランジット ゲートウェイです。詳細については、ターゲット ゲートウェイの作成をご覧ください。

    仮想プライベート ゲートウェイまたはトランジット ゲートウェイの手順に沿って操作します。

    • 仮想プライベート ゲートウェイ:

      1. 特定の AWS 側の ASN を使用して、仮想プライベート ゲートウェイを作成します。

        aws ec2 create-vpn-gateway --type ipsec.1 --amazon-side-asn AWS_SIDE_ASN

        AWS_SIDE_ASN は、AWS 側の ASN に置き換えます。

        このコマンドは、次の例のようになります。

        aws ec2 create-vpn-gateway --type ipsec.1 --amazon-side-asn 65001
        
      2. 仮想プライベート ゲートウェイを VPC ネットワークに接続します。

        aws ec2 attach-vpn-gateway --vpn-gateway-id VPN_GATEWAY_ID --vpc-id VPC_ID
    • トランジット ゲートウェイ:

      1. トランジット ゲートウェイを作成します。

        aws ec2 create-transit-gateway --description TRANSIT_GATEWAY_DESCRIPTION \
            --options=AmazonSideAsn=65001,AutoAcceptSharedAttachments=enable,DefaultRouteTableAssociation=enable,DefaultRouteTablePropagation=enable,VpnEcmpSupport=enable,DnsSupport=enable

        TRANSIT_GATEWAY_DESCRIPTION は、トランジット ゲートウェイの説明に置き換えます。

      2. VPC ネットワークをトランジット ゲートウェイに接続します。

        aws ec2 create-transit-gateway-vpc-attachment \
            --transit-gateway-id TRANSIT_GATEWAY_ID \
            --vpc-id VPC_ID \
            --subnet-id SUBNET_ID
  3. 動的ルーティングを使用して VPN 接続を作成します。

    動的ルーティングを使用して VPN 接続を作成する方法は、ターゲット ゲートウェイが仮想プライベート ゲートウェイかトランジット ゲートウェイかによって異なります。詳細については、サイト間 VPN 接続を作成するをご覧ください。

    仮想プライベート ゲートウェイまたはトランジット ゲートウェイの手順に沿って操作します。

    • 仮想プライベート ゲートウェイ:

      仮想プライベート ゲートウェイとカスタマー ゲートウェイの間の動的ルーティングを使用して VPN 接続を作成し、VPN 接続にタグを適用します。

          aws ec2 create-vpn-connection \
              --type ipsec.1 \
              --customer-gateway-id CUSTOMER_GATEWAY_1 \
              --vpn-gateway-id VPN_GATEWAY_ID \
              --options TunnelOptions='[{TunnelInsideCidr=AWS_T1_IP,PreSharedKey=SHARED_SECRET_1},{TunnelInsideCidr=AWS_T2_IP,PreSharedKey=SHARED_SECRET_2}]'
      
          aws ec2 create-vpn-connection \
              --type ipsec.1 \
              --customer-gateway-id CUSTOMER_GATEWAY_2 \
              --vpn-gateway-id VPN_GATEWAY_ID \
              --options TunnelOptions='[{TunnelInsideCidr=AWS_T3_IP,PreSharedKey=SHARED_SECRET_3},{TunnelInsideCidr=AWS_T4_IP,PreSharedKey=SHARED_SECRET_4}]'
    • トランジット ゲートウェイ:

      トランジット ゲートウェイとカスタマー ゲートウェイの間の動的ルーティングを使用する VPN 接続を作成します。

      aws ec2 create-vpn-connection \
          --type ipsec.1 \
          --customer-gateway-id CUSTOMER_GATEWAY_1 \
          --transit-gateway-id TRANSIT_GATEWAY_ID \
          --options TunnelOptions='[{TunnelInsideCidr=AWS_T1_IP,PreSharedKey=SHARED_SECRET_1},{TunnelInsideCidr=AWS_T2_IP,PreSharedKey=SHARED_SECRET_2}]'
      
      aws ec2 create-vpn-connection \
          --type ipsec.1 \
          --customer-gateway-id CUSTOMER_GATEWAY_2 \
          --transit-gateway-id TRANSIT_GATEWAY_ID \
          --options TunnelOptions='[{TunnelInsideCidr=AWS_T3_IP,PreSharedKey=SHARED_SECRET_3},{TunnelInsideCidr=AWS_T4_IP,PreSharedKey=SHARED_SECRET_4}]'

      次のように置き換えます。

      • CUSTOMER_GATEWAY_1: Google Cloud VPN ゲートウェイ、インターフェース 0
      • CUSTOMER_GATEWAY_2: Google Cloud VPN ゲートウェイ、インターフェース 1
      • AWS_T1_IP: 接続 1、トンネル 1 の仮想プライベート ゲートウェイの内部 IP アドレス
      • AWS_T2_IP: 接続 1、トンネル 2 の仮想プライベート ゲートウェイの内部 IP アドレス
      • AWS_T3_IP: 接続 2、トンネル 1 の仮想プライベート ゲートウェイの内部 IP アドレス
      • AWS_T4_IP: 接続 2、トンネル 2 の仮想プライベート ゲートウェイの内部 IP アドレス
      • SHARED_SECRET_1: 接続 1、トンネル 1 の事前共有キー
      • SHARED_SECRET_2: 接続 1、トンネル 2 の事前共有キー
      • SHARED_SECRET_3: 接続 2、トンネル 1 の事前共有キー
      • SHARED_SECRET_4: 接続 2、トンネル 2 の事前共有キー

      AWS は一部の CIDR 範囲を予約しているため、これらの範囲の値を内部 IP アドレス(AWS_T1_IPAWS_T2_IPAWS_T3_IPAWS_T4_IP)として使用することはできません。AWS が予約する CIDR ブロックについては、内部トンネル IPv4 CIDR をご覧ください。

      これらのコマンドにより、Google Cloud への 4 つのトンネルが作成されます。

  4. 2 つの VPN 接続の構成ファイルをダウンロードします。

    この後の手順では、構成ファイルの値を使用して、Google Cloud 側でリソースの作成と構成を行います。

Google Cloud で VPN トンネルと Cloud Router インターフェースを作成する

このセクションでは、前のセクションで作成した AWS VPN 接続の情報を使用して、Google Cloud でコンポーネントの作成と構成を行います。

AWS への VPN トンネルを構成する場合は、IKEv2 暗号化プロトコルを使用し、AWS 側で選択する変換セットを低減します。たとえば、単一のフェーズ 1 およびフェーズ 2 暗号化アルゴリズム、認証アルゴリズム、Diffie-Hellman(DH)グループ番号の組み合わせを選択します。このように選択しないと、デフォルトの AWS 変換セットのセキュリティ アソシエーション(SA)ペイロード サイズが大きいため、Cloud VPN トンネルが鍵交換に失敗する可能性があります。ペイロード サイズが大きいため、Cloud VPN ではサポートされていない、IKE パケットの IP 断片化が AWS 側で発生します。詳細については、サイト間 VPN 接続用のトンネル オプションをご覧ください。

  1. Cloud Shell で、AWS 外部 IP アドレス用の 4 つのインターフェースを持つ外部 VPN ゲートウェイを作成します。

    gcloud compute external-vpn-gateways create PEER_GATEWAY_NAME --interfaces \
      0=AWS_GW_IP_1,1=AWS_GW_IP_2,2=AWS_GW_IP_3,3=AWS_GW_IP_4

    次のように置き換えます。

    • AWS_GW_IP_1: 接続 1、トンネル 1 の仮想プライベート ゲートウェイの外部 IP アドレス
    • AWS_GW_IP_2: 接続 1、トンネル 2 の仮想プライベート ゲートウェイの外部 IP アドレス
    • AWS_GW_IP_3: 接続 2、トンネル 1 の仮想プライベート ゲートウェイの外部 IP アドレス
    • AWS_GW_IP_4: 接続 2、トンネル 2 の仮想プライベート ゲートウェイの外部 IP アドレス
  2. 4 つの VPN トンネルを作成します。

    • トンネル 1:

      gcloud compute vpn-tunnels create tunnel-1 \
          --peer-external-gateway PEER_GATEWAY_NAME \
          --peer-external-gateway-interface 0 \
          --region REGION \
          --ike-version IKE_VERSION \
          --shared-secret SHARED_SECRET_1 \
          --router ROUTER_NAME \
          --vpn-gateway HA_VPN_GATEWAY_NAME \
          --interface 0
    • トンネル 2:

      gcloud compute vpn-tunnels create tunnel-2 \
          --peer-external-gateway PEER_GATEWAY_NAME \
          --peer-external-gateway-interface 1 \
          --region REGION \
          --ike-version IKE_VERSION \
          --shared-secret SHARED_SECRET_2 \
          --router ROUTER_NAME \
          --vpn-gateway HA_VPN_GATEWAY_NAME \
          --interface 0
    • トンネル 3:

      gcloud compute vpn-tunnels create tunnel-3 \
          --peer-external-gateway PEER_GATEWAY_NAME \
          --peer-external-gateway-interface 2 \
          --region REGION \
          --ike-version IKE_VERSION \
          --shared-secret SHARED_SECRET_3 \
          --router ROUTER_NAME \
          --vpn-gateway HA_VPN_GATEWAY_NAME \
          --interface 1
    • トンネル 4:

      gcloud compute vpn-tunnels create tunnel-4 \
          --peer-external-gateway PEER_GATEWAY_NAME \
          --peer-external-gateway-interface 3 \
          --region REGION \
          --ike-version IKE_VERSION \
          --shared-secret SHARED_SECRET_4 \
          --router ROUTER_NAME \
          --vpn-gateway HA_VPN_GATEWAY_NAME \
          --interface 1
  3. 4 つの Cloud Router インターフェースを作成します。

    次のコマンドで、各 GOOGLE_BGP_IP_TUNNEL プレースホルダを Google Cloud 側のトンネルの内部 IP アドレスに置き換えます。AWS VPN 構成ファイルの値は、各トンネルのカスタマー ゲートウェイ アドレスとして表示されます。これらのアドレスはそれぞれ、169.254.0.0/16 ネットワーク範囲内の /30 CIDR 範囲内にある必要があります。

    • Cloud Router インターフェース 1:

      gcloud compute routers add-interface ROUTER_NAME \
          --interface-name int-1 \
          --vpn-tunnel tunnel-1 \
          --ip-address GOOGLE_BGP_IP_TUNNEL_1 \
          --mask-length 30 \
          --region REGION
    • Cloud Router インターフェース 2:

      gcloud compute routers add-interface ROUTER_NAME \
          --interface-name int-2 \
          --vpn-tunnel tunnel-2 \
          --ip-address GOOGLE_BGP_IP_TUNNEL_2 \
          --mask-length 30 \
          --region REGION
    • Cloud Router インターフェース 3:

      gcloud compute routers add-interface ROUTER_NAME \
          --interface-name int-3 \
          --vpn-tunnel tunnel-3 \
          --ip-address GOOGLE_BGP_IP_TUNNEL_3 \
          --mask-length 30 \
          --region REGION
    • Cloud Router インターフェース 4:

      gcloud compute routers add-interface ROUTER_NAME \
          --interface-name int-4 \
          --vpn-tunnel tunnel-4 \
          --ip-address GOOGLE_BGP_IP_TUNNEL_4 \
          --mask-length 30 \
          --region REGION
  4. BGP ピアを追加します。

    次のコマンドで、PEER_ASN を BGP セッションの AWS 側の ASN に置き換えます。

    • AWS 接続 1、トンネル 1

      gcloud compute routers add-bgp-peer ROUTER_NAME \
          --peer-name aws-conn1-tunn1 \
          --peer-asn PEER_ASN \
          --interface int-1 \
          --peer-ip-address AWS_T1_IP \
          --region REGION
    • AWS 接続 1、トンネル 2

      gcloud compute routers add-bgp-peer ROUTER_NAME \
          --peer-name aws-conn1-tunn2 \
          --peer-asn PEER_ASN \
          --interface int-2 \
          --peer-ip-address AWS_T2_IP \
          --region REGION
    • AWS 接続 2、トンネル 1

      gcloud compute routers add-bgp-peer ROUTER_NAME \
          --peer-name aws-conn2-tunn1 \
          --peer-asn PEER_ASN \
          --interface int-3 \
          --peer-ip-address AWS_T3_IP \
          --region REGION
    • AWS 接続 2、トンネル 2

      gcloud compute routers add-bgp-peer ROUTER_NAME \
          --peer-name aws-conn2-tunn2 \
          --peer-asn PEER_ASN \
          --interface int-4 \
          --peer-ip-address AWS_T4_IP \
          --region REGION

構成を確認する

  1. Cloud Shell で、Cloud Router のステータスを確認します。

    gcloud compute routers get-status ROUTER_NAME \
        --region REGION \
        --format='flattened(result.bgpPeerStatus[].name, result.bgpPeerStatus[].ipAddress, result.bgpPeerStatus[].peerIpAddress)'

    出力は次のようになります。

    result.bgpPeerStatus[].peerIpAddress)'
    result.bgpPeerStatus[0].ipAddress:     169.254.171.18
    result.bgpPeerStatus[0].name:          aws-conn1-tunn1
    result.bgpPeerStatus[0].peerIpAddress: 169.254.171.17
    result.bgpPeerStatus[1].ipAddress:     169.254.156.154
    result.bgpPeerStatus[1].name:          aws-conn1-tunn2
    result.bgpPeerStatus[1].peerIpAddress: 169.254.156.153
    result.bgpPeerStatus[2].ipAddress:     169.254.123.38
    result.bgpPeerStatus[2].name:          aws-conn2-tunn1
    result.bgpPeerStatus[2].peerIpAddress: 169.254.123.37
    result.bgpPeerStatus[3].ipAddress:     169.254.48.186
    result.bgpPeerStatus[3].name:          aws-conn2-tunn2
    result.bgpPeerStatus[3].peerIpAddress: 169.254.48.185
    
  2. すべてのトンネルを一覧表示します。

    gcloud compute vpn-tunnels list

    出力は次のようになります。

    NAME      REGION    GATEWAY    PEER_ADDRESS
    tunnel-1  us-east4  ha-vpn-gw  34.205.x.x
    tunnel-2  us-east4  ha-vpn-gw  52.203.x.x
    tunnel-3  us-east4  ha-vpn-gw  3.208.x.x
    tunnel-4  us-east4  ha-vpn-gw  52.204.x.x
    
  3. トンネルのステータスを確認します。

    gcloud compute vpn-tunnels describe tunnel-1 \
         --region REGION \
         --format='flattened(status,detailedStatus)'

    出力は次のようになります。

    detailed_status: Tunnel is up and running.
    status:          ESTABLISHED
    
  4. Cloud Router によって学習された動的ルートを一覧表示します。

    gcloud compute routers get-status ROUTER_NAME \
        --region REGION \
        --format="flattened(result.bestRoutes)"

    出力は次のようになります。

    result.bestRoutes[0].creationTimestamp: 2021-01-19T20:42:07.366-08:00
    result.bestRoutes[0].destRange:         10.2.2.0/24
    result.bestRoutes[0].kind:              compute#route
    result.bestRoutes[0].nextHopIp:         169.254.171.17
    result.bestRoutes[0].priority:          100
    result.bestRoutes[1].creationTimestamp: 2021-01-19T20:42:07.366-08:00
    result.bestRoutes[1].destRange:         10.2.2.0/24
    result.bestRoutes[1].kind:              compute#route
    result.bestRoutes[1].nextHopIp:         169.254.156.153
    result.bestRoutes[1].priority:          100
    result.bestRoutes[2].creationTimestamp: 2021-01-19T20:56:26.588-08:00
    result.bestRoutes[2].destRange:         10.2.2.0/24
    result.bestRoutes[2].kind:              compute#route
    result.bestRoutes[2].nextHopIp:         169.254.123.37
    result.bestRoutes[2].priority:          100
    result.bestRoutes[3].creationTimestamp: 2021-01-19T20:56:26.588-08:00
    result.bestRoutes[3].destRange:         10.2.2.0/24
    result.bestRoutes[3].kind:              compute#route
    result.bestRoutes[3].nextHopIp:         169.254.48.185
    result.bestRoutes[3].priority:          100
    

接続をテストする

  1. ping リクエストをテストするため、トンネルの両側にテスト VM を作成します。

    ICMP トラフィックを許可するようにファイアウォール ルールを設定していることを確認してください。

  2. ping コマンドを使用して接続をテストします。

  3. iperf を使用してテストマシン間の帯域幅を測定します。

    • サーバー側:

      iperf3 -s
    • クライアント側:

      iperf3 -c SERVER_IP_ADDRESS -P NUMBER_OF_PARALLEL_SESSIONS

クリーンアップ

このチュートリアルで作成した Google Cloud と AWS のリソースを削除します。

Google Cloud プロジェクトを削除する

このチュートリアルで使用したリソースに対する Google Cloud アカウントへの課金を回避するには、プロジェクトを削除します。

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

AWS リソースを削除する

  1. VPN 接続を削除する
  2. トランジット ゲートウェイを削除する
  3. テスト VM を削除する

次のステップ