如何通过Boto3与AWS Lambda创建含多实例类型的Spot Fleet
问题诊断与修复方案
问题根源
你当前的代码应该是在循环中逐个实例类型调用了request_spot_fleet()方法,导致每个实例类型都生成了独立的Spot Fleet请求,且因为未正确配置Fleet类型,默认使用了instance请求类型(而非预期的fleet)。
修复步骤
要创建包含多实例类型的单一Spot Fleet,核心是把所有实例类型配置到同一个SpotFleetRequestConfigData的**启动模板覆盖项(LaunchTemplateOverrides)**中,一次性提交请求。
修正后的Lambda代码示例
import boto3 def lambda_handler(event, context): ec2 = boto3.client('ec2') # 定义要使用的实例类型列表 instance_types = [ 't2.medium', 't2.large', 't3a.medium', 't3a.large', 't3.medium', 't3.large' ] # 构建启动模板覆盖项:每个实例类型对应一个配置 launch_template_overrides = [ {'InstanceType': instance_type} for instance_type in instance_types ] # 构建Spot Fleet请求配置 spot_fleet_config = { 'SpotPrice': '0.05', # 根据你的需求设置竞价价格 'TargetCapacity': 2, # 目标实例数量,按需调整 'InstancePoolsToUseCount': 6, # 使用所有指定的实例池 'Type': 'fleet', # 明确指定请求类型为fleet 'LaunchTemplateConfigs': [ { 'LaunchTemplateSpecification': { 'LaunchTemplateId': '你的启动模板ID', # 替换为你的启动模板ID/名称 'Version': '$Latest' }, 'Overrides': launch_template_overrides } ], 'SpotInstanceRequestConfigData': { 'InstanceInterruptionBehavior': 'terminate' # 实例中断行为,按需调整 } } # 提交单一Spot Fleet请求 response = ec2.request_spot_fleet(SpotFleetRequestConfig=spot_fleet_config) print(f"创建的Spot Fleet ID: {response['SpotFleetRequestId']}") return response
关键修正点说明
- 移除实例类型循环:不再逐个实例类型调用
request_spot_fleet(),而是把所有实例类型打包到LaunchTemplateConfigs.Overrides数组中。 - 明确指定请求类型:在
spot_fleet_config中设置'Type': 'fleet',确保生成的是Fleet类型的请求,而非单个实例的请求。 - 配置实例池数量:
InstancePoolsToUseCount设为6(对应你要使用的6种实例类型),让AWS从所有指定的实例类型中选择最优选项。 - 统一目标容量:
TargetCapacity设置为你需要的总实例数,而非每个实例类型单独设置容量。
IAM策略验证
确保你的Lambda执行角色拥有ec2:RequestSpotFleet权限,策略示例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:RequestSpotFleet", "Resource": "*" } ] }
验证结果
执行修正后的代码后,你会在AWS控制台的Spot请求页面看到一个单一的Spot Fleet请求,类型为fleet,且包含你指定的6种实例类型。
内容的提问来源于stack exchange,提问作者Pavan Bhat
相关产品推荐
相关产品推荐

