AWS Lambda配置测试事件启动EC2实例报EndpointConnectionError如何解决
问题根因
- 代码中所有EC2配置参数(REGION、AMI、INSTANCE_TYPE等)都被硬编码为占位符字符串,没有替换为实际有效值,也没有读取测试事件传入的参数
- 你给
region_name传了值为REGION的字符串,导致boto3尝试拼接不存在的域名ec2.REGION.amazonaws.com,自然连接失败 - 如果你打算通过测试事件JSON传入参数,现有代码完全没有读取
event对象里的配置值,且EC2客户端初始化放在了函数外部,冷启动阶段还没拿到传入的区域参数就会初始化失败
修正后代码
import boto3 import json def lambda_handler(event, context): # 从测试事件传入的参数读取配置 AMI = event.get('AMI') INSTANCE_TYPE = event.get('INSTANCE_TYPE') KEY_NAME = event.get('KEY_NAME') REGION = event.get('REGION') SUBNET_ID = event.get('SUBNET_ID') SECURITYGROUP_ID = event.get('SECURITYGROUP_ID') # 初始化EC2客户端要放在函数内,才能拿到传入的REGION参数 ec2 = boto3.client('ec2', region_name=REGION) instance = ec2.run_instances( ImageId=AMI, InstanceType=INSTANCE_TYPE, KeyName=KEY_NAME, SubnetId=SUBNET_ID, SecurityGroupIds=[SECURITYGROUP_ID], MaxCount=1, MinCount=1 ) print("New instance created:") instance_id = instance['Instances'][0]['InstanceId'] print(instance_id) return instance_id
测试事件JSON格式参考
你需要在测试事件里填入对应实际值,示例结构如下:
{ "AMI": "ami-xxxxxx(你实际要用的镜像ID)", "INSTANCE_TYPE": "t2.micro(实例规格)", "KEY_NAME": "你的EC2密钥对名称", "REGION": "cn-north-1(实际区域编码,例如北京区是cn-north-1,宁夏区是cn-northwest-1)", "SUBNET_ID": "subnet-xxxxxx(子网ID)", "SECURITYGROUP_ID": "sg-xxxxxx(安全组ID)" }
额外注意事项
- 需要给Lambda执行角色附加
ec2:RunInstances权限,否则会报权限不足错误 - 如果Lambda部署在VPC内,需要确保有到EC2服务端点的网络连通性,可以配置VPC端点或者给子网配置公网网关
- 所有参数值必须和你填的REGION属于同一个AWS区域,比如AMI ID是区域级资源,跨区域无法使用
内容的提问来源于stack exchange,提问作者Praveen Sivakumar
相关产品推荐
相关产品推荐

