如何在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
相关产品推荐
相关产品推荐

