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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 20:15:41