ダイレクト VPC 下り(外向き)と共有 VPC ネットワーク

サーバーレス VPC アクセス コネクタなしでダイレクト VPC 下り(外向き)を使用することで、App Engine サービスが 共有 VPC ネットワークにトラフィックを送信できるようにします。

このページでは、共有 VPC ネットワークのサブネットを使用するように App Engine の IAM 権限を構成し、サービスを共有サブネットに配置する方法について説明します。

始める前に

IP アドレスの割り振りセクションで、 サブネットから IP アドレスを割り振る際のガイダンスを確認してください。

制限事項

  • IP アドレスの使用量: サービスの IP アドレスの使用量は、実行中のインスタンスの 数に比例してスケーリングされます。スケーリング能力は、選択したサブネットで使用可能な IP アドレスの 数によって制限されます。

  • メンテナンス イベント: ネットワーク インフラストラクチャのメンテナンス イベント中に、サービスで接続が一時的に 切断されることがあります。ときどき発生する接続リセットを処理できるクライアント ライブラリを使用することをおすすめします。

  • コールド スタート: 最初のコールド スタート時間は、リージョンと 特定のユースケースによって異なります。まれに、コールド スタートが 1 分間続くことがあります。

  • ダイレクト VPC 上り(内向き): App Engine はダイレクト VPC 上り(内向き)をサポートしていません。

  • インスタンス数: ダイレクト VPC 下り(外向き)を使用するように構成できる App Engine バージョンあたりのインスタンス数は 100 個までです。

IAM 権限を設定する

