プロトコル転送の使用

Google Compute Engine はプロトコル転送機能をサポートしています。この機能を使用して、NAT 処理されないターゲット インスタンスにパケットを送信できる転送ルール オブジェクトを作成できます。各ターゲット インスタンスには、対応する転送ルールからトラフィックを受け取って処理する単一の仮想マシン インスタンスが含まれています。

プロトコルの転送は、次のようなさまざまな状況で使用できます。

  • IP ごとの仮想ホスティング

    1 つのターゲット インスタンスをポイントする複数の転送ルールを設定して、1 つの仮想マシン インスタンスが設定された複数の外部 IP アドレスを使用できるように設定できます。これは、1 つの仮想マシン インスタンスからデータを供給するが、複数の外部 IP アドレス経由でそのデータを供給したい場合に使用できます。特にこれは、SSL 仮想ホスティングを設定する場合に便利です。

  • 仮想プライベート ネットワーク(VPN)

    詳しくは、次をご覧ください。

  • プライベート VIP

    プライベート(RFC 1918)アドレスを使用するプライベート リージョン転送ルールのプロトコル転送を使用できます。この機能を使用して、TCP または UDP トラフィックを同じリージョン内のターゲット インスタンスに送信するプライベート転送ルールを構成します。プライベート リージョン転送ルールを、ターゲット インスタンスを使用したバックエンド サービスからバックエンド サービスに、またはその逆に切り替えることもできます。

  • 負荷分散

    ロードバランサへのトラフィックの転送については、転送ルールのコンセプトをご覧ください。

IP、仮想プライベート ネットワーク(VPN)、負荷分散による仮想ホスティングの場合、Google Compute Engine は次のプロトコルのプロトコル転送をサポートしています。

プライベート VIP の場合は、TCP と UDP のみがサポートされます。

プロトコル転送は、負荷分散サービスと同じレートで課金されます。詳細については、価格に関するページをご覧ください。

クイックスタート

このクイックスタートは、bash を十分に理解していることを前提としています。

1 つのインスタンスにトラフィックを送信する転送ルールを作成するには、次を行う必要があります。

  1. ターゲット インスタンスを作成します。

    ターゲット インスタンスには 1 つの仮想マシン インスタンスが含まれますが、この仮想マシン インスタンスはターゲット インスタンスを作成するときにすでに作成されていても、後で作成してもかまいません。

  2. 転送ルールを作成します。

    ターゲット インスタンスは、転送ルールを作成する前に用意しておく必要があります。着信パケットが、転送ルールによって処理される IP、プロトコル、および(該当する場合は)ポート範囲と一致する場合、転送ルールはそのトラフィックをターゲット インスタンスに送信します。

このクイックスタートの残りの部分では、上記の手順を以下の順で詳しく説明します。

  1. 仮想マシン インスタンスに Apache サーバーを設定します。
  2. ターゲット インスタンスと、対応する転送ルールを作成します。
  3. 1 つのターゲット インスタンスにトラフィックを送信します。

このクイックスタートを完了すると、複数の転送ルールから 1 つのターゲット インスタンスに転送するプロトコルを設定する方法がわかります。

仮想マシン インスタンスの設定と Apache のインストール

