Cloud Functionsの外向きトラフィックを静的IPアドレスに関連付ける
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は課金対象のため、使用時は注意してください。