通过无服务器 VPC 连接器向 GCE 发出 GAE http 请求

GAE http request to GCE via Serverless VPC Connector

我有一个 Google App Engine 应用程序(python 2.7 - 这是一个正在升级的旧项目!)需要在 Google 上查询 Elastisearch 实例计算引擎。我可以使用 GCE public ip 地址发出请求而不会出现问题,但我不想将 GCE 实例暴露给 public 互联网。

但是对计算引擎私有 IP 地址 (10.128.0.2) 的 http 请求连接失败,并且对计算引擎的内部 DNS 名称的 DNS 查找失败 编辑:dns查找确实可以使用 socket.gethostbyname.

error: An error occured while connecting to the server: Unable to connect to server at URL: http://10.128.0.2:9200/indexname

使用 public IP 地址时(当我在端口 9200 上打开 VPC 防火墙时)相同的请求成功。

来自 App Engine 应用程序配置的代码段:

runtime: python27
api_version: '1'
env: standard
threadsafe: false
instance_class: F4

network:
  name: default
vpc_access_connector:
  name: >-
    projects/myproject/locations/us-central1/connectors/connector0301

gcloud beta --account="myaccount" --project="myproject" 应用描述:

authDomain: gmail.com
codeBucket: staging.myproject.appspot.com
databaseType: CLOUD_DATASTORE_COMPATIBILITY
defaultBucket: myproject.appspot.com
defaultHostname: myproject.appspot.com
featureSettings:
  splitHealthChecks: true
  useContainerOptimizedOs: true
gcrDomain: us.gcr.io
id: myproject
locationId: us-central
name: apps/myproject
servingStatus: SERVING

gcloud beta --account="myaccount" --project="myproject" 计算实例描述(只是网络片段):

networkInterfaces:
- accessConfigs:
  - kind: compute#accessConfig
    name: External NAT
    natIP: SNIPPED
    networkTier: PREMIUM
    type: ONE_TO_ONE_NAT
  fingerprint: M087cXbOWII=
  kind: compute#networkInterface
  name: nic0
  network: https://www.googleapis.com/compute/beta/projects/myproject/global/networks/default
  networkIP: 10.128.0.2
  subnetwork: https://www.googleapis.com/compute/beta/projects/myproject/regions/us-central1/subnetworks/default

gcloud beta --account="myaccount" --project="myproject" 计算网络 vpc-access

connectors list --region=us-central1
CONNECTOR_ID   REGION       NETWORK  IP_CIDR_RANGE  MIN_THROUGHPUT  MAX_THROUGHPUT  STATE
connector0301  us-central1  default  10.8.0.0/28    200             300             READY

gcloud beta --account="myaccount" --project="myproject" 计算网络 vpc-access 连接器描述 connector0301 --region=us-central1

ipCidrRange: 10.8.0.0/28
maxThroughput: 300
minThroughput: 200
name: projects/myproject/locations/us-central1/connectors/connector0301
network: default
state: READY

gcloud --account="myaccount" --project="myproject" 计算防火墙规则描述默认允许内部

allowed:
- IPProtocol: tcp
  ports:
  - 0-65535
- IPProtocol: udp
  ports:
  - 0-65535
- IPProtocol: icmp
creationTimestamp: '2020-02-11T11:18:09.906-08:00'
description: Allow internal traffic on the default network
direction: INGRESS
disabled: false
id: '1434668200291681054'
kind: compute#firewall
logConfig:
  enable: true
name: default-allow-internal
network: https://www.googleapis.com/compute/v1/projects/myproject/global/networks/default
priority: 65534
selfLink: https://www.googleapis.com/compute/v1/projects/myproject/global/firewalls/default-allow-internal
sourceRanges:
- 10.128.0.0/9
- 10.8.0.0/28

无服务器 VPC 连接器是否不适用于内部 IP http 请求?

Do serverless VPC connectors not work for internal IP http requests?

无服务器 VPC 连接器在 python37 运行时使用 urllib.request 用于内部 IP http 请求,但不使用 google.appengine.api 中的 urllib2urlfetch python27 运行时。 (提醒一下urllib2 uses urlfetch under the hood on app engine python27)

由于这是一个从 python27 慢慢转移到 python37 的旧项目的一部分,现在我将内部 ip http 请求放入一个单独的服务中,以便它们可以使用新的运行时.