当前位置: 首页 > 知识库问答 >
问题:

谷歌云功能与VPC无服务器连接器出口,云NAT不工作

孟子墨
2023-03-14

这与下列问题有关,这些问题已经过时了

  • 可以获取谷歌云功能的静态IP地址吗

目前,GCP拥有VPC无服务器连接器,允许您通过VPC连接器路由所有流量,并设置云NAT以获取静态IP地址。

我遵循了以下指南https://cloud.google.com/functions/docs/networking/network-settings#associate-静态ip使用地区us-east4,但来自my cloud功能的外部请求总是超时。

我不确定这是一个错误,或者我错过了什么。

编辑:为了确保我已经遵循了所有的步骤,我尽可能使用了gCloud,命令。这些命令是从GCP的指南中复制的。

  1. 设置项目id以备将来使用
PROJECT_ID=my-test-gcf-vpc-nat

转到控制台并启用计费

设置VPC和测试VM来测试云NAT

gcloud services enable compute.googleapis.com \
  --project $PROJECT_ID

gcloud compute networks create custom-network1 \
  --subnet-mode custom \
  --project $PROJECT_ID

gcloud compute networks subnets create subnet-us-east-192 \
  --network custom-network1 \
  --region us-east4 \
  --range 192.168.1.0/24 \
  --project $PROJECT_ID

gcloud compute instances create nat-test-1 \
  --image-family debian-9 \
  --image-project debian-cloud \
  --network custom-network1 \
  --subnet subnet-us-east-192 \
  --zone us-east4-c \
  --no-address \
  --project $PROJECT_ID

gcloud compute firewall-rules create allow-ssh \
  --network custom-network1 \
  --source-ranges 35.235.240.0/20 \
  --allow tcp:22 \
  --project $PROJECT_ID

使用控制台创建IAPSSH权限

测试网络配置,虚拟机在没有云NAT的情况下不能访问互联网

gcloud compute ssh nat-test-1 \
  --zone us-east4-c \
  --command "curl -s ifconfig.io" \
  --tunnel-through-iap \
  --project $PROJECT_ID

命令响应连接超时

gcloud compute routers create nat-router \
  --network custom-network1 \
  --region us-east4 \
  --project $PROJECT_ID

gcloud compute routers nats create nat-config \
  --router-region us-east4 \
  --router nat-router \
  --nat-all-subnet-ip-ranges \
  --auto-allocate-nat-external-ips \
  --project $PROJECT_ID
gcloud compute ssh nat-test-1 \
  --zone us-east4-c \
  --command "curl -s ifconfig.io" \
  --tunnel-through-iap \
  --project $PROJECT_ID

命令用IP地址回应

gcloud services enable vpcaccess.googleapis.com \
  --project $PROJECT_ID

gcloud compute networks vpc-access connectors create custom-network1-us-east4 \
  --network custom-network1 \
  --region us-east4 \
  --range 10.8.0.0/28 \
  --project $PROJECT_ID

gcloud compute networks vpc-access connectors describe custom-network1-us-east4 \
  --region us-east4 \
  --project $PROJECT_ID
gcloud services enable cloudfunctions.googleapis.com \
  --project $PROJECT_ID

PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member=serviceAccount:service-$PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com \
  --role=roles/viewer

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member=serviceAccount:service-$PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com \
  --role=roles/compute.networkUser
# Additional Firewall Rules
gcloud compute firewall-rules create custom-network1-allow-http \
  --network custom-network1 \
  --source-ranges 0.0.0.0/0 \
  --allow tcp:80 \
  --project $PROJECT_ID

gcloud compute firewall-rules create custom-network1-allow-https \
  --network custom-network1 \
  --source-ranges 0.0.0.0/0 \
  --allow tcp:443 \
  --project $PROJECT_ID


# Additional Permission, actually this service account has an Editor role already.
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member=serviceAccount:$PROJECT_ID@appspot.gserviceaccount.com \
  --role=roles/compute.networkUser

index.js

const publicIp = require('public-ip')

exports.testVPC = async (req, res) => {
  const v4 = await publicIp.v4()
  const v6 = await publicIp.v6()
  console.log('ip', [v4, v6])
  return res.end(JSON.stringify([v4, v6]))
}
exports.testNoVPC = exports.testVPC
# Cloud Function with VPC Connector
gcloud functions deploy testVPC \
  --runtime nodejs10 \
  --trigger-http \
  --vpc-connector custom-network1-us-east4 \
  --egress-settings all \
  --region us-east4 \
  --allow-unauthenticated \
  --project $PROJECT_ID

# Cloud Function without VPC Connector
gcloud functions deploy testNoVPC \
  --runtime nodejs10 \
  --trigger-http \
  --region us-east4 \
  --allow-unauthenticated \
  --project $PROJECT_ID

