Cloud SQL プライベート IP への Cloud Functions 接続の問題のトラブルシューティング
Google Cloud Japan Team
※この投稿は米国時間 2022 年 10 月 1 日に、Google Cloud blog に投稿されたものの抄訳です。
Cloud Functions はプライベート IP アドレスを使用して Virtual Private Cloud にホストされているリソースに接続するのが一般的なユースケースですが、接続の問題をデバッグする方法が必ずしも明確ではない場合があります。たとえば、タイムアウト エラーや、接続の確立の失敗に関連するその他のエラーが表示されることがあります。これらのエラー メッセージだけに基づいてデバッグしようとすると、問題を判断するのに十分な情報がない可能性があります。
デバッグにより適したフレームワークでは以下を判断します。
ネットワーク構成はどうなっていますか?VPC は 1 つですか、それとも複数ですか?使用しているのは VPC Peering ですか、それとも共有 VPC ですか?使用しているのは単一リージョンですか、それとも複数リージョンですか?
リソースの設置場所はどこですか(例: どのネットワークまたはリージョン)?
接続に使用しているのはプライベート IP ですか、それともパブリック IP ですか?
Cloud Functions の設置場所はどこですか(例: どのリージョン)?
サーバーレス VPC アクセス接続を使用する必要はありますか?以下で答えを説明します。
ネットワークがどのようなものかを確認したら、チェックリスト形式の方法で設定を見直し、各ステップが適切に構成されているかを確認します。
このブログ投稿では、VPC とパブリック IP またはプライベート IP を含む 3 つのシナリオと、次の図に示すように、それぞれで Cloud Functions を構成して Cloud SQL インスタンスに接続する方法を説明します。
始める前に..
プライベート IP アドレスを使用している VPC 内のリソースに到達するためのサーバーレス コンピューティング プロダクトが必要な場合は、常にサーバーレス VPC アクセス コネクタが必要です。サーバーレス環境は自動的に VPC ネットワークにアクセスできるわけではありません。サーバーレス VPC コネクタを使用することでそのようなアクセスが可能になりますが、有効化はご自身で行っていただく必要があります。
Functions のサービス アカウントには、Cloud SQL に接続するための適切な権限が必要です。こちらの手順に沿って、Cloud Functions を Cloud SQL に接続するための構成を行います。
また、サーバーレス VPC アクセス コネクタは、コネクタに使用するインスタンスのサイズに応じて月額費用が発生します。詳しくは、料金をご覧ください。
シナリオ 1 - Cloud Functions と同じリージョンのパブリック IP を使用して Cloud SQL インスタンスに接続する
この最初のシナリオでは、パブリック IP アドレスを持つ Cloud SQL インスタンスに Cloud Functions を接続します。Cloud SQL のパブリック IP インスタンスは、公共のインターネットでどこからでもアクセスできるため、サーバーレス VPC アクセス コネクタは必要ありません。
まず、このクイックスタートの手順に沿って、「guestbook」データベースを含むパブリック IP で MySQL インスタンスを作成します。この MySQL インスタンスはパブリック IP を使用しているため、Cloud Shell を利用できます。
注: Cloud Functions(第 2 世代)を使用している場合、基盤となる Cloud Run サービスに Cloud SQL コネクタを追加する必要があります。Cloud Run から接続する | Cloud SQL for MySQL の手順を行ってください。それ以外の場合、次のエラーが表示されることがあります。Error: connect ENOENT /cloudsql/<project>:<cloud-sql-region>:<cloud-sql-instance-name>
こちらは、promise-mysql 依存関係を使用した Cloud Functions(第 2 世代)nodejs の例です。
シナリオ 2 - Cloud Functions と同じリージョンでプライベート IP を使用して Cloud SQL インスタンスに接続する
2 つ目のシナリオでは、プライベート IP アドレスのみを使用して Cloud SQL インスタンスへのアクセスを制限します。デフォルトでは、サーバーレス リソースは VPN にアクセスできないため、Cloud Functions は VPC コネクタを使用して、Cloud SQL インスタンスのプライベート IP にトラフィックを転送する必要があります。
1. このクイックスタートの手順に沿って、「guestbook」データベースを含むプライベート IP で MySQL インスタンスを作成します。Cloud SQL インスタンスと同じ VPC に、Compute Engine VM を作成する必要があります。本番環境のワークロードでは、Cloud SQL Auth プロキシを使用して、VM からインスタンスへのトラフィックを暗号化することをおすすめします。VM で Cloud SQL インスタンスにアクセスできるようになったら、ゲストブック データベースを作成する場合と同じ手順を行います。
2. サーバーレス VPC アクセス コネクタを作成します。これにより、Functions と VPC ネットワーク間のトラフィックが処理されます。このユースケースでは、デフォルトのネットワークを使用し、10.8.0.0/28 の IP 範囲を割り当てます。これにより、コネクタから送信されるリクエストの送信元 IP アドレスが、確実にこの IP 範囲からのものになります。
3. 以下の画像に示すように、Cloud Functions を構成して VPC コネクタに使用します。デプロイされると、Functions の詳細タブに VPC コネクタの情報が表示されます。詳しくは、VPC コネクタ ドキュメントをご覧ください。
プライベート IP の場合、以下の Cloud Functions(第 2 世代)の例のように、TCP 接続を使用してプライベート IP インスタンスに接続できます。
シナリオ 3 - サーバーレス VPC アクセス コネクタおよび Cloud Functions とは異なるリージョンにあるプライベートの Cloud SQL インスタンスに接続する
Cloud Functions と VPC コネクタが同じリージョンにある限り(シナリオ 2 のように)、SQL インスタンスは VPC コネクタと異なるリージョンに存在できます。2 つ目のシナリオと同じコードを使用します。
次のステップ
Cloud Functions の VPC への接続について詳しくは、ネットワーキングのドキュメントをご覧ください。下り(外向き)と上り(内向き)向けの Functions の構成方法についても説明しています。また、ネットワーク向けに Cloud Functions を最適化するためのベスト プラクティスについてのドキュメントもご確認ください。
Cloud Functions(第 2 世代)について詳しくは、こちらの Codelab をお試しください。最小インスタンス数やトラフィック分割を含む新しい機能の概要を紹介しています。
- Cloud デベロッパー アドボケイト Sara Ford
- Cloud テクニカル ソリューション エンジニア Sreemanti Ghosh
- Google Cloud テクニカル ソリューション エンジニア Pratibha Jagnere