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

AWS Lambda中遍历Boto3 ec2.instancesCollection超时无报错问题

根本原因

你遇到的超时是网络不可达导致EC2 API调用无响应,和代码逻辑无关:
boto3的资源集合是懒加载设计:调用ec2.instances.all()时仅创建集合对象,不会发起API请求,真正调用DescribeInstances接口拉取实例数据是在你迭代集合(也就是进入for循环)的时候才执行的,所以程序会卡在此处没有输出。
你本地环境可以正常访问AWS公网API,所以运行正常;Lambda环境没有EC2 API的访问通路,请求一直挂起直到触发Lambda运行超时被强制终止,因此CloudWatch没有错误日志。

解决方案

1. 优先修复网络访问问题(核心)

先确认你的Lambda是否配置了VPC部署:

  • 如果无VPC部署需求:直接在Lambda控制台的「配置-网络」选项中移除VPC配置,默认Lambda拥有公网访问权限,可直接调用EC2公网API。
  • 如果必须部署在VPC中,二选一配置:
    • 方案A:在VPC中创建EC2服务的接口端点(VPC Endpoint),服务名称选择com.amazonaws.<你的区域>.ec2,同时配置端点安全组允许Lambda的安全组访问443端口,Lambda即可通过私有网络调用EC2 API。
    • 方案B:给Lambda所在的私有子网配置公网NAT网关,修改子网路由表将公网流量指向NAT网关,为Lambda提供公网访问能力。

2. 代码优化建议

  • 删除硬编码的AKSK:这是高风险操作,直接给Lambda执行角色附加AmazonEC2ReadOnlyAccess权限策略,代码中直接使用默认凭证链初始化即可,示例:
import boto3
from botocore.config import Config

# 配置请求超时,避免无限制等待
config = Config(
    connect_timeout=3,
    read_timeout=5,
    retries={'max_attempts': 2}
)

def print_hello(event, context):
    try:
        # 直接用默认凭证,不需要手动传AKSK
        ec2 = boto3.resource('ec2', region_name='你的区域', config=config)
        for instance in ec2.instances.all():
            print(instance.private_ip_address)
    except Exception as e:
        print(f"调用出错: {e}")
    
    return {
        "statusCode": 200,
        "headers": {
            "Content-Type": "application/json"
        },
        "body": ""
    }
  • 临时调大Lambda超时时间到30秒,方便调试时获取具体的错误日志,而不是直接被Lambda终止进程。

内容的提问来源于stack exchange,提问作者skywallkee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:36:02