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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 23:02:48