Amazon EC2 简化了 Amazon EC2 Spot 实例的定价模型,转变为提供可预测的低价,并根据长期供需趋势逐步调整价格,而且您将继续获得与按需实例相比高达 90% 的节省比例。同时Amazon EC2 Spot 支持通过 RunInstances 函数、run-instances 命令或 AWS 管理控制台启动Spot实例。
按需实例和Spot实例之间的唯一区别是,当EC2需要退还时,Spot实例可以被Amazon EC2中断并发出两分钟的通知。中断通知作为Amazon CloudWatch Events中的事件提供,CloudWatch Events可以通过电子邮件,文本,AWS Lambda等发送两分钟警告。
在开始之前,请确保已经安装了AWS CLI,并赋予了启动EC2的权限。AWS CLI的安装和配置,请参考https://docs.amazonaws.cn/cli/latest/userguide/cli-chap-welcome.html
1. 使用图形化界面启动spot实例
略
2. 利用CloudWatch Events配置中断邮件警告
如上所述,CloudWatch Events可以在Spot实例被中断之前发送两分钟警告。以下将介绍如何将警告发送到电子邮箱。
2.1 创建一个SNS主题以接收Spot实例活动通知:
2.2 配置Cloudwatch Events发布SNS
- 接受指定的ec2 id的中断事件
{
"source": ["aws.ec2"],
"detail-type": ["EC2 Spot Instance Interruption Warning"],
"detail": {
"instance-id": ["i-xxx实际ec2 idxxxx", "i-xxx实际ec2xxx"]
}
}
- 接受全部ec2 的spot中断事件
{
"source": ["aws.ec2"],
"detail-type": ["EC2 Spot Instance Interruption Warning"]
}
cloudwatch event支持多个目标接受目标,本案例中使用邮件演示。更为灵活的可以使用lambda发送实时消息通知、再重启一台spot实例等多种场景。
3. 设置服务器轮训任务
#!/bin/bash
TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
while sleep 3; do
HTTP_CODE=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -s -w %{http_code} -o /dev/null http://169.254.169.254/latest/meta-data/spot/instance-action)
if [[ "$HTTP_CODE" -eq 401 ]]; then
echo 'Refreshing Authentication Token'
TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 30")
elif [[ "$HTTP_CODE" -eq 200 ]]; then
# 收到中断通知,执行脚本,例如
echo 'Interrupted'
echo '可以在此处做一些动作'
else
echo 'Not Interrupted'
fi
done