gcloudコマンドを使ってCloud Functionsに固定IPを設定する
2024.6.13
はじめに
こんにちは、wakaです。
Cloud Functionsに固定IPを付与する方法を紹介したいと思います。
画面上で設定する際に、この値はどうすればいいのかと迷うことがありましたので、本記事ではすべてgcloudコマンドを用いて構築する方法を解説します。
想定読者
- Cloud Functionsを実行する際に、固定IPを付与する方法がわからず困っている方
 - 固定IPを付与しようとしたけどちゃんと動いてなくて困っている方
 
概要
設定は以下のようなステップで設定可能です。
- VPCの作成
 - Cloud Routerの作成
 - Cloud NATの作成
 - サーバーレス VPC アクセスの作成
 - 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.pyとrequirements.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に関するお役立ち情報を配信中!
Follow @twitter
      
        waka      
      
      
  2022年に中途入社した人です。好きなAWSサービスはLambdaです。
Recommends
こちらもおすすめ
- 
  
      【Google Cloud】Cloud Runを触ってみた!
2024.6.26
 - 
  
      Google CloudのSpot VMを解説!
2024.6.19
 
Special Topics
注目記事はこちら
データ分析入門
これから始めるBigQuery基礎知識
2024.02.28

 AWSの料金が 10 %割引になる!
『AWSの請求代行リセールサービス』
2024.07.16
        