gcloudコマンドを使ってCloud Functionsに固定IPを設定する

Google Cloud

2024.6.13

Topics

はじめに

こんにちは、wakaです。

Cloud Functionsに固定IPを付与する方法を紹介したいと思います。
画面上で設定する際に、この値はどうすればいいのかと迷うことがありましたので、本記事ではすべてgcloudコマンドを用いて構築する方法を解説します。

想定読者

  • Cloud Functionsを実行する際に、固定IPを付与する方法がわからず困っている方
  • 固定IPを付与しようとしたけどちゃんと動いてなくて困っている方

概要

設定は以下のようなステップで設定可能です。

  1. VPCの作成
  2. Cloud Routerの作成
  3. Cloud NATの作成
  4. サーバーレス VPC アクセスの作成
  5. Cloud Functionsの作成

設定方法

基本的にCloud Shell上でコマンドを上から実行していけば作成できると思います。
以下の値に関しては、任意の名前やIDを指定して実行をお願い致します。

  • {VPC_NAME}
  • {PROJECT_ID}
  • {SUBNET_NAME}
  • {FIREWALL_NAME}
  • {STATIC_IP_NAME}
  • {NAT_NAME}
  • {ROUTER_NAME}
  • {SERVERLESS_CONNECTOR_NAME}
  • {FUNCTION_NAME}

また、リージョンなどの値は任意の値に変えてご利用ください。

1. VPCを作成

VPC本体の作成

gcloud compute networks create {VPC_NAME} \
    --project={PROJECT_ID} \
    --subnet-mode=custom \
    --mtu=1460 \
    --bgp-routing-mode=regional

サブネットの作成

gcloud compute networks subnets create {SUBNET_NAME} \
    --project={PROJECT_ID} \
    --range=10.0.0.0/28 \
    --stack-type=IPV4_ONLY \
    --network={VPC_NAME} \
    --region=asia-northeast1

ファイアウォールルールの作成

gcloud compute --project={PROJECT_ID} firewall-rules create {FIREWALL_NAME}  \
    --direction=EGRESS \
    --priority=1000 \
    --network={VPC_NAME} \
    --action=ALLOW \
    --rules=all \
    --destination-ranges=0.0.0.0/0

静的外部IPの取得

gcloud compute addresses create {STATIC_IP_NAME} \
    --project={PROJECT_ID} \
    --region=asia-northeast1

2. Cloud Routerを作成

gcloud compute routers create {ROUTER_NAME} \
    --project={PROJECT_ID} \
    --region=asia-northeast1 \
    --network={VPC_NAME}

3. Cloud NATを作成

gcloud compute routers nats create {NAT_NAME} \
    --router={ROUTER_NAME} \
    --router-region=asia-northeast1 \
    --nat-external-ip-pool={STATIC_IP_NAME}  \
    --nat-all-subnet-ip-ranges

4. サーバーレス VPC アクセスを作成

gcloud compute networks vpc-access connectors create {SERVERLESS_CONNECTOR_NAME} \
    --region=asia-northeast1 \
    --subnet={SUBNET_NAME} \
    --min-instances=2 \
    --max-instances=3 \
    --machine-type=f1-micro

5. Cloud Functionsの作成

新規にCloud Functionsを作成する場合

gcloudで関数を作成する前に、コマンドを実行するディレクトリ内に、main.pyrequirements.txtが存在することを確認してください。

waka@cloudshell$ tree .
.
├── main.py
└── requirements.txt
main.py
import functions_framework
import requests

@functions_framework.http
def hello_http(request):
    url = 'https://ipinfo.io/'
    response = requests.get(url)
    data = response.json()
    print(data)

    return data
requirements.txt
functions-framework==3.*
requests
gcloud functions deploy {FUNCTION_NAME} \
  --gen2 \
  --runtime python312 \
  --trigger-http \
  --allow-unauthenticated \
  --entry-point hello_http \
  --region asia-northeast1 \
  --vpc-connector {SERVERLESS_CONNECTOR_NAME} \
  --egress-settings all

すでにあるCloud FunctionsをNAT経由で実行したい場合

ランタイム、ビルド、接続、セキュリティの設定 > 接続 > から、下り(外向き)設定を、作成したサーバーレスVPCコネクタに設定します。

動作確認

Cloud Shellから取得した静的IPと関数を実行した際のIPの比較を行います。

waka@cloudshell$ gcloud compute addresses list --filter="name={STATIC_IP_NAME}" | grep "ADDRESS"
ADDRESS/RANGE: 104.198.117.7
waka@cloudshell$ 
waka@cloudshell$ curl -s -X POST https://asia-northeast1-{PROJECT_ID}.cloudfunctions.net/{FUNCTION_NAME} | jq ".ip"
"104.198.117.7"

さいごに

今回gcloudコマンドを用いて固定IPを設定する方法をご紹介しました。
固定IPがうまく動作せずに困ってる方の手助けになれば幸いです。

テックブログ新着情報のほか、AWSやGoogle Cloudに関するお役立ち情報を配信中!

waka

2022年に中途入社した人です。好きなAWSサービスはLambdaです。

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら