You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Azure SDK for Node.js中通过前缀过滤带标签的虚拟机

Azure SDK 通过标签前缀过滤虚拟机的正确实现

我在Node.js环境中使用Azure SDK,需要通过instancename标签的前缀筛选虚拟机(无法获取完整标签值)。尝试用通配符无效,查看arm-resources.d.ts得知可用substringof函数,但该函数对标签过滤似乎不起作用。

虚拟机标签结构:

tags: {
  instancename: "WEB-OCP-0003-1"
}

我仅持有前缀WEB-OCP-0003,硬编码后缀-1时过滤逻辑有效,但后缀不固定,硬编码的可行写法如下:

const filter = `tagName eq 'instancename' and tagValue eq '${instancePrefix.toUpperCase()}-1'`;

正确过滤实现

Azure资源列表接口的过滤语法遵循OData规范,针对标签前缀匹配,正确使用startswith函数即可解决问题,注意参数顺序为startswith(目标字段, 前缀值)。

正确的过滤表达式:

const filter = `tagName eq 'instancename' and startswith(tagValue, '${instancePrefix.toUpperCase()}')`;

无效写法的问题说明

之前尝试的写法存在以下问题:

  • 部分startswith写法参数顺序颠倒(错误将前缀放在第一个参数位置)
  • substringof函数在Azure标签过滤场景下不被支持
  • Azure资源过滤不支持*作为通配符,tagValue eq '${instancePrefix}*'无效
  • 直接引用标签键instancename而非通过tagName+tagValue的方式不符合接口过滤规则

修改后的完整函数代码

/**
 * @param {GetInstancesFromProviderParams} params
 * @returns {Promise<import("@azure/arm-compute").ResourceSku[]>}
 */
async getInstancesFromProvider({ instancePrefix, region: _region }) {
    // 匹配instancename标签值以指定前缀开头的VM
    const filter = `tagName eq 'instancename' and startswith(tagValue, '${instancePrefix.toUpperCase()}')`;

    const response = await this.resourcesClient.resources.listByResourceGroup(this.resourceGroupName, {
        filter,
    });

    const vms = [];
    for await (const vm of response) {
        vms.push(vm);
    }

    console.log("Filtered VMs:", vms);
    return vms;
}

内容的提问来源于stack exchange,提问作者Oussama Bouchikhi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 05:42:07