【Google Cloud】プライベートなCloud Run関数(Cloud Functions)にリクエストする方法

Google Cloud(GCP)の2つのCloud Run関数(Cloud Functions)をVPCに接続して、
インターネットを介さずにCloud Run関数から別のCloud Run関数を呼び出す方法を記載してます。
VPCネットワークに接続する設定は、サーバレスVPCアクセスコネクタを使用しています。

サンプルソースはPythonで実装しています。

公式ドキュメントはこちら

よかったら、以下も併せて見てみてください。

Cloud Runとは?

↑のページと公式ドキュメントを参照ください。

VPCとは?

VPC(Virtual Private Cloud)とはGoogle Cloud(GCP)のサービスの1つで、ネットワークまわりの機能を提供。

サブネットで分けたり、プロジェクト間で共有したり、フローログを取得したりすることが可能です。

Cloud RunをVPCに接続する方法

Cloud RunをVPCに接続する方法は以下の2つがある様です。

Cloud RunをVPCに接続する方法1:サーバーレス VPC アクセス コネクタを構成

サーバーレス VPC アクセスを使用して、Cloud RunからVPCネットワークに直接接続する方法です。

内部DNS、内部IPアドレスを使用してVPCネットワークに接続
メリットとしては以下の通りらしいです。

  • 内部通信のみの利用(インターネットを経由しない)
  • インターネット経由に比べてレイテンシが低くなる。

他にも自動的にスケールアウトするとか、いろいろ特徴はあるみたいですが初心者には一気に理解するのは難しいので、とりあえず構成してみようと思います。

Serverless VPC Access APIを有効化

Google CloudのサーバレスVPCのページにアクセスして、以下のAPIが有効化されていなければ、
自動的に以下の画面に遷移すると思いますので、まずはサービスを有効化しましょう。

有効化されたら、以下の画面に自動で遷移します。

コネクタを作成

画面上部にある「コネクタを作成」を押下します。

そしたら、↑のような入力画面になるので自身の環境に合わせて情報を入力します。

  • 名前:任意の名称を入力(※ただし、Compute Engineの命名規則に従う必要はあるみたいです)
  • リージョン:こちらも任意のリージョン。
  • ネットワーク:実運用では専用のネットワークを作成するのかもですが、私は一旦デフォルトにしました。いつかそのへんも学習したら変更したい。
  • サブネット:既存か新規に定義するか選べます。私はとりあえず新しいCIDR範囲を指定してます。

画面下部のスケーリング設定は一旦そのままでいきます。
そのまま「作成」を押下

こんな感じで新しくサーバレスVPCアクセスが追加されました。

VPCフローログの構成

実際に設定したVPCネットワークを通ってるのか確認したいので、
VPCのフローログを構成します。

VPCネットワークのページで、「現在のプロジェクトのサブネット」を押下して使用しているVPCネットワークを表示します。(私の場合はdefaultのasia-northeast1)

遷移したページで「編集」を押下

フローログをオンに変更します。

Cloud Run関数(Cloud Functions)を設定

上記のサーバレスVPCコネクタを使用するためのCloud Run関数(Cloud Functions)を設定したいと思います。

検証用に以下のように2つ準備しようと思います。

Cloud Run関数(Cloud Functions)①:外部からのリクエスト(上り?)を許可、レスポンス(下り)は内部通信のみ

Cloud Run関数(Cloud Functions)②:上り下りともに内部通信のみ

上記の内部通信というのがサーバレスVPCコネクタを使用した通信となる想定です。

Cloud Run関数(Cloud Functions)①の設定

使用するファイルは3つ

  • main.py
  • cloudbuild.yaml
  • requirements.txt

main.py

import functions_framework
import requests

# HTTPトリガ
@functions_framework.http
def main(request):
        response = requests.post(<Cloud Run関数(Cloud Functions)②>のURL)
        print(f"{response.status_code}")
        print(f"{response.text}")
        return "OK"

Cloud Functions②を呼び出す処理

cloudbuild.yaml

steps:
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
  args:
  - gcloud
  - functions
  - deploy
  - $_SERVICE_NAME
  - --entry-point=main
  - --region=asia-northeast1
  - --trigger-http
  - --gen2
  - --runtime=python312
  - --source=.
  - --vpc-connector=test-connect
  - --egress-settings=all
