NodeJS 是否有办法使用任何npm或Google云API从节点获取VM的外部IP地址?

9lowa7mx  于 2023-02-12  发布在  Node.js
关注(0)|答案(4)|浏览(115)

我想获取我的谷歌虚拟机示例的IP地址动态使用节点。是否有任何NPM包或谷歌云提供任何API?我不想手动复制粘贴它。

czq61nw1

czq61nw11#

您可以使用Node.js Client library for Google Compute Engine
检索计算示例的外部IP地址有多种方法,例如,您可以运行以下代码:

const Compute = require('@google-cloud/compute');
const compute = new Compute({
  projectId: 'your-project-id',
  keyFilename: '/your/path/to/file'
});
const zone = compute.zone('instanceZone');
const vm = zone.vm('instanceName');

vm.getMetadata(function(err, metadata, apiResponse) {});

//-
// If the callback is omitted, we'll return a Promise.
//-
vm.getMetadata().then(function(data) {
  // Representation of this VM as the API sees it.
  const metadata = data[0];
  console.log(metadata.networkInterfaces[0].accessConfigs[0].natIP)
});

此外,您还可以使用Google Cloud Platform command-line interface
gcloud compute instances describe instanceName --zone=instanceZone | grep natIP

pzfprimi

pzfprimi2#

另一种可能性是利用元数据服务。有关详细信息,请参阅以下文档:
https://cloud.google.com/compute/docs/storing-retrieving-metadata
在最高级别,GCP保存每个VM示例的元数据,其中包括您的外部IP地址。通过对一个特殊端点进行REST调用,您可以自行请求所有元数据。这将以JSON文档的形式返回,然后可以轻松解析。
例如,在VM中的shell提示符下运行以下命令:

wget --output-document=- --header="Metadata-Flavor: Google" \
  --quiet http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip

希望您能看到,通过发出此REST请求,我们几乎是语言中立的,因此,如果您可以从您最喜欢的语言发出REST请求,您可以检索您想要的数据(以及更多)。如果您不使用此技术来满足您当前的需求,请确保并记住它,以便在将来需要其他数据的项目中使用。

mwngjboj

mwngjboj3#

作为@llompalles答案的补充,这个函数可能会帮助一些喜欢async / await模式的人:

const getIpAddress = async (vm) => {
    const metadata = await vm.getMetadata();
    return metadata[0].networkInterfaces[0].accessConfigs[0].natIP;
};

示例用法-使用已启动的VM的IP地址进行响应:

const Compute = require('@google-cloud/compute');
const [serverName, region] = ["server_name", "us-west1-a"];

exports.startVMInstance = async (req, res) => {
    const compute = new Compute();
    const zone = compute.zone(region);
    const vm = zone.vm(serverName);

    const startVmResponse = await vm.start();
    const ip = await getIpAddress(vm);
    res.status(200).send(`Server successfully started at IP address: ${ip}`);
};
z2acfund

z2acfund4#

上面提到的方法已被弃用,如果你尝试,你会得到以下错误:

> const compute = new Compute();
Uncaught TypeError: Compute is not a constructor

现在我们可以按照下面的方法获取远程计算示例资源的公共IP

const {InstancesClient} = require('@google-cloud/compute').v1;
const computeClient = new InstancesClient();
const the_compute_instance = await computeClient.get({instance: "<instance-name>", project: "<gcp-project-name>", zone: "<gcp-zone>"})
const public_ip = the_compute_instance[0]["networkInterfaces"][0]["accessConfigs"][0]["natIP"]
console.log(public_ip)

GCP Reference

相关问题