使用Pulumi Crosswalk创建VPC后查询安全组遇错的技术咨询
问题场景
使用Pulumi Crosswalk创建VPC后,将输出的vpc_id作为参数查询安全组时,因Pulumi异步特性触发报错,错误信息如下:
Exception: invoke of aws:ec2/getSecurityGroup:getSecurityGroup failed: invocation of aws:ec2/getSecurityGroup:getSecurityGroup returned an error: invoking aws:ec2/getSecurityGroup:getSecurityGroup: 1 error occurred:
- multiple Security Groups matched; use additional constraints to reduce matches to a single Security Group
疑问列表
- 明明不存在多个匹配项,为何提示该信息?
- 为何在预览阶段就抛出错误?预览阶段也会调用AWS接口吗?
- 考虑到
depends_on对get_security_group方法无效,如何等待VPC创建完成后再发起查询?有没有Pulumi原生的处理方式?
原代码片段
vpc = awsx.ec2.Vpc("pulumi-test",cidr_block='10.2.0.0/16',subnet_specs=[ awsx.ec2.SubnetSpecArgs( type=awsx.ec2.SubnetType.PRIVATE, cidr_mask=26, ), awsx.ec2.SubnetSpecArgs( type=awsx.ec2.SubnetType.PUBLIC, cidr_mask=26, ) ], number_of_availability_zones=1) security_group = aws.ec2.get_security_group(vpc_id=vpc.vpc_id)
问题解答
1. 为何提示“多个匹配项”?
因为VPC创建完成前,vpc.vpc_id还未生成真实的AWS VPC ID,此时调用get_security_group会传入Pulumi内部的占位符而非有效ID。AWS API接收到无效参数后,会返回当前区域下所有安全组,自然触发“多个匹配项”的错误,而非仅匹配目标VPC内的安全组。
2. 预览阶段为何报错?
是的,Pulumi预览阶段会调用部分AWS接口。对于get_security_group这类数据查询函数(Invoke),Pulumi在预览时就会尝试调用AWS API获取数据——这类函数依赖外部现有资源状态,Pulumi需要提前获取数据才能生成准确的部署预览计划。
3. 如何等待VPC创建完成后再查询?
depends_on对数据查询函数无效,因为这类函数不属于Pulumi管理的资源。正确做法是使用Pulumi的异步输出绑定(Output Binding),通过apply方法确保vpc.vpc_id生成真实值后再执行查询:
修正后的代码
vpc = awsx.ec2.Vpc("pulumi-test",cidr_block='10.2.0.0/16',subnet_specs=[ awsx.ec2.SubnetSpecArgs( type=awsx.ec2.SubnetType.PRIVATE, cidr_mask=26, ), awsx.ec2.SubnetSpecArgs( type=awsx.ec2.SubnetType.PUBLIC, cidr_mask=26, ) ], number_of_availability_zones=1) # 使用apply确保vpc_id就绪后再执行查询 security_group = vpc.vpc_id.apply( lambda vpc_id: aws.ec2.get_security_group(vpc_id=vpc_id, group_name="your-target-sg-name") )
注意:建议同时指定
group_name或group_id等额外约束条件——即使VPC就绪,仅靠vpc_id也可能匹配到VPC默认安全组等系统创建的安全组,避免再次触发“多个匹配项”错误。
如果你的目标是获取VPC的默认安全组,还可以直接从VPC资源的输出中获取,无需调用查询函数:
# 直接获取VPC默认安全组ID default_security_group_id = vpc.default_security_group_id
内容的提问来源于stack exchange,提问作者Akshay Baura

