#java #amazon-web-services #autoscaling
#java #amazon-web-services #автоматическое масштабирование
Вопрос:
Я хочу вызвать экземпляр EC2 в определенное время, запустить пакетное задание java и закрыть экземпляр после завершения, используя Java. Я понял, как вызвать экземпляр и запустить свою работу. Нужно знать, как я могу отключить ее после выполнения задания. Выяснилось, что это возможно, изменив значение «setDesiredCapacity» для группы автоматического масштабирования на 0. этот метод принимает имя группы автоматического масштабирования в качестве входных данных. Но поскольку имя ASG создается динамически, не уверен, как я могу перенести его в свою работу Java. Есть предложения?
Ответ №1:
Похоже, что ваши требования:
- Регулярно запускайте экземпляр Amazon EC2, который будет выполнять пакетное задание
- По завершении задания завершите работу экземпляра EC2
Вместо использования автоматического масштабирования (которое предназначено для динамического масштабирования емкости в зависимости от спроса), я бы рекомендовал:
- Используйте расписание для запуска нового экземпляра EC2. Расписание может быть
cron
заданием на каком-либо компьютере (в EC2 или в любом месте Интернета), или вы можете использовать события Amazon CloudWatch для запуска лямбда-функции, которая запускает экземпляр. - По завершении пакетного задания завершите работу экземпляра, что можно сделать с помощью нескольких методов:
- Отправьте операционной системе команду на завершение работы. Если экземпляр EC2 запускается с завершением работы
terminate
, то экземпляр будет автоматически завершен. См.: Изменение поведения завершения работы, инициированного экземпляром - В качестве альтернативы, попросите ваше приложение выполнить
TerminateInstances
вызов API для AWS, чтобы напрямую завершить работу экземпляра.
- Отправьте операционной системе команду на завершение работы. Если экземпляр EC2 запускается с завершением работы
Или вы могли бы быть хорошими и современными и не использовать экземпляр Amazon EC2!
Поскольку ваше пакетное задание выполняется на Java, вы можете использовать лямбда-функцию вместе с расписанием событий CloudWatch. Расписание вызовет лямбда-функцию, которая может запускать ваш Java-код. Когда это будет завершено, Lambda автоматически завершится. Вам выставляется счет только за 100 мс использования.
Пожалуйста, обратите внимание, что лямбда-функции могут выполняться максимум 5 минут, поэтому, если ваша операция занимает больше времени, Lambda не является подходящим решением.
Комментарии:
1. спасибо за предложения. Лямбда не работает для меня из-за ограничения по времени, как вы упомянули.
2. С помощью TerminateInstances, хотя экземпляр будет завершен, не будет ли группа автоматического масштабирования снова запускать другой экземпляр, когда увидит, что их нет?
Ответ №2:
Вы можете использовать следующее-
- Правило события Cloudwatch в качестве планировщика. Целью будет лямбда в точке 2.
- Лямбда, чтобы изменить желаемую емкость группы автоматического масштабирования, вызвав «setDesiredCapacity» группы автоматического масштабирования.
- Чтобы закрыть экземпляры после завершения пакетного задания, пожалуйста, используйте AWS Java SDK в экземпляре EC2, чтобы снова изменить значение «setDesiredCapacity» на ноль.
Моменты, на которые следует обратить внимание
- Ваша минимальная емкость должна быть равна нулю, чтобы экземпляры были завершены.
- Выражение Cron правила события Cloudwatch должно учитывать время, затраченное EC2 на развертывание.
- Если вы не хотите, чтобы ваши запросы передавались через общедоступный Интернет, используйте конечные точки vpc для внутренней настройки трафика в вашем VPC.