Облачные функции Google с VPC Serverless Connector Egress с облачным NAT не работает

avatar
thammada.ts
28 марта 2020 в 15:15
4595
2
3

Это связано со следующими вопросами, которые устарели

В настоящее время GCP имеет VPC Serverless Connector, который позволяет направлять весь трафик через VPC Connector и настраивать Cloud NAT для получения статических IP-адресов.

Я следовал следующему руководству: https://cloud.google.com/functions/docs/networking/network-settings#associate-static-ip, используя регион us-east4, но внешние запросы от время ожидания моей облачной функции всегда истекло.

Я не уверен, что это ошибка или я что-то упустил.

Редактировать: Чтобы убедиться, что я все выполнил, я выполнил все шаги, используя команду gcloud, где это возможно. Эти команды скопированы из руководств GCP.

  1. Установка идентификатора проекта для будущего использования
PROJECT_ID=my-test-gcf-vpc-nat
  1. Перейдите в консоль и включите оплату

  2. Настройте VPC и тестовую ВМ для тестирования Cloud 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
  1. Разрешения SSH для IAP созданы с помощью консоли

  2. Проверьте конфигурацию сети, у ВМ не должно быть доступа к Интернету без Cloud NAT

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

команда ответила connection timed out

  1. Настройка Cloud NAT
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
  1. Протестируйте конфигурацию сети еще раз, виртуальная машина должна иметь доступ в Интернет через Cloud NAT
gcloud compute ssh nat-test-1 \
  --zone us-east4-c \
  --command "curl -s ifconfig.io" \
  --tunnel-through-iap \
  --project $PROJECT_ID

команда ответила IP-адресом

  1. Создан коннектор доступа к VPC
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
  1. Добавлены разрешения для сервисного аккаунта Google Cloud Functions
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
  1. Есть предложения добавить дополнительные правила брандмауэра и разрешения учетной записи службы
# 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
  1. Развернутые тестовые облачные функции

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 Connector ответила IP-адресом https://us-east4-my-test-gcf-vpc-nat.cloudfunctions.net/testNoVPC

Время ожидания функции Cloud с коннектором VPC истекло https://us-east4-my-test-gcf-vpc-nat.cloudfunctions.net/testVPC

Источник
dev_huesca
6 ноября 2020 в 08:58
1

Привет, ты решил эту проблему? Я пытался в течение 2 дней и до сих пор ничего :( coderhelper.com/questions/64711513/…

thammada.ts
6 ноября 2020 в 10:11
0

Да, у меня есть, пожалуйста, следуйте моим комментариям к ответу ниже, проблема заключалась в том, что пакет public-ip не работает должным образом, вы можете попробовать другие методы для получения статического IP

dev_huesca
6 ноября 2020 в 10:17
0

Неважно, что я использую, функция не может подключиться к Интернету (в моем конкретном случае пытается подключиться к ftp-серверу, чтобы сбросить некоторые файлы)

Ответы (2)

avatar
marian.vladoi
28 марта 2020 в 19:06
5
  1. Настройте пример настройки Cloud NAT с помощью Compute Engine. Используйте Compute Engine, чтобы проверить правильность настройки Cloud NAT.

  2. Настройка бессерверного доступа к VPC. Убедитесь, что вы создали коннектор VPC на custom-network1, созданном на шаге 1.

  3. Создание функции Google Cloud

a. В разделе «Сеть» выберите соединитель, созданный на шаге 2, и Route all traffic through the VPC connector.


import requests
import json

from flask import escape

def hello_http(request):

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

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

Регион для Cloud Nat, Vpc Connector и Cloud Function: us-central1

4.Проверьте функцию, чтобы узнать, есть ли у вас доступ к Интернету:

Accessing coderhelper 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=.coderhelper.com; expires=Fri, 01-Jan-2055 00:00:00 GMT; path=/; HttpOnly'}!

Успешно, теперь вы можете указать статический IP-адрес для NAT

thammada.ts
29 марта 2020 в 13:54
0

Это действительно странно, я создал новый проект и выполнил шаги 1-4, которые вы предложили, я включил необходимые API, настроил необходимые разрешения, но получил тот же результат. Я могу подтвердить, что тест на шаге 1 сработал, Cloud NAT был настроен правильно. Единственное, что я настроил не так, как в руководствах, это только имена и регион asia-east2 вместо us-central1, но я также настроил свою облачную функцию для развертывания на asia-east2. Либо я что-то упустил, либо в документации чего-то не хватает.

marian.vladoi
29 марта 2020 в 17:06
0

предоставили ли вы своей учетной записи службы, которая работает как ваша облачная функция (в моем случае учетной записи службы App Engine по умолчанию), роль compute network user?

marian.vladoi
29 марта 2020 в 17:15
0

Так же не знаю есть ли разница, это мой фаервол на nat rules:allow-ssh Ingress Apply to all IP ranges: 35.235.240.0/20 tcp:22 Allow 1000 custom-network1-allow-http Ingress http-server IP ranges: 0.0.0.0/0 tcp:80 Allow 1000 custom-network1-allow-https Ingress https-server IP ranges: 0.0.0.0/0 tcp:443 Allow 1000 Equivalent REST, и ваш коннектор в том же регионе?

thammada.ts
30 марта 2020 в 04:03
0

Привет, я добавил шаги воспроизведения, я добавил ваше предложение на шаге 10.

marian.vladoi
30 марта 2020 в 17:10
1

Привет, я знаю, это может звучать безумно, но с кодом Python у меня есть доступ к Интернету, а с node.js — нет. Я не знаю, что я делаю неправильно, но я протестировал ваш код, и время истекло.

thammada.ts
30 марта 2020 в 20:29
1

Это очень полезно. Это из-за пакета public-ip, когда я попробовал request.get('https://ifconfig.co/ip'), он работает правильно. Спасибо!!

Mark Flegg
27 мая 2020 в 14:14
0

Удалось ли вам заставить это работать с функциями nodejs? Я пытаюсь получить статический IP-адрес для функции firebase, несколько раз следовал инструкциям в документах, и каждый раз моя функция не имеет доступа к Интернету.

thammada.ts
28 мая 2020 в 13:14
0

@MarkFlegg Да, есть. С функциями firebase вам нужно будет включить VPC Connector из консоли. Вы можете опубликовать новый вопрос с вашими данными. я мог бы помочь

Mark Flegg
17 июня 2020 в 15:06
0

@thamada Спасибо! Как оказалось, мне просто нужно было подождать больше времени, прежде чем тестировать доступ к функциям. Я оставил один на ночь, а на следующее утро все было хорошо!

Sougata
20 июня 2020 в 19:46
0

Я правильно настроил облачный NAT, также подключение к Интернету было установлено в экземпляре вычислительной виртуальной машины. но я обнаружил, что он всегда принимает 0.0.0.0 в качестве широковещательного IP-адреса в Интернете \, а не статический IP-адрес, который я исправил в облаке Nat. Можете ли вы помочь мне исправить это.

dev_huesca
6 ноября 2020 в 08:57
0

@marian.vladoi можешь помочь? coderhelper.com/questions/64711513/…

avatar
user8116444
29 марта 2020 в 03:41
0

Проверьте, были ли маршрутизаторы cloud nat созданы в том же облаке VPC, которое используется для бессерверного доступа к VPC.

Также проверьте, развернута ли облачная функция в том же регионе облачных маршрутизаторов, который используется Cloud Nat.