共有 VPC サービス プロジェクトの App Engine が共有 VPC ネットワークにアクセスするには、まず、サブネットを使用するための十分な権限が App Engine サービス エージェントにあることを確認する必要があります。

  • App Engine サービス エージェントのロール: 共有 VPC ネットワークにアクセスするには、次のいずれかのロールを追加して、App Engine サービス エージェントに十分な権限を付与します。

    • 共有 VPC ホスト プロジェクトの Compute ネットワーク ユーザー(roles/compute.networkUser 。外部 IPv6 を使用するサブネットには、Compute パブリック IP 管理者(roles/compute.publicIpAdminロールも必要です。

      たとえば、Compute ネットワーク ユーザーのロールを付与するには、次のコマンドを実行します。

      gcloud projects add-iam-policy-binding HOST_PROJECT_ID \
      --member "serviceAccount:service-SERVICE_PROJECT_NUMBER@gcp-gae-service.iam.gserviceaccount.com" \
      --role "roles/compute.networkUser"

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

      • HOST_PROJECT_ID: 共有 VPC ホスト プロジェクトの ID。
      • SERVICE_PROJECT_NUMBER: App Engine サービスをデプロイする共有 VPC サービス プロジェクト番号。
    • 共有 VPC ホスト プロジェクトに対する Compute ネットワーク ユーザー(compute.networkUser と、共有 VPC サブネットに対する Compute ネットワーク閲覧者(compute.networkViewer) ロール。外部 IPv6 を使用するサブネットには、Compute パブリック IP 管理者(roles/compute.publicIpAdminロールも必要です。

      たとえば、サブネットに Compute ネットワーク ユーザーのロールを付与するには、次のコマンドを実行します。

      gcloud compute networks subnets add-iam-policy-binding SUBNET_NAME \
        --region REGION \
        --member "serviceAccount:service-SERVICE_PROJECT_NUMBER@gcp-gae-service.iam.gserviceaccount.com" \
        --role "roles/compute.networkUser" \
        --project HOST_PROJECT_ID

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

      • SUBNET_NAME: App Engine サービスを実行するサブネットの完全修飾されたリソース名。
      • REGION: App Engine サービスのリージョン。 サブネットのリージョンと一致する必要があります。
      • SERVICE_PROJECT_NUMBER: App Engine サービスをデプロイする共有 VPC サービス プロジェクト番号。
      • HOST_PROJECT_ID: 共有 VPC ホスト プロジェクトの ID。
  • カスタム権限: より詳細に制御するには、プロジェクトに対する次の追加権限を App Engine サービス エージェントに付与します。

    • 共有 VPC ホスト プロジェクトに対する compute.networks.get
    • ホスト プロジェクトまたは特定のサブネットに対する compute.subnetworks.get
    • ホスト プロジェクトまたは特定のサブネットに対する compute.subnetworks.use
    • 共有 VPC サービス プロジェクトに対する compute.addresses.get
    • 共有 VPC サービス プロジェクトに対する compute.addresses.list
    • 共有 VPC サービス プロジェクトに対する compute.addresses.create
    • 共有 VPC サービス プロジェクトに対する compute.addresses.delete
    • 共有 VPC サービス プロジェクトに対する compute.addresses.createInternal
    • 共有 VPC サービス プロジェクトに対する compute.addresses.deleteInternal
    • 共有 VPC サービス プロジェクトに対する compute.regionOperations.get

IP アドレスの割り振り

VPC ネットワークに App Engine サービスを配置するには、VPC ネットワークとサブネットのいずれかまたは両方を指定します。ネットワークのみを指定した場合、サブネットにはネットワークと同じ名前が使用されます。 App Engine はサブネットから IP アドレスを割り振ります。

この IP アドレスは一時的なものであるため、個別の IP に基づくポリシーは作成しないでください。IP に基づくポリシー(ファイアウォール ルールなど)を作成する必要がある場合は、サブネット全体の IP アドレス範囲を使用する必要があります。

サービスが使用するネットワークまたはサブネットを変更するには、新しいネットワークとサブネット値を使用する新しいバージョンをデプロイします。

スケールアップとスケールダウン

トラフィックの急増時に迅速にスケールアップできるように、App Engine は 16 個(28 サブネット マスク)のブロックで IP アドレスを予約します。 App Engine 全体で使用できる十分な IPv4 アドレスを確保するには、サブネットの IPv4 アドレス範囲を /26 以上にする必要があります。

IP の割り振りを効率的に行うと同時に管理を容易にするには、複数のリソースを同じサブネットに配置します。IPv4 アドレス空間が限定されている場合は、 サポートされている IPv4 範囲で他の選択肢をご確認ください。

サブネットを削除するには、まず App Engine サービスを削除または再デプロイして、サブネットの使用を停止した後、1 ~ 2 時間待ちます。

サービスの IP アドレスの使用量

安定した状態で、App Engine はインスタンス数の 2 倍の IP アドレスを使用します。バージョンがスケールダウンされると、App Engine は最大 20 分間 IP アドレスを保持します。合計で、IP アドレス数の 2 倍以上を予約し、バージョンの更新を考慮してバッファを追加します。

たとえば、version 1 でインスタンス数が 100 から 0 にスケールダウンされ、version 2 で 0 から 100 にスケールアップされるようにバージョンをアップグレードすると、スケールダウン後、最大 20 分間 App Engine は version 1 の IP アドレスを保持します。20 分間の保持期間中は、400 個以上の IP アドレス((100 + 100) * 2)を予約する必要があります。

サポートされている IPv4 範囲

App Engine では、サブネットで次の IPv4 範囲をサポートしています。

  • RFC 1918
    • 10.0.0.0/8
    • 172.16.0.0/12
    • 192.168.0.0/16
  • RFC 6598
    • 100.64.0.0/10
  • クラス E
    • 240.0.0.0/4

App Engine サービスをデプロイする

ダイレクト VPC 下り(外向き)を使用すると、App Engine サービスはサーバーレス VPC アクセス コネクタを使用せずに共有 VPC ネットワークにトラフィックを送信できます。App Engine サービスの特定のバージョンにネットワーク タグを割り当てて、 VPC ファイアウォール ルールの適用など、よりきめ細かいネットワーク セキュリティを実現できます。

サービスを共有サブネットに配置するには、app.yaml ファイルで共有 VPC ネットワークとサブネットの完全修飾リソース名を指定します。

  1. app.yaml ファイルを更新して、vpc_access セクションを追加します。

    vpc_access:
      network_interface:
        network: projects/HOST_PROJECT_ID/global/networks/VPC_NETWORK
        subnet: projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME
        tags:
            - NETWORK_TAGS
      vpc_egress: EGRESS_SETTING

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

    • HOST_PROJECT_ID: 共有 VPC プロジェクトの ID。
    • VPC_NETWORK: 共有 VPC ネットワークの名前。
    • REGION: App Engine サービスのリージョン。 サブネットのリージョンと一致する必要があります。
    • SUBNET_NAME: サブネットの完全修飾されたリソース名。
    • 省略可: NETWORK_TAGS: ファイアウォール ルールとルーティング ポリシーで使用するために、App Engine サービスのインスタンスに関連付けるネットワーク タグのリスト。
    • 省略可: EGRESS_SETTING: アウトバウンド トラフィックのルーティング方法を制御します。このフィールドは、次の構成設定をサポートしています。

      • all-traffic: すべてのアウトバウンド トラフィックを共有 VPC ネットワーク経由で送信します。
      • private-ranges-only (デフォルト): 共有 VPC ネットワーク経由で内部アドレスにのみトラフィックを送信します。
  2. 次のコマンドを実行してサービスをデプロイします。

    gcloud beta app deploy

サービスを接続解除する

共有 VPC ネットワークからサービスを削除するには:

  1. app.yaml ファイルから vpc_access セクションを削除します。
  2. サービスを再デプロイします。

    gcloud beta app deploy

トラブルシューティング

このセクションでは、共有 VPC ネットワークでダイレクト VPC 下り(外向き)を使用する際に発生する可能性のある一般的なエラーと、その解決方法について説明します。

サブネットを削除できない

サブネットを削除するには、最初にそのサブネットを使用するすべてのリソースを削除する必要があります。App Engine がサブネットを使用している場合は、サブネットを削除する前に接続を解除するか、別のサブネットに移動する必要があります。

App Engine リソースを削除または移動した後、App Engine が IP を解放するまで 1 ~ 2 時間待ってからサブネットを削除してください。

デプロイに失敗した

デプロイが失敗すると、Google Cloud CLI に根本原因を示すエラー メッセージが表示されます。一般的な問題としては、次のようなものがあります。

  • app.yaml ファイルのネットワーク名やサブネット名のスペルミスなど、VPC ネットワーク メタデータが正しくない。潜在的なエラーを修正するには、app.yaml ファイルで VPC ネットワーク構成を確認します。

  • IAM 権限が不十分です。デプロイするサービス アカウントに 必要な権限を付与していることを確認してください。デプロイ中に権限エラーが発生した場合は、サービス アカウントに次の追加ロールを付与していることを確認してください。

共有 VPC ネットワークを切断できない

ホスト プロジェクト内で共有 VPC ネットワークを接続解除するには、 共有 VPC のデプロビジョニング の手順に沿って、App Engine のサービスをすべて共有 VPC ネットワークから切断します。

共有 VPC ネットワークを使用している App Engine リソースを確認するには、次のコマンドを実行します。

gcloud compute shared-vpc list-associated-resources HOST_PROJECT_ID

HOST_PROJECT_ID は、共有 VPC ホスト プロジェクトの ID に置き換えます。

ダイレクト VPC 下り(外向き)サブネットで IPv4 アドレスが不足する

VPC ネットワークのサブネットで IPv4 アドレスが不足した場合、App Engine はサービス インスタンスを開始できません。

この問題を解決するには、使用可能な IP アドレスが多いサブネットワークに移行するか、サブネット範囲を拡大することを検討してください。

割り振られた IP アドレスを表示する

App Engine が割り振った IP アドレスを確認するには、 [IP アドレス] ページに移動するか、 Google Cloud コンソール から次の Google Cloud CLI コマンドを実行します。

gcloud compute addresses list