最初に、Apache をインストールして単一の仮想マシン インスタンスを作成します。

  1. 新しいインスタンス用のいくつかのスタートアップ スクリプトを作成します。

    オペレーティング システムによって、スタートアップ スクリプトに含まれる内容が以下のように異なる場合があります。

    • インスタンスで Debian イメージを使用する予定の場合、次のコマンドを実行します。

      me@local:~$ echo "sudo apt-get update && sudo apt-get -y install apache2 && mkdir -p /var/www1 &&
      mkdir -p /var/www2 && mkdir -p /var/www3 && hostname > /var/www/html/index.html &&
      echo w1 > /var/www1/index.html && echo w2 > /var/www2/index.html && echo w3 > /var/www3/index.html" > 
      $HOME/pf_startup.sh

    • インスタンスで CentOS イメージを使用する予定の場合、次のコマンドを実行します。

      me@local:~$ echo "sudo yum -y install httpd && sudo service httpd restart && mkdir -p /var/www1 &&
      mkdir -p /var/www2 && mkdir /var/www3 && hostname > /var/www/html/index.html &&
      echo w1 > /var/www1/index.html && echo w2 > /var/www2/index.html && echo w3 > /var/www3/index.html" > 
      $HOME/pf_startup.sh

  2. 将来の仮想マシン用にタグを作成し、後でそれにファイアウォールを適用できるようにします。

    me@local:~$ TAG="www-tag"
    
  3. 転送ルールに応じてトラフィックを処理する、新しい仮想マシン インスタンスを作成します。

    gcloud compute instances create pf-instance \
        --image-project debian-cloud --image-family debian-9 --tags $TAG \
        --metadata-from-file startup-script=$HOME/pf_startup.sh
    
  4. この仮想マシン インスタンスへの外部トラフィックを許可するファイアウォール ルールを作成します。

    gcloud compute firewall-rules create www-firewall --target-tags $TAG --allow tcp
    

これで、仮想マシン インスタンスが正常に設定されました。ここで、プロトコルの転送構成の設定を開始できます。

ターゲット インスタンスと、対応する転送ルールの作成

  1. ターゲット インスタンスを作成します。

    ターゲット インスタンスには、転送ルールからトラフィックを受け取り、処理する単一の仮想マシン インスタンスが含まれています。ターゲット インスタンスには NAT ポリシーがないため、それらのインスタンスを使用して、IPsec プロトコルを直接使用する独自の VPN 接続を設定できます。

    転送ルールは既存のターゲット リソースを参照する必要があるため、転送ルールを作成するには、ターゲット インスタンスを作成しておく必要があります。存在しないターゲット リソースにトラフィックを送信する転送ルールを作成することはできません。この例では、次のようにしてターゲット インスタンスを作成します。

    gcloud compute target-instances create pf-target-instance --instance pf-instance
    
  2. 転送ルール オブジェクトを作成します。

    転送ルール オブジェクトは、IP プロトコルとポートに一致するトラフィックを、指定したターゲット インスタンスに送信します。詳細については、転送ルールの説明をご覧ください。

    この例では、次のコマンドによって 3 つの転送ルールが作成されます。それぞれに、TCP トラフィックをターゲット インスタンスに転送するエフェメラル IP アドレスがあります。複数の静的外部 IP アドレスがある場合は、必要に応じて --address IP-ADDRESS フラグを指定して、それらの IP アドレスを転送ルールで使用できます。

    gcloud compute forwarding-rules create pf-rule1 --ip-protocol TCP \
        --ports 80 --target-instance pf-target-instance
    
    gcloud compute forwarding-rules create pf-rule2 --ip-protocol TCP \
        --ports 80 --target-instance pf-target-instance
    
    gcloud compute forwarding-rules create pf-rule3 --ip-protocol TCP \
        --ports 80 --target-instance pf-target-instance
    

これで作業は完了です。ターゲット インスタンスへのトラフィックの送信を開始できるようになりました。

