Подготовка

Подготовка

Я хочу поддерживать постоянное количество работоспособных экземпляров. Но иногда приложение будет глючить, его уровень использования ресурсов станет настолько низким, что его можно будет определить только по метрикам 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 для определения метрик потребления ресурсов, а затем соответствующим образом устанавливает работоспособность экземпляра, как предлагаетТим:

Подготовка

  1. Если вы этого еще не сделали,установить интерфейс командной строки AWS. Также доступно через yumили apt.
  2. Настройте 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

Остальные

  1. Заставьте скрипт запускаться периодически
$ 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
  1. Выключите экземпляр и создайте AMI. После этого создайте новую группу автоматического масштабирования с AMI. Теперь она должна завершиться и запустить новую, если метрика не удовлетворяет состоянию работоспособности. Вуаля!

Использованная литература:

[1]:Метаданные экземпляра EC2

[2]:Получить текущий регион в AWS - StackOverflow

[3]:CloudWatch - получить-метрическую-статистику

Связанный контент