编写VM';在GCP计算引擎(托管实例组)上运行的Node.js项目的.env文件的外部IP

编写VM';在GCP计算引擎(托管实例组)上运行的Node.js项目的.env文件的外部IP,node.js,google-cloud-platform,environment-variables,Node.js,Google Cloud Platform,Environment Variables,背景信息 我有一个Node.js应用程序运行在GCP计算引擎上的VM托管实例组上 新VM是从带有启动脚本的模板生成的。该脚本执行常规操作,安装Node.js、curl、git克隆应用程序代码等 此应用程序设置为自动缩放,这就是为什么我需要按语法进行配置-即在Node.js项目的.env文件中设置host和port 我是如何试图解决这个问题的 在startup.sh脚本中以编程方式执行此操作的唯一方法是运行命令:gcloud compute instances list 这个返回类似这样的值 NA

背景信息

我有一个Node.js应用程序运行在GCP计算引擎上的VM托管实例组上

新VM是从带有启动脚本的模板生成的。该脚本执行常规操作,安装Node.js、curl、git克隆应用程序代码等

此应用程序设置为自动缩放,这就是为什么我需要按语法进行配置-即在Node.js项目的.env文件中设置
host
port

我是如何试图解决这个问题的

在startup.sh脚本中以编程方式执行此操作的唯一方法是运行命令:
gcloud compute instances 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
然后,我想从当前运行脚本的机器中取出外部IP,并将其写入环境变量/将其写入项目的.env文件

.env文件中仅包含以下信息:

{
    "config" : {
        "host" : "VM_EXTERNAL_IP"
        "port" : 3019
    }
 }
我认为,这种方法需要某种正则表达式从命令输出中获取正确的IP,然后存储在环境变量中,然后写入.env


这似乎是不必要的工作,因为我肯定不是第一个想做这种事情的人。有没有一个标准的方法可以做到这一点?我无论如何都不是Node.js专家,更不是GCP专家。也许GCP有一个机制来处理这个问题是否有一些元数据API可以轻松获取IP以在代码中使用?也许在Node.js端有更好的配置主机的方法?欢迎提出任何建议

有许多方法可以确定外部IP地址。请注意,您的实例没有外部公共IP地址。Google实现了一个1对1的NAT,该NAT处理IP地址转换,将公共IP地址映射到私有IP地址

CLI支持命令行选项
--格式化json
。您可以使用解析json的工具,如
jq

gcloud compute instances list --format json | jq -r ".[].networkInterfaces[0].accessConfigs[0].natIP"
从多个来源获取您的公共IP地址,这些来源可能与您的实例相同,也可能不同:

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

使用CLI和选项仅获取外部地址

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
等工具替换文件中的值