サーバーレス 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
- 共有 VPC ホスト プロジェクトに対する
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 範囲をサポートしています。
App Engine サービスをデプロイする
ダイレクト VPC 下り(外向き)を使用すると、App Engine サービスはサーバーレス VPC アクセス コネクタを使用せずに共有 VPC ネットワークにトラフィックを送信できます。App Engine サービスの特定のバージョンにネットワーク タグを割り当てて、 VPC ファイアウォール ルールの適用など、よりきめ細かいネットワーク セキュリティを実現できます。
サービスを共有サブネットに配置するには、app.yaml ファイルで共有 VPC ネットワークとサブネットの完全修飾リソース名を指定します。
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 ネットワーク経由で内部アドレスにのみトラフィックを送信します。
次のコマンドを実行してサービスをデプロイします。
gcloud beta app deploy
サービスを接続解除する
共有 VPC ネットワークからサービスを削除するには:
app.yamlファイルからvpc_accessセクションを削除します。サービスを再デプロイします。
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 権限が不十分です。デプロイするサービス アカウントに 必要な権限を付与していることを確認してください。デプロイ中に権限エラーが発生した場合は、サービス アカウントに次の追加ロールを付与していることを確認してください。
- Cloud Build サービス アカウント (
roles/cloudbuild.builds.builder) - サービス アカウント トークン作成者(
roles/iam.serviceAccountTokenCreator)
- Cloud Build サービス アカウント (
共有 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