Почему App Engine не может подключиться к экземпляру виртуальной машины Compute Engine?

У меня есть экземпляр виртуальной машины (e2-micro) на GCP, работающий с postgres. Я добавил свой внешний IP-адрес в pg_hba.conf, чтобы я мог подключиться к базе данных на моем локальном компьютере. Рядом с этим у меня есть приложение nodeJS, которое я хочу подключиться к этой базе данных. Локально это работает, приложение может подключаться к базе данных на экземпляре виртуальной машины. Но когда я развертываю приложение в GCP, я получаю ошибку сервера 500, когда пытаюсь посетить страницу в браузере.

Это то, что я уже делал / пробовал:

  • Создал правило брандмауэра, чтобы разрешить подключения на моем собственном внешнем IP-адресе
  • Создал коннектор VPC и добавил его в свой app.yaml
  • Убедился, что все в одном проекте и в одном регионе (европа-запад1)

Если я разрешаю все IP-адреса на моем экземпляре виртуальной машины с помощью 0.0.0.0/0, тогда App Engine сможет подключиться, поэтому я предполагаю, что я делаю что-то не так с коннектором? Я использую 10.8.0.0/28 в качестве диапазона IP-адресов, в то время как внутренний IP-адрес экземпляра виртуальной машины - 10.132.0.2, это проблема? Я пробовал диапазон ip с 10.0.0.0, но это тоже не сработало.




Ответы (2)


Сначала проверьте, использует ли ваше приложение диапазон IP-адресов / 28 (см. документацию):

При создании коннектора вы также назначаете ему диапазон IP-адресов. Трафик, отправляемый через соединитель в вашу сеть VPC, будет исходить с адреса в этом диапазоне. Диапазон IP-адресов должен быть диапазоном CIDR / 28, который еще не зарезервирован в вашей сети VPC.

При создании коннектора VPC также создается соответствующее правило брандмауэра, разрешающее трафик:

В вашей сети VPC создается неявное правило брандмауэра с приоритетом 1000, чтобы разрешить вход из диапазона IP-адресов соединителя во все пункты назначения в сети.

Как вы сами писали, когда вы создаете правило, разрешающее трафик с любого IP-адреса, оно работает (ваше приложение может подключаться). Итак - найдите правило, которое разрешает трафик из диапазона IP-адресов, в котором находится ваше приложение, - если его нет, создайте его.

Или - вы можете подключить свое приложение к своей БД через общедоступные IP-адреса - в этом случае вам также необходимо создать правильное правило, которое разрешит трафик из приложения в БД.

Во-вторых, проверьте IP-адрес БД, которую использует приложение. Я предполагаю, что вы не изменили IP-адрес БД (это приложение использует), и оно пытается подключиться не через коннектор VPC, а через внешний IP и поэтому не может (и работает только при создании правила брандмауэра).

person Wojtek_B    schedule 06.11.2020
comment
Действительно, я попытался подключиться к своему внешнему IP-адресу в моем app.yaml, изменив его на свой внутренний IP-адрес. Но мне также нужно было развернуть с gcloud beta app deploy, см. Мой ответ ниже - person Lennert; 07.11.2020

Этот ответ указал мне правильное направление: https://stackoverflow.com/a/64161504/3323605.

Мне нужно было развернуть приложение с

gcloud beta app deploy

поскольку метод коннектора VPC находился на стадии бета-тестирования. Кроме того, я попытался подключиться к внешнему IP-адресу в моем app.yaml, но, конечно, это должен был быть внутренний IP-адрес.

person Lennert    schedule 07.11.2020