インスタンスへのトラフィックの送信

  1. 新しい転送ルールの外部 IP アドレスを取得します。

    gcloud compute forwarding-rules list を実行して、転送ルールの外部 IP アドレスを取得します。たとえば、次の表には以前に作成した転送ルールに割り振られたエフェメラル IP アドレスのリストが示されています。

    予約された IP アドレスを使用するように選択すると、エフェメラル IP アドレスの代わりに、それらのアドレスがここに表示されます。

    gcloud compute forwarding-rules list
    
    NAME     REGION      IP_ADDRESS     IP_PROTOCOL TARGET
    pf-rule1 us-central1 [ADDRESS_1]    TCP         us-central1-a/targetInstances/pf-target-instance
    pf-rule2 us-central1 [ADDRESS_2]    TCP         us-central1-a/targetInstances/pf-target-instance
    pf-rule3 us-central1 [ADDRESS_3]    TCP         us-central1-a/targetInstances/pf-target-instance

    次の手順に備えて IP アドレスをメモしておきます。

  2. 宛先 URL に基づいて異なる情報を提供するように、仮想マシン インスタンスの Apache 仮想ホストを構成します。

    まず、インスタンスに SSH 接続します。

    gcloud compute ssh pf-instance
    

    次に、/etc/apache2/sites-enabled/000-default.conf ファイルを編集して次の行を追加します。VirtualHostcd .. 行には、前の手順で確認した IP アドレスを使用します。

    <VirtualHost [ADDRESS_1]>
     DocumentRoot /var/www1
     <Directory /var/www1>
      Require all granted
     </Directory>
    </VirtualHost>
    <VirtualHost [ADDRESS_2]>
     DocumentRoot /var/www2
     <Directory /var/www2>
      Require all granted
     </Directory>
    </VirtualHost>
    <VirtualHost [ADDRESS_3]>
     DocumentRoot /var/www3
     <Directory /var/www3>
      Require all granted
     </Directory>
    </VirtualHost>
    

    最後に、Apache を再始動します。

    user@myinst:~$ sudo /etc/init.d/apache2 restart
    
  3. いくつかのトラフィックをインスタンスに送信してみます。

    ローカルマシンで、作成した転送ルールによって処理される外部 IP アドレスへのリクエストを作成します。

    次に、curl を使用して IP アドレスにトラフィックを送信します。IP アドレスに応じて、w1w2、または w3 の応答が返されます。

    me@local:~$curl [ADDRESS_1]
    w1
    
    me@local:~$ curl [ADDRESS_2]
    w2
    
    me@local:~$ curl [ADDRESS_3]
    w3
    

    これで作業は完了です。最初のプロトコル転送構成が設定されました。

転送ルール

転送ルールはターゲット プールおよびターゲット インスタンスと連携して機能し、負荷分散機能とプロトコル転送機能をサポートします。負荷分散とプロトコル転送を使用するには、トラフィックを特定のターゲット プール(負荷分散の場合)またはターゲット インスタンス(プロトコル転送の場合)に振り向ける転送ルールを作成する必要があります。転送ルールを設定することなく、これらの機能を使用することはできません。

転送ルールのリソースは転送ルールのコレクションに含まれています。各転送ルールでは、特定の IP アドレス、プロトコル、およびポート範囲(オプション)と、単一のターゲット プールまたはターゲット インスタンスが照合されます。トラフィックが転送ルールから提供される外部 IP アドレスに送信されると、転送ルールによって、対応するターゲット プールまたはターゲット インスタンスにそのトラフィックが振り向けられます。プロジェクトごとに、最大 50 個の転送ルール オブジェクトを作成できます。

転送ルールを扱うときに注意する必要のある点を以下に示します。

  • 転送ルールの名前はこのプロジェクト内で固有であり、63 文字以内の長さで、正規表現 [a-z]([-a-z0-9]*[a-z0-9])? と一致している必要があります。 この正規表現は、先頭文字に小文字を使用し、残りの文字には、ダッシュ、小文字、数字を使用する必要があることを示しています。ただし最後の文字にはダッシュを使用できません。

  • 転送ルールのプロトコルを指定しなかった場合は、デフォルトの TCP が使用されます。また、一部のプロトコルはターゲット プールまたはターゲット インスタンスでのみ使用可能になることにも注意します。

    • ESPAHSCTPICMP を使用するには、ターゲット インスタンスを指定する必要があります。これらのプロトコルを使用する場合、ターゲット プールを指定することはできません。
    • TCP または UDP を使用する場合は、ターゲット プールまたはターゲット インスタンスのいずれかを指定できます。
  • ポート範囲は、TCPUDPSCTP プロトコルでのみ使用できます。

転送ルールの追加

gcloud compute forwarding-rules create コマンドを使用したり、転送ルール コレクションに対する HTTP POST リクエストを作成したりして、新しい転送ルールを追加できます。gcloud コマンドライン ツールを使用してターゲット インスタンスに転送ルールを作成する例を次に示します。

