我希望在Cloudformation中创建一个Spot Fleet,它一次运行一个游戏服务器;如果价格飙升且服务器需要终止,它将使用2分钟的抬头来优雅地关闭并存储要保留在EBS卷上的任何内容。然后由舰队开始的下一个实例将安装该卷并从前一个停止的位置重新启动游戏服务器。
SpotFleet:
Type: "AWS::EC2::SpotFleet"
Properties:
SpotFleetRequestConfigData:
IamFleetRole: !Sub arn:aws:iam::${AWS::AccountId}:role/aws-ec2-spot-fleet-tagging-role
TargetCapacity: 1
LaunchSpecifications:
- InstanceType: "m5.large"
ImageId: "ami-abcd1234"
IamInstanceProfile: !GetAtt InstanceProfile.Arn
WeightedCapacity: 1
现在我不得不在cf模板中定义持久卷。最初我只想将其添加为资源:
Volume:
Type: "AWS::EC2::Volume"
Properties:
Size: 10
AvailabilityZone: !Ref AWS::Region
但是我如何在舰队中引用它呢?您可以根据车队内的LaunchSpeficiations定义BlockDeviceMappings http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetrequestconfigdata-launchspecifications-blockdevicemappings.html 但是根据可用的属性,我似乎无法引用现有的卷,因此我们认为这些卷不会持久存在。
或者我想通过VolumeAttachment将音量附加到专题实例:
VolumeAttachment:
Type: "AWS::EC2::VolumeAttachment"
Properties:
Device: "dev/server"
InstanceId: !Ref SpotFleet
VolumeId: !Ref Volume
但很明显,这里的SpotFleet引用返回了fleet名称,而不是任何已创建实例的id。并且都没有!Ref也没有!GetAtt似乎能够从舰队中提取这些ID。
我是否忽略了如何在CloudFormation中完成上述操作的任何重要事项,还是应该考虑将EC2:AttachVolume和EC2:DetachVolume权限添加到InstanceProfile并简单地从EC2实例中手动附加卷?
非常感谢,
答案 0 :(得分:1)
EC2竞价型实例现在支持设置"中断行为"到stop
而不是terminate
。
选择此选项后,专色实例会保留其实例ID,EBS卷,其专用和弹性IP地址及其EBS卷,这些卷保留在原位并附加。
某些实例类型也支持" hybernate"将整个系统状态的快照写入EBS以允许实例恢复"的选项。当容量再次可用时,而不是重新启动。
http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-interruptions.html
答案 1 :(得分:0)
您要找的是BlockDeviceMappings属性,位于SpotFleet SpotFleetRequestConfigData LaunchSpecifications,属性为SpotFleetRequestConfigData,属于AWS::EC2::SpotFleet resource type的属性。
BlockDeviceMappings
属性允许您定义附加到启动规范的其他EBS卷。这是在启动时控制设备映射的规范。
例如:
"BlockDeviceMappings" : [{
"DeviceName" : "/dev/sdf",
"Ebs" : {"VolumeSize": "10", "VolumeType" : "gp2", "DeleteOnTermination" : "true"}
}],
将在现货车队实例的/ dev / sdf设备上指定10GB的容量。