没有VPC连接器的云功能以IP地址响应https://us-east4-my-test-gcf-vpc-nat.cloudfunctions.net/testNoVPC

带有VPC连接器的云功能超时https://us-east4-my-test-gcf-vpc-nat.cloudfunctions.net/testVPC

共有2个答案

帅雅逸
2023-03-14

检查云nat路由器是否在无服务器VPC访问使用的同一VPC中创建。

还要检查云功能是否部署在云Nat使用的云路由器的同一区域。

罗飞宇
2023-03-14

>

配置无服务器VPC访问。确保在步骤1中制作的自定义网络1上创建VPC连接器。

创建谷歌云功能

a、 在“网络”下,选择您在步骤2创建的连接器,并通过VPC连接器路由所有流量。


import requests
import json

from flask import escape

def hello_http(request):

    response = requests.get('https://stackoverflow.com')

    print(response.headers)    
    return 'Accessing stackoverflow from cloud function:  {}!'.format(response.headers)

云Nat、Vpc连接器和云功能的区域是us-central1

4.测试该功能,查看您是否可以访问互联网:

Accessing stackoverflow from cloud function:  {'Cache-Control': 'private', 'Content-Type': 'text/html; charset=utf-8', 'Content-Encoding': 'gzip', 'X-Frame-Options': 'SAMEORIGIN', 'X-Request-Guid': 'edf3d1f8-7466-4161-8170-ae4d6e615d5c', 'Strict-Transport-Security': 'max-age=15552000', 'Feature-Policy': "microphone 'none'; speaker 'none'", 'Content-Security-Policy': "upgrade-insecure-requests; frame-ancestors 'self' https://stackexchange.com", 'Content-Length': '26391', 'Accept-Ranges': 'bytes', 'Date': 'Sat, 28 Mar 2020 19:03:17 GMT', 'Via': '1.1 varnish', 'Connection': 'keep-alive', 'X-Served-By': 'cache-mdw17354-MDW', 'X-Cache': 'MISS', 'X-Cache-Hits': '0', 'X-Timer': 'S1585422197.002185,VS0,VE37', 'Vary': 'Accept-Encoding,Fastly-SSL', 'X-DNS-Prefetch-Control': 'off', 'Set-Cookie': 'prov=78ecd1a5-54ea-ab1d-6d19-2cf5dc44a86b; domain=.stackoverflow.com; expires=Fri, 01-Jan-2055 00:00:00 GMT; path=/; HttpOnly'}!

成功,现在可以为NAT指定静态IP地址

 类似资料:
  • 问题内容: 建筑: 我们有一个使用2个pubsub主题/订阅对的架构: 定期由cronjob触发主题(例如,每5分钟触发一次)。订阅是我们云功能的触发器。 主题充当我们的一项服务发布的后台作业的队列。云功能在每次执行时读取订阅,以为排队的后台作业提供服务。 这使我们可以控制后台作业的服务频率,而与将它们添加到队列的时间无关。 云功能(由触发)通过pull读取消息。它决定准备好哪些后台作业,并在成功

  • 我尝试使用my console在谷歌云平台上部署云功能。我使用的命令是, 但我得到了这个错误, 错误:(gcloud.functions.deploy)操作错误:代码=3,消息=Build failed:无法解析存储源:googleapi:错误404:未找到,未找到 我试着在谷歌上搜索,但似乎以前没有人遇到过这个错误消息。我也尝试过改变项目,部署效果很好。 如果有人知道是什么导致了这个错误,以及我

  • 我正在运行一个云运行服务,使用代理连接到云SQL的云SQL连接。云SQL实例没有配置私有IP。 现在有一个新要求,即此服务需要连接到GCP之外的数据库,为此它需要一个可以列入白名单的静态出口IP。我试图通过无服务器VPC连接器(https://cloud.google.com/run/docs/configuring/static-outbound-ip)实现这一点。 问题:当我将专有网络连接器添

  • 我有一个google云功能,需要访问Atlas上托管的MongoDB(GCP)。此云功能需要访问GCP外部托管的特定API。出于安全原因,他们需要在防火墙规则上允许云功能的IP地址。 为了启用静态IP地址请求,我创建了一个无服务器VPC连接器并为我的云功能配置了所有出口流量。 配置后,即使我允许所有传入流量(仅用于测试),云功能的mongoDB连接也会失败。 我曾考虑VPC对等以允许云功能访问mo

  • 我正在尝试使用云SQL代理将GCE实例连接到云SQL实例(第二代)。当我ssh到GCE实例时 我得到 我已阅读 上的文档https://cloud.google.com/sql/docs/compute-engine-access#gce-连接代理和 https://cloud.google.com/sql/docs/sql-proxy 两个实例都在同一个项目中,并且云SQL API在GCE实例(

  • 刚刚完成Hello World谷歌云功能教程,收到以下响应头: