Это связано со следующими вопросами, которые устарели
- Можно ли получить статический IP-адрес для Google Cloud Functions?
- Google Cloud – исходящий IP-адрес/NAT/прокси-сервер для облачных функций Google
В настоящее время 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.
- Установка идентификатора проекта для будущего использования
PROJECT_ID=my-test-gcf-vpc-nat
Перейдите в консоль и включите оплату
Настройте 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
Разрешения SSH для IAP созданы с помощью консоли
Проверьте конфигурацию сети, у ВМ не должно быть доступа к Интернету без 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
- Настройка 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
- Протестируйте конфигурацию сети еще раз, виртуальная машина должна иметь доступ в Интернет через Cloud NAT
gcloud compute ssh nat-test-1 \
--zone us-east4-c \
--command "curl -s ifconfig.io" \
--tunnel-through-iap \
--project $PROJECT_ID
команда ответила IP-адресом
- Создан коннектор доступа к 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
- Добавлены разрешения для сервисного аккаунта 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
- Есть предложения добавить дополнительные правила брандмауэра и разрешения учетной записи службы
# 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 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
Привет, ты решил эту проблему? Я пытался в течение 2 дней и до сих пор ничего :( coderhelper.com/questions/64711513/…
Да, у меня есть, пожалуйста, следуйте моим комментариям к ответу ниже, проблема заключалась в том, что пакет
public-ip
не работает должным образом, вы можете попробовать другие методы для получения статического IPНеважно, что я использую, функция не может подключиться к Интернету (в моем конкретном случае пытается подключиться к ftp-серверу, чтобы сбросить некоторые файлы)