快速部署 Spot 实例并配置中断邮件警告

sam 2022年01月25日 557次浏览

  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实例活动通知:

image.png
image.png
image.png

2.2 配置Cloudwatch Events发布SNS

image.png
image.png

  • 接受指定的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实例等多种场景。
image.png

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