gcloud compute forwarding-rules create [FORWARDING_RULE] \
    --load-balancing-scheme internal | external \
    --region [REGION] \
    [--target-instance-zone [ZONE]] \
    --ip-protocol TCP --ports 80 \
    --target-instance [TARGET_INSTANCE]

gcloud config set compute/zone によって compute/zone プロパティが設定されておらず、--target-instance-zone フラグが省略された場合、gcloud コマンドライン ツールはゾーンの選択を求めるプロンプトを表示します。詳細については、デフォルトのゾーンとリージョンの設定をご覧ください。

gcloud compute forwarding-rules create コマンドでは、負荷分散スキームが内部である場合にターゲット インスタンスをターゲットとして設定することがサポートされます。

ターゲット プールへの転送ルールを作成する例を以下に示します。

gcloud compute forwarding-rules create [FORWARDING_RULE] \
    --target-pool [TARGET_POOL] \
    [--region [REGION]]

gcloud config set compute/region によって compute/region プロパティが設定されておらず、--region フラグが省略された場合、gcloud コマンドライン ツールはリージョンの選択を求めるプロンプトを表示します。詳細については、デフォルトのゾーンとリージョンの設定をご覧ください。

使用可能なフラグの詳細については、転送ルールの create コマンドを参照するか、「gcloud compute forwarding-rules create --help」と入力します。

API を使用して転送ルールを追加するには、次の URI に対して HTTP POST リクエストを実行します。

https://www.googleapis.com/compute/v1/projects/myproject/regions/us-central1/forwardingRules

リクエスト ボディには、次のフィールドが含まれている必要があります。

{
 "name": "example-forwarding-rule",
 "IPAddress": "`10.1.1.1",
 "IPProtocol": "TCP",
 "portRange": "80",
 "target": "zones/us-central1-f/targetInstances/example-target-instances"
}

転送ルールの一覧表示、転送ルールの情報の取得、転送ルールの削除については、gcloud SDK と API のリファレンス ページをご覧ください。

ターゲット インスタンス

ターゲット インスタンス リソースには、1 つ以上の転送ルールからトラフィックを処理する 1 つの仮想マシン インスタンスが含まれており、単一のソース(AHESP など)によって管理される必要のある特定のタイプのプロトコル トラフィックを転送するのに理想的ですが、TCP および UDP プロトコルにはターゲット インスタンスを使用することもできます。ターゲット インスタンスには、それらに適用されている NAT ポリシーがないため、仮想プライベート ネットワーク(VPN)に対して NAT 処理されない IPsec トラフィックが必要なトラフィックに使用できます。

ターゲット インスタンスは転送ルールと同じリージョンに存在している必要があります。また、ターゲット インスタンスは仮想マシン インスタンスと同じゾーンに入っている必要もあります。たとえば、転送ルールが us-central1 にあり、使用するインスタンスが us-central1-a にある場合、ターゲット インスタンスは us-central1-a に入っている必要があります。インスタンスが us-central1-b にある場合、ターゲット インスタンスも us-central1-b に入っている必要があります。

ターゲット インスタンスの追加

新しいターゲット インスタンスを追加するには、gcloud compute target-instances コマンドを使用するか、targetInstances コレクションに対する HTTP POST リクエストを作成します。GCP Console からターゲット インスタンス リソースを作成することはできません。gcloud コマンドライン ツールを使用してターゲット インスタンスを作成する例を以下に示します。

gcloud compute target-instances create [TARGET_INSTANCE] --instance INSTANCE

gcloud config set compute/zone によって compute/zone プロパティが設定されておらず、--zone フラグが省略された場合、gcloud コマンドライン ツールはゾーンの選択を求めるプロンプトを表示します。詳細については、デフォルトのゾーンとリージョンの設定をご覧ください。

使用可能なフラグの詳細については、create コマンドを参照するか、「gcloud compute target-instances create --help」と入力します。

API では、次の URI に HTTP POST リクエストを送ります。

https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f/targetInstances