options:
  logging: CLOUD_LOGGING_ONLY

Google Cloudのトリガを使用してCloud Functionをデプロイするのであれば必要なファイルです。
今回重要なのは「vpc-connector」、「egress-settings=all」の記述です。

「vpc-connector」については、私のコネクタは名称が「test-connect」ですが、それぞれ作成したコネクタの名称にしてください。

「egress-settings」については、全てVPCコネクタ経由にしたい場合は「all」、プライベートIPへのリクエストだけをVPCコネクタ経由にしたい場合は「private-ranges-only」を設定します。

ドキュメントをデフォルトは「private-ranges-only」になってるようですが、設定しないとCloudFunctions②へのリクエストで404が返却されたので、「all」にしています。

デプロイされたCloud Functionsが想定通りの設定になっていることを確認

requirements.txt

functions-framework==3.*
requests

必要なライブラリを定義するファイルです。

Cloud Run関数(Cloud Functions)②の設定

使用するファイルは3つ

  • main.py
  • cloudbuild.yaml
  • requirements.txt

main.py

import functions_framework

# HTTPトリガ
@functions_framework.http
def main(request):
        print("Hello World")
        return "TEST HELLO"

リクエストを受けたら、標準出力で「Hello world」、呼出元に「TEST HELLO」って返すだけです。

cloudbuild.yaml

steps:
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
  args:
  - gcloud
  - functions
  - deploy
  - $_SERVICE_NAME
  - --entry-point=main
  - --region=asia-northeast1
  - --trigger-http
  - --allow-unauthenticated
  - --ingress-settings=internal-only
  - --gen2
  - --runtime=python312
  - --source=.
  - --vpc-connector=test-connect
options:
  logging: CLOUD_LOGGING_ONLY

Google Cloudのトリガを使用してCloud Functionをデプロイするのであれば必要なファイルです。
今回重要なのは「vpc-connector」の記述です。私のコネクタは名称が「test-connect」ですが、それぞれ作成したコネクタの名称にしてください。

あとは検証用に内部通信のみを許可するために「ingress-settings=internal-and-gclb」、未認証のアクセスを許可する「allow-unauthenticated」を記述してるくらいです。

requirements.txt

functions-framework==3.*

これはpythonの必要なライブラリ(?)を記述するファイル

私はトリガを使用してCloud Functions(Cloud Run関数)をデプロイしましたが、
直接、コンソールから作成しても問題ないです。

トリガを使用してのデプロイ方法はこちら

デプロイされたCloud Functions(Cloud Run関数)の設定を確認

想定通りになっているのでOK

このへんはコンソールからも変更可能なので、トリガの設定やcloudbuild.yamlあたりがややこしいという方はコンソールからやってみてください。

curlでローカルからアクセスできないことを確認

% curl <Cloud FunctionsのURL>

<html><head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>404 Page not found</title>
</head>
<body text=#000000 bgcolor=#ffffff>
<h1>Error: Page not found</h1>
<h2>The requested URL was not found on this server.</h2>
<h2></h2>
</body></html>

動作確認

Cloud Functions①は外からリクエストを受け付けているので、①のURLに対してcurl

% curl <①のURL>
TEST HELLO

返却値から①は呼び出せていることを確認
(ここで404などになっている場合は①の設定を見直してみてください)

続いてCloud Functions①のログを確認

②を呼び出す処理のHTTPステータス、返却値が正常にログに出力されている。

最後にCloud Functions②のログを確認

正常にリクエストが届いており、ログに「Hello World」が出力されている。

Cloud RunをVPCに接続する方法2:コネクタ不要の Direct VPC 下り(外向き)を使用

この方式も検証するつもりでしたが、力尽きたので気が向いたら更新します。。。

おまけ

VPCのフローログを確認しようと設定しましたが、
全てのトラフィックがログに残るわけではなさそうなので、今回はあきらめます。。。

たぶん、大量に通信が発生するものからサンプリングして集計してくれるサービスだと思われます。

「【Google Cloud】プライベートなCloud Run関数(Cloud Functions)にリクエストする方法」への1件のフィードバック

コメントする