LoginSignup
23
14

More than 3 years have passed since last update.

GCFから外部へのHTTPリクエストを固定IPにする

Last updated at Posted at 2020-02-19

2020/10/16 追記

Cloud Runから外部へのHTTPリクエストも、固定IP化できるようになりました。
https://cloud.google.com/run/docs/release-notes#October_13_2020
https://cloud.google.com/run/docs/configuring/connecting-vpc?hl=en#egress
スクリーンショット 2020-10-16 11.22.17.png

2020/06/18 追記

Cloud Runから外部へのHTTPリクエストも、固定IP化できそう。

やりたいこと

GCFから、ホワイトリストに登録されたIPアドレスからのみリクエストを許可するサービスへアクセスしたい。

使うもの

GCF、VPC、サーバーレスVPCアクセス、Cloud NAT

公式ドキュメント

この辺に書いてある。
https://cloud.google.com/functions/docs/networking/network-settings#route-egress-to-vpc
https://cloud.google.com/nat/docs/using-nat#specify_subnet_ranges_for_nat

費用

https://cloud.google.com/functions/pricing
https://cloud.google.com/vpc/docs/configure-serverless-vpc-access#pricing
https://cloud.google.com/nat/pricing
https://cloud.google.com/compute/network-pricing#ipaddress

手順メモ

関数を作成

スクリーンショット 2020-02-11 0.27.47.png

functions.go
package p

import (
    "fmt"
    "io/ioutil"
    "net/http"
)

// Sample print global ip address.
func Sample(w http.ResponseWriter, r *http.Request) {
    resp, err := http.Get("http://httpbin.org/ip")
    if err != nil {
        fmt.Println(err)
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
}
go.mod
module example.com/sample

go 1.11

GCFを実行してみる1

107.178.234.80でアクセスしている。これは固定IPではない。
スクリーンショット 2020-02-20 0.04.21.png

VPC、サブネットを作成

サブネットはここでは192.168.0.0/24に設定。(後でこれと被らない範囲を指定する場面がある)
スクリーンショット 2020-02-11 0.47.13.png

サーバーレスVPCアクセスコネクタを作成

初回はエラーになる事がある。→Serverless VPC Access APIを有効化する必要がある。
スクリーンショット 2020-02-20 0.08.18.png

以下のURLを直接叩くとAPIを有効化する画面に飛べる。[your-projectid]は読み替えること。普通にAPIのメニューの方から行ってもOK。
https://console.cloud.google.com/networking/connectors/add?project=[your-projectid]

スクリーンショット 2020-02-20 0.12.16.png

必要事項を入力して作成。
IP範囲はここでは192.168.2.0/24に設定。
最小スループットと最大スループットはそれぞれ200、300が下限。変えられそうに見えるけどバリデーションでエラーになり、最小スループットは200〜。最大スループットは下限より大きい値で100の倍数を求められる。
スクリーンショット 2020-02-20 0.14.00.png

作成完了したらGCFに戻ってコネクタの設定を行う。
すべてのトラフィックを VPC コネクタ経由でルーティングするを選択するのが大事。これによって必ずVPCコネクタ経由のリクエストになる。これをしないと先ほど実行してみた際の外部IPで出ていってしまう。
スクリーンショット 2020-02-20 0.18.07.png

GCFを実行してみる2

リクエストがVPCへルーティングされ、そこから外へ出られないのでエラーとなる。(想定通り)
スクリーンショット 2020-02-20 0.29.38.png

Cloud NATを作成

VPCから外へ出るためのCloud NATを作成する。ルーターも合わせて作成する。
スクリーンショット 2020-02-20 0.30.37.png
スクリーンショット 2020-02-20 0.31.38.png

NATアドレスは手動を選択し、静的IPを作成して割り当てる。
スクリーンショット 2020-02-20 0.33.30.png

静的IPが割り当てられた。これでCloud NATを作成する。
スクリーンショット 2020-02-20 0.34.43.png

GCFを実行してみる3

Cloud NATを作成した際に割り当てた静的IP35.200.133.233で接続できている。
このIPアドレスをサービスのホワイトリストに入れてもらえばOK。
スクリーンショット 2020-02-20 0.40.11.png

23
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
14