homehome

Cloud Functionsの外向きトラフィックを静的IPアドレスに関連付ける

Published

Firebase Cloud Functionsは、動的なIPアドレスで呼び出されます。サーバレス関数という性質上、これは多くのケースで問題ありません。しかし、関数が外部へフェッチを行う場合、ホワイトリストの作成などの目的で静的なIPアドレスが欲しい場合があります。

また、Cloud Functionsはプロジェクト及び関数自体にデプロイ先のリージョンを設定することができますが、関数の下り(外部)通信は、必ずしもそのリージョンのIPアドレスを使用する保証はないようです。Googleのインフラはグローバルに分散されており、負荷分散の仕組みによって、リクエストが世界中のサーバーに振り分けられる可能性があります。

サービス構成

静的IPアドレスを割り当てたい場合、VPCネットワークから送信されるトラッフィクが静的IPを持つように、クラウドNATゲートウェイに接続されているVPCコネクタにCloud Functionsを接続する必要があります。

まず、VPネットワークを確認します。特に設定していなければdefaultのネットワークがあるはずです。

gcloud compute networks list

NAME     SUBNET_MODE  BGP_ROUTING_MODE  IPV4_RANGE  GATEWAY_IPV4
default  AUTO         REGIONAL

次にCloud Routerを作成します。以下では、boardrouterという名前のルータを作成しています。

# --network: このルータのネットワークを指定
# --region: リージョン(Cloud Functionsと同じにする)
gcloud compute routers create boardrouter --network=default --region=asia-northeast1

そして静的IPアドレスを予約をします。以下では、fc-ipaddという名前のIPアドレスリソースを定義しています。

# --region: クラウドNATを実行するリージョン
gcloud compute addresses create fc-ipadd --region=asia-northeast1

続けてCloud NATゲートウェイを構成します。以下では、mynat1というCloud NATゲートウェイを作成しています。

# --router: Cloud Routerを指定
# --region: NATゲートウェイを作成するリージョン
# --nat-external-ip-pool: IPアドレスのリソース名
# --nat-all-subnet-ip-ranges: リージョン内のすべてのサブネットワークのすべてのIP範囲でNATを使用できるようにする
gcloud compute routers nats create mynat1 \
--router=boardrouter \
--region=asia-northeast1 \
--nat-external-ip-pool=fc-ipadd \
--nat-all-subnet-ip-ranges

最後にVPCコネクタ作成します。VPCコネクタはサーバレス環境とVPCネットワーク間で安全な通信を行うために必要です。以下では、まずVPC Access APIを有効してから、my-vpc-connectorというVPCコネクタを作成しています。

# VPC Access APIの有効化、VPCコネクタの使用
# サーバーレス環境(Cloud FunctionsやCloud Run)から VPCネットワークへのアクセスが可能になる
gcloud services enable vpcaccess.googleapis.com

# VPCコネクタの作成
# --network: VPCネットワーク名
# --region: コネクタのリージョン。functionsと同じリージョンを指定する
# --range: VPCコネクタを使用するIPアドレスの範囲(CIDR形式)。他のIPアドレスリソースと重複不可
gcloud compute networks vpc-access connectors create my-vpc-connector \
--network=default \
--region=asia-northeast1 \
--range=10.8.0.0/28

コネクタが作成されているか確認します。

gcloud compute networks vpc-access connectors describe my-vpc-connector --region=asia-northeast1

ion=asia-northeast1
ipCidrRange: 10.8.0.0/28
machineType: e2-micro
maxInstances: 10
maxThroughput: 1000
minInstances: 2
minThroughput: 200
name: projects/<YOUR_PROJECT>/locations/asia-northeast1/connectors/my-vpc-connector
network: default
state: READY

コード修正

この段階では、コネクタにCloud Functionsは結びついていないため、コード側でVPCの設定が必要です。以下はNode.js環境のCloud Function v2の抜粋です。vpcConnectorにVPCコネクタを指定します。

const { setGlobalOptions } = require("firebase-functions/v2");

setGlobalOptions({
  region: "asia-northeast1",
  // here
  vpcConnector: "my-vpc-connector",
  vpcConnectorEgressSettings: "ALL_TRAFFIC",
});

再デプロイすれば完了です。

$ firebase deploy --only functions

GCP Cloud ConsoleでCloud Run 関数(今後Cloud Run UIに統合)に飛び、デプロイした関数名をクリックし、「詳細」タブを押すと「ネットワークの設定」が表示されます。VPCコネクタの欄が上記で作成したものになっていれば設定が完了しています。

Cloud NATは課金対象のため、使用時は注意してください。