
Я хочу поддерживать постоянное количество работоспособных экземпляров. Но иногда приложение будет глючить, его уровень использования ресурсов станет настолько низким, что его можно будет определить только по метрикам CloudWatch. Тогда, конечно, я хочу, чтобы эти экземпляры заменялись автоматически. Но я не могу найти, как это сделать. Самое близкое, что я могу придумать, это автоматическое масштабирование, но согласноПолитика прекращения действия по умолчанию, все эти варианты, похоже, не имеют никакого отношения к метрике конкретного экземпляра.
Я создал AMI, который готов к запуску. Единственное, что мне нужно, это сделать так, чтобы он автоматически завершал нездоровый экземпляр и заменял его новым. Так как мне это сделать? Любая помощь будет оценена по достоинству.
решение1
Проверки работоспособности пользовательских экземпляров(внизу страницы) — один из вариантов.
У вас будет отдельный фрагмент кода, работающий на машине (или на любой другой машине), который отслеживает работоспособность и запускает вызов API, который переводит экземпляр в неработоспособное состояние.
У меня есть еще одна наполовину сформированная идея, но я не совсем уверен, как ее реализовать. Я был архитектором локальной системы, где у нас был балансировщик нагрузки, вызываемый на отдельный веб-сервер на экземпляре, в нашем случае это был крошечный пользовательский веб-сервер Java, около 50 строк кода. Он возвращал коды статуса HTTP, 200 (OK), если все идет нормально, или 500 (ERROR), если его нужно завершить. Я подозреваю, что что-то подобное можно интегрировать с автоматическим масштабированием, но я давно этого не делал и не уверен, как это можно интегрировать с автоматическим масштабированием.
Вот команда из первой идеи выше
aws autoscaling set-instance-health --instance-id i-123abc45d --health-status Unhealthy
решение2
Для тех, кто столкнется с этим вопросом:
Хотя я считаю, что AWS должна была включить такую функцию в CloudWatch, к сожалению, я не могу найти никакой информации, которая бы указывала на ее доступность. Поэтому я создал скрипт bash, который запрашивает API CloudWatch для определения метрик потребления ресурсов, а затем соответствующим образом устанавливает работоспособность экземпляра, как предлагаетТим:
Подготовка
- Если вы этого еще не сделали,установить интерфейс командной строки AWS. Также доступно через
yum
илиapt
. - Настройте AWS CLIзапустив
aws configure
, заполните свой ключ API и другие настройки.Важный: если вы собираетесь запустить скрипт ниже как root, как я, вам придется запустить эту команду конфигурации как root. В противном случае скрипт не будет работать.
/root/my-health-check.sh
#!/bin/bash
# retrieve metrics starting from 20 minutes ago (3 data points)
# Note: Sometimes CloudWatch failed to gather data for a specific period,
# then the number of data points returned could be less than what we expect.
# Also, when the instance just started, there will be no data point.
start_time=$(date -d "-20 minutes" -u +"%Y-%m-%dT%H:%M:%SZ")
# retrieve metrics up to now
end_time=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
# get current instance ID [1]
instance_id=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
# get current region [2]
# This is only needed if you have multiple regions to manage, otherwise just
# specify a region via `aws configure`.
region=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/\(.*\)[a-z]/\1/')
# save data retrieved for processing [3]
# Here I used an example of retrieving "NetworkIn" of "AWS/EC2" namespace,
# with metric resolution set to 300 (5 minutes).
# For a list of available metrics, run `aws cloudwatch list-metrics`
datapoints=$(aws cloudwatch get-metric-statistics --namespace AWS/EC2 --metric-name NetworkIn --dimensions Name=InstanceId,Value=$instance_id --statistics Average --start-time $start_time --end-time $end_time --period 300 --region $region --output text | awk '{ print $2 }')
# custom handler
# In this example, the health check will fail if all data points fall below
# my threshold. The health check will not fail if there is no data.
healthy=0
hasdata=0
THRESHOLD=300000
for i in $datapoints; do
# In this case, the metric(NetworkIn) is not integer.
if (( $(echo "$i $THRESHOLD" | awk '{print ($1 > $2)}') )); then
healthy=1
fi
hasdata=1
done
if [ $hasdata -eq 1 ]; then
if [ $healthy -eq 0 ]; then
aws autoscaling set-instance-health --instance-id $instance_id --health-status Unhealthy --region $region
fi
fi
Остальные
- Заставьте скрипт запускаться периодически
$ chmod +x /root/my-health-check.sh
# run the script at 0, 5, 10, 15 ... 55 of every hour
$ echo "*/5 * * * * root /root/my-health-check.sh 2>&1 | /usr/bin/logger -t ec2_health_check" >> /etc/crontab
- Выключите экземпляр и создайте AMI. После этого создайте новую группу автоматического масштабирования с AMI. Теперь она должна завершиться и запустить новую, если метрика не удовлетворяет состоянию работоспособности. Вуаля!