NAT: provide "network address translation" for outbound traffic to the internet, Virtual Private Cloud (VPC) networks, on-premises networks, and other cloud provider networks.
我們會把cloud run的爬蟲掛在私有子網, 當他去向公開網路爬資料時, 簡略地說也是請求html的檔案, 但因為爬蟲沒有公開的ip, 網頁也不知道回應的對象(ip)在哪, NAT就是在解決這件事
Cloud NAT 就像是一個「社區代收處」。
有些網站會擋爬蟲, 有固定ip也可以請對方開白名單
而Cloud NAT需要跑在Cloud Router(雲端路由器)上
本日實作
我們要先向 Google 申請一個「固定電話號碼」,確保你的爬蟲每次出去都是同一個 IP。
NAT 必須跑在路由器上。它不負責傳輸資料,它負責「交換路徑訊息」。
這是主角。我們要設定它「在哪個子網」生效。
我們在 network.tf 新增以下這段
# 1. 申請一個靜態外部 IP (給 NAT 用)
resource "google_compute_address" "nat_ip" {
name = "bank-ai-nat-ip"
region = "asia-east1"
}
# 2. 建立 Cloud Router
resource "google_compute_router" "router" {
name = "bank-ai-router"
region = "asia-east1"
network = google_compute_network.main_vpc.id
}
# 3. 建立 Cloud NAT
resource "google_compute_router_nat" "nat_config" {
name = "bank-ai-nat"
router = google_compute_router.router.name
region = "asia-east1"
nat_ip_allocate_option = "MANUAL_ONLY" # 我們要用手動指定的 IP
nat_ips = [google_compute_address.nat_ip.self_link]
# 指定在哪個子網生效 (我們只讓私有子網能上網)
source_subnetwork_ip_ranges_to_nat = "LIST_OF_SUBNETWORKS"
subnetwork {
name = google_compute_subnetwork.bff_subnet.id #讓bff連公開網路
source_ip_ranges_to_nat = ["ALL_IP_RANGES"] # subnet中的所有網段都可以連
}
}
照舊跑過 terraform plan 檢查後 terraform apply 執行
可以看到 vpc network > ip addresses 出現對外的 bank-ai-nat-ip

接著檢查 NAT, 這就要從上方搜尋nat 來找到cloud nat, 側欄沒有常駐的選項
可以看到我們的nat有掛到router上了


點擊進NAT後應該可以看到ip是我們讓google分派的, 以及subnet是bff_subnet
今天的實作就到此 之後我們部署cloudrun到 bff subnet後應該可以用 curl命令https://ifconfig.me
來驗證我們的ip是申請的靜態ip
Cloud NAT 費用:NAT 本身每小時約 NT$ 1.4 元