使用boto3的ec2.create_fleet()创建Spot Fleet时遇参数不生效等问题
解决create_fleet替代request_spot_fleet的问题
针对你遇到的四个问题,逐一给出修复方案:
1. 启动多个独立实例而非单个集群请求
控制台显示Request type = instance是因为Fleet配置不完整,确保调用create_fleet时传递FleetType='maintain',同时正确配置LaunchTemplateConfigs和TargetCapacitySpecification。完整配置后,控制台会显示一个单独的Spot Fleet条目,所有实例都归属该Fleet。
2. 设置Type="maintain"但显示Persistence one-time
旧API的Type参数对应新API的顶层参数FleetType,必须在create_fleet调用中显式传递FleetType='maintain',而非嵌入到其他参数块中。同时确保ReplaceUnhealthyInstances=True(默认启用,显式指定更稳妥),这样Fleet会维持目标容量,而非一次性创建实例。
3. ValidFrom和ValidUntil字段为空
这两个参数是create_fleet的顶层参数,必须传递ISO 8601格式的UTC时间字符串(例如'2024-05-20T00:00:00Z')。格式不正确会导致AWS忽略参数,控制台字段为空。可以用Python生成符合要求的时间:
from datetime import datetime, timedelta, timezone valid_from = (datetime.now(timezone.utc) + timedelta(hours=1)).isoformat() valid_until = (datetime.now(timezone.utc) + timedelta(hours=24)).isoformat()
4. 传入IAM Fleet Role
在create_fleet的顶层参数中添加IamFleetRole,值为你的Fleet角色ARN(通常使用AWS托管的aws-ec2-spot-fleet-tagging-role,或自定义角色):
IamFleetRole='arn:aws:iam::123456789012:role/aws-ec2-spot-fleet-tagging-role'
该角色用于授权Spot Fleet服务管理实例(如替换不健康实例、标签管理等)。
完整修改后的调用代码
from datetime import datetime, timedelta, timezone # 生成ValidFrom和ValidUntil的ISO格式时间 valid_from = (datetime.now(timezone.utc) + timedelta(hours=1)).isoformat() valid_until = (datetime.now(timezone.utc) + timedelta(hours=24)).isoformat() # 调用create_fleet,补充所有缺失参数 response = ec2client.create_fleet( LaunchTemplateConfigs=LaunchTemplateConfigs, TargetCapacitySpecification=TargetCapacitySpecification, SpotOptions=SpotOptions, FleetType='maintain', ValidFrom=valid_from, ValidUntil=valid_until, IamFleetRole='arn:aws:iam::123456789012:role/aws-ec2-spot-fleet-tagging-role', ReplaceUnhealthyInstances=True )
内容的提问来源于stack exchange,提问作者Erin W
相关产品推荐
相关产品推荐

