如何在Pulumi中异步使用VirtualNetwork创建后的子网ID及正确使用apply构建ip_configurations
在Pulumi中异步获取子网ID并正确构建IP配置的解决方案
问题1:如何异步获取需等VirtualNetwork创建完成后的子网ID?
在Pulumi里,所有云资源的属性都是Output类型——这是因为资源是异步创建的,代码执行阶段这些属性还没有实际值。要拿到子网ID,你得针对VirtualNetwork的subnets属性用apply方法,这个方法会等VNet创建完成、子网数据可用时再执行后续逻辑。
像你代码里这样在创建VNet时同时定义subnets的话,VNet的subnets属性是Output[List[VirtualNetworkSubnet]]类型,里面包含了所有子网的详细信息,自然也包括ID。
问题2:正确使用apply构建ip_configurations列表
你碰到的AttributeError: 'VirtualNetwork' object has no attribute 'subnet_id'错误,原因很直接:VirtualNetwork对象本身根本没有subnet_id这个属性——子网ID是存在于subnets列表里的每个子网对象上的。另外,原代码里的apply用法逻辑也错了,你不能在apply的lambda里直接访问未解析的virtual_network.subnets[0].id(这还是个Output)。
修正后的代码:
virtual_network = azure.network.VirtualNetwork( vnet_name, name=vnet_name, resource_group_name=resource_group.name, address_spaces=test_vnet['addr'], subnets=test_vnet['subnets'], location=resource_group.location ) # 对virtual_network.subnets这个Output进行apply操作,拿到实际子网列表后提取ID ip_configurations = virtual_network.subnets.apply( lambda subnets: [{ "name": "ip-cfg", "subnet_id": subnets[0].id, "privateIpAddressAllocation": "Dynamic" }] )
代码解释:
virtual_network.subnets是一个Output,代表VNet创建完成后才会生成的子网列表apply方法接收一个lambda函数,当子网列表的实际值可用时,lambda才会被调用,此时subnets是真实的子网对象列表- 在lambda里,我们直接访问
subnets[0].id——这时候子网已经创建完成,ID是可用的实际值,最终就能构建出符合要求的ip_configurations列表
额外提示
如果你是单独创建子网(不是在VNet的subnets参数里定义),那子网资源本身的id属性就是Output,直接用就行,比如:
subnet = azure.network.Subnet(...) ip_configurations = [{ "name": "ip-cfg", "subnet_id": subnet.id, "privateIpAddressAllocation": "Dynamic" }]
这种情况下Pulumi会自动处理依赖关系,等子网创建完成后再使用它的ID。
内容的提问来源于stack exchange,提问作者irom
相关产品推荐
相关产品推荐