次のリクエスト ボディを使用します。

body = {
  "name": "example-target-instance",
  "instance": "zones/us-central1-f/instances/example-instance"
}

ターゲット インスタンスの一覧表示、ターゲット インスタンスの情報の取得、ターゲット インスタンスの削除については、gcloud SDK と API のリファレンス ページをご覧ください。

プライベート VIP のためのプロトコル転送

プロトコル転送は、プライベート(RFC 1918)アドレスを使用するプライベート リージョン転送ルールに使用できます。この機能を使用して、TCP または UDP トラフィックを同じリージョン内のターゲット インスタンスに送信するプライベート転送ルールを構成します。プライベート リージョン転送ルールを、ターゲット インスタンスを使用したバックエンド サービスからバックエンド サービスに、またはその逆に、簡単に切り替えることもできます。

ターゲット インスタンスには、1 つ以上の転送ルールによってトラフィックを処理する 1 つのバックエンド インスタンスが含まれます。各ターゲット インスタンスを指定する 1 つのプライベート転送ルールのみを構成できます。

ターゲット インスタンスを含むプライベート転送ルール(クリックして拡大)
ターゲット インスタンスを含むプライベート転送ルール(クリックして拡大)

次の状況では、プライベート転送ルールとともにプロトコル転送を使用します。

  • サービス用に単一のバックエンド インスタンスをデプロイし、ヘルスチェックやその他の側面を自分で管理する場合。
  • 転送ルールのプライベート IP アドレスを保持しながら、転送ルールが指すターゲット インスタンスを変更する場合。
  • デプロイを安定させるために、転送ルールのプライベート IP アドレスを変更せずに単一のインスタンス(ターゲット インスタンス)から複数のバックエンド インスタンス(バックエン ドサービス)に簡単に移動できるようにする場合。

ターゲット インスタンスとバックエンド サービスの間の移行

1 つの VM インスタンスを使用して、ターゲット インスタンスへのトラフィックの転送をバックエンド サービスへのトラフィックの転送へ、またはその逆へと変更するようにプライベート転送ルールを更新できます。このようにプライベート転送ルールを更新すると、転送ルールの IP アドレスが保持されます。変更によってバックエンド サービス インスタンスの負荷分散が有効または無効になるため、この移行中に既存の接続が中断される可能性があります。

バックエンド サービスからターゲット インスタンスへの移行(クリックして拡大)
バックエンド サービスからターゲット インスタンスへの移行(クリックして拡大)

ターゲット インスタンスとバックエンド サービスの間での移行には、プライベート転送ルールのみを使用できます。外部転送ルールを使用したプロトコル転送では、これを行うことができません。

プライベート転送ルールのターゲットの更新

転送ルールがプライベート転送ルールの場合、ターゲット インスタンスを指すのではなく、バックエンド サービスを指すように変更できます。

    gcloud compute forwarding-rules set-target my-forwarding-rule
        --backend-service my-backend-service

ターゲット インスタンスに戻すには次のようにします。

    gcloud compute forwarding-rules set-target my-forwarding-rule
        --target-instance my-target-instance

プライベート転送ルールのプロトコル転送のトラブルシューティング

リージョン制限

プライベート転送ルールのプロトコル転送はリージョナル プロダクトです。すべてのクライアントとターゲット インスタンス VM は、同じリージョンに存在する必要があります。

エラー メッセージ: 「An internal target instance can only be the target of one forwarding rule」

An internal target instance can only be the target of one forwarding rule」というエラー メッセージが表示される場合、同じターゲット インスタンスを指定する 2 つの転送ルールを構成しようとしている可能性があります。複数の転送ルールで同じターゲット インスタンスを指定することはできません。

制限事項

  • プライベート転送ルールでターゲット インスタンスを使用する場合、サポートされるプロトコルは TCP と UDP だけです。

制限

  • ネットワークごとに、ターゲット インスタンスを指す 100 個のプライベート転送ルールを構成できます。

  • プライベート転送ルールごとに 5 つのポートを使用できます。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Compute Engine ドキュメント