背景信息
在GCP的计算引擎上,我有一个运行在VM托管实例组上的Node.js应用程序。
新VM是从带有启动脚本的模板生成的。脚本完成了通常的工作,安装Node.js、curl、git克隆应用程序代码等等。
此应用程序设置为自动缩放,这就是为什么我需要按语法方式进行配置,即在host项目的.env文件中设置Node.js和port。
我是如何解决这个问题的
在我的startup.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,然后存储在环境变量中,然后写入.env。
这似乎是不必要的工作,因为我肯定不是第一个想要这样做的人。有什么标准的方法吗?我绝不是Node.js专家,更不是GCP专家。也许GCP上有一种机制来处理这个问题?-一些元数据API可以很容易地抓取IP以便在代码中使用?也许在Node.js方面有一种更好的配置主机的方法?如有任何建议,我们将不胜感激。
发布于 2020-04-16 00:07:14
确定外部IP地址的方法很多。请注意,您的实例没有外部公共IP地址。Google实现了一个1比1的NAT,它处理IP地址转换,将公共IP地址映射到私有IP地址。
CLI支持命令行选项--format json。您可以使用解析json的工具,如jq。
gcloud compute instances list --format json | jq -r ".[].networkInterfaces[0].accessConfigs[0].natIP"从多个来源获取您的公共IP地址,这些来源可能与您的实例相同,也可能不相同:
https://checkip.amazonaws.com/。
curl https://checkip.amazonaws.com/使用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等工具来替换文件中的值。
https://stackoverflow.com/questions/61240139
复制相似问题