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

Lambda函数执行成功却无法启动EC2实例的技术问询

排查Lambda无法启动EC2实例的问题

已知配置梳理

  • IAM策略:
    • START_STOP_EC2策略:允许ec2:StartInstances、ec2:StopInstances操作,资源范围*
    • AWSLambdaBasicExecutionRole策略:允许日志相关操作,用于CloudWatch日志监控
  • Lambda运行时:Python 3.9,x86_64架构
  • Lambda代码:调用ec2.start_instances启动指定实例i-abcdefgh
  • EC2实例:r7a.medium,us-east-1b可用区,Windows系统,无公网IP/弹性IP

排查步骤

1. 验证实例ID准确性

确认代码中instances数组里的i-abcdefgh和目标EC2实例的实际ID完全一致,检查是否有字符输入错误(比如多/少字符、大小写错误,EC2实例ID为小写字母+数字组合)。

2. 确认Lambda与IAM角色的关联

检查Lambda函数的执行角色是否正确绑定了包含START_STOP_EC2和AWSLambdaBasicExecutionRole的IAM角色,避免出现“创建了策略但未关联到角色”或“角色未绑定到Lambda”的情况。

3. 检查EC2实例本身的约束

  • 确认实例当前处于已停止状态,而非停止中、终止中等过渡状态;
  • 手动尝试启动该EC2实例,若手动启动失败,说明问题出在EC2层面:
    • 检查us-east-1b可用区是否有r7a.medium实例的容量限制;
    • 确认AWS账号是否存在欠费情况;
    • 检查实例是否被资源策略或组织SCP限制启动操作。

4. 查看Lambda执行日志细节

虽然测试显示“执行成功”,但需查看CloudWatch日志确认实际调用结果:

  • 修改代码添加异常捕获与日志输出,以便排查隐藏错误:
    import boto3
    import logging
    
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    
    region = 'us-east-1'
    instances = ['i-abcdefgh']
    ec2 = boto3.client('ec2', region_name=region)
    
    def lambda_handler(event, context):
        try:
            response = ec2.start_instances(InstanceIds=instances)
            logger.info(f"启动实例API响应: {response}")
            logger.info(f"目标实例: {str(instances)}")
        except Exception as e:
            logger.error(f"启动失败原因: {str(e)}")
            raise e
    
  • 重新测试后,在CloudWatch日志中查看是否有API调用报错(比如实例不存在、权限受限等)。

5. 确认区域配置一致性

Lambda代码指定的区域为us-east-1,与EC2实例所在的us-east-1b可用区兼容,但需确认Lambda函数的部署区域是否为us-east-1(跨区域调用EC2 API理论可行,但可能存在网络或权限隐性问题)。

6. 检查额外权限限制

  • 若为AWS组织账号,确认服务控制策略(SCP)未限制ec2:StartInstances操作;
  • 检查EC2实例是否存在资源级策略,拒绝了启动操作(此类场景较少见,但需排除)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 11:27:21