AWS使用Boto3自动化创建VPC端点时筛选单个Subnet ID报错的技术问询
解决VPC端点自动化创建中的子网ID筛选错误
你遇到的list indices must be integers or slices, not str错误,根源出在两个地方:过滤器格式错误,以及对子网列表的访问方式不对,我来一步步帮你修正:
问题1:过滤器格式错误
你把两个筛选条件(可用区和默认子网)塞进了同一个字典里,这会导致后面的Name键覆盖前面的,AWS根本不会正确应用筛选规则。而且Boto3里EC2过滤器的名称是短横线分隔的格式(比如availability-zone),不是驼峰命名,之前的availabilityZone和defaultForAz其实是无效的筛选条件。
正确的过滤器应该是每个条件对应一个独立的字典:
Filters=[ { 'Name': 'availability-zone', 'Values': ['us-east-1a'] }, { 'Name': 'default-for-az', 'Values': ['true'] } ]
问题2:子网列表的访问错误
ec2.describe_subnets()返回的Subnets字段是一个子网对象的列表,不是单个字典。你直接用subs['SubnetId']去访问,相当于给列表传了字符串索引,自然会报错。
你需要先从列表中取出具体的子网对象(比如第一个符合条件的子网),再获取它的SubnetId,同时最好加个判断避免空列表的情况。
修正后的完整代码
import boto3 import json def lambda_handler(event, context): ec2 = boto3.client('ec2') # 获取所有VPC vpc_response = ec2.describe_vpcs() vpcs = vpc_response['Vpcs'] # 修正后的筛选器:正确的参数名和格式 subnet_response = ec2.describe_subnets( Filters=[ { 'Name': 'availability-zone', 'Values': ['us-east-1a'] }, { 'Name': 'default-for-az', 'Values': ['true'] } ] ) subs = subnet_response['Subnets'] # 检查是否找到子网,避免空列表报错 if not subs: raise Exception("未找到符合条件的子网,请检查筛选条件") # 获取第一个符合条件的子网ID target_subnet_id = subs[0]['SubnetId'] # 遍历每个VPC创建SSM接口端点 for v in vpcs: try: ec2.create_vpc_endpoint( VpcEndpointType='Interface', VpcId=v['VpcId'], SubnetIds=[target_subnet_id], ServiceName='com.amazonaws.us-east-1.ssm', PrivateDnsEnabled=False ) print(f"成功为VPC {v['VpcId']} 创建SSM接口端点") except Exception as e: print(f"为VPC {v['VpcId']} 创建端点失败:{str(e)}")
额外补充的优化点
- 给创建端点的逻辑加了
try-except捕获异常,避免单个VPC创建失败导致整个Lambda函数崩溃; - 去掉了不必要的字符串格式化(比如
f"{v['VpcId']}"),因为v['VpcId']本身就是字符串类型; - 增加了日志打印,方便你排查执行情况。
内容的提问来源于stack exchange,提问作者Justin Lawhorne
相关产品推荐
相关产品推荐

