Каков наилучший способ записи внешнего IP-адреса виртуальной машины в файл .env для проекта Node.js, работающего на GCP Compute Engine (Managed Instance Group) - PullRequest
0 голосов
/ 16 апреля 2020

Справочная информация

У меня есть приложение Node.js, работающее в группе управляемых экземпляров виртуальных машин на GCP Compute Engine.

Новые виртуальные машины генерируются из шаблона со скриптом запуска. Сценарий выполняет обычные функции, устанавливает Node.js, curl, git, клонирует код приложения и т. Д. c.

. Это приложение настроено на автоматическое масштабирование, поэтому мне нужно выполнить настройки pro Грамматически - а именно: host и port в файле .env для проекта Node.js.

Как я пытался решить проблему

Единственный способ, которым я могу думать об этом программно при запуске. Сценарий sh - это выполнить команду: gcloud compute instaces list

Это возвращает что-то вроде этого

NAME                              ZONE           MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP     STATUS
VM-1                           us-central1-a    n1-standard-1                XX.XXX.X.X   XX.XXX.XXX.XXX  RUNNING
VM-2                           us-central1-a    n1-standard-1                XX.XXX.X.X   XX.XXX.XXX.XXX  RUNNING
VM-3                           us-central1-a    n1-standard-1                XX.XXX.X.X   XX.XXX.XXX.XXX  RUNNING

Затем из этого , Я бы хотел извлечь EXTERNAL_IP текущей машины, на которой выполняется скрипт, и каким-то образом записать его в переменную окружения / записать в файл .env для моего проекта.

Только файл .env содержит в себе эту информацию:

{
    "config" : {
        "host" : "VM_EXTERNAL_IP"
        "port" : 3019
    }
 }

Этот метод, я думаю, потребовал бы какого-то рода регулярных выражений, чтобы получить правильный IP из вывода команд, затем сохранить в переменной Environment, а затем записать в .env.

Это кажется ненужной работой, поскольку я, конечно, не первый человек, который хочет сделать что-то подобное. Есть ли стандартный способ сделать это? Я ни в коем случае не эксперт Node.js, и даже не эксперт GCP. Возможно, на GCP есть механизм, чтобы справиться с этим? API метаданных, которые могут легко захватить IP для использования в коде? Может быть, на стороне Node.js есть лучший способ настройки хоста? Любые рекомендации приветствуются.

1 Ответ

1 голос
/ 16 апреля 2020

Существует много способов определения внешнего IP-адреса. Обратите внимание, что ваш экземпляр не имеет внешнего публичного IP-адреса c. Google реализует NAT 1-к-1, который обрабатывает преобразование IP-адреса, которое сопоставляет опубликованный IP-адрес c с частным IP-адресом.

CLI поддерживает параметр командной строки --format json. Вы можете использовать инструменты, которые разбирают json, например jq.

gcloud compute instances list --format json | jq -r ".[].networkInterfaces[0].accessConfigs[0].natIP"

Получите ваш публичный c IP-адрес из нескольких источников, который может совпадать или не совпадать с вашим экземпляром:

https://checkip.amazonaws.com/.

curl https://checkip.amazonaws.com/

Использование интерфейса командной строки с параметрами для получения только внешнего адреса

gcloud compute instances describe [INSTANCE_NAME] --format='get(networkInterfaces[0].accessConfigs[0].natIP)'

Считывание сервера метаданных из экземпляра:

curl http://metadata/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip -H "Metadata-Flavor: Google"

Как только вы определили метод получения вашего внешнего IP-адреса, вы можете использовать такие инструменты, как awk для замены значения в вашем файле.

https://www.grymoire.com/Unix/Awk.html

...