Прежде всего, группа автомасштабирования AWS - это контейнер для нескольких экземпляров, основанных на конфигурации запуска. Если мы сможем отключить процессы, запускающие масштабирование вверх / вниз, мы вернемся к контейнеру, который просто содержит экземпляры.
Чтобы отключить эти процессы, нам нужно использовать suspend-processes
из AWS-CLI. В этом примере я буду использовать powershell
, но его так же легко написать на bash
:
# suspend HealthCheck and ReplaceUnhealthy processes, you may find another combination works better for you.
$asGroup = "nameOfYourAutoScalingGroup" ;
aws autoscaling suspend-processes `
--auto-scaling-group-name $asGroup `
--scaling-processes HealthCheck ReplaceUnhealthy ;
# verify the change
awsp autoscaling describe-auto-scaling-groups `
--auto-scaling-group-name $asGroup ;
Для моих целей я хотел, чтобы инстансы были в сети с 7:00 до 19:00, чтобы сократить расходы. Эти экземпляры используются нашими командами разработчиков и QA, и они предпочитают поддерживать состояние сервера изо дня в день.
ПРИМЕЧАНИЕ. в случае, если экземпляр EC2 поврежден или случайно остановлен, наша команда может выполнить откат до последней версии AMI (на самом деле они просто хотят, чтобы журналы сохранялись, но если они будут потеряны, это это не конец света)
Далее нам потребуется сценарий для запуска / остановки серверов, здесь у меня это 2 сценария, но вы можете легко оптимизировать его в один сценарий и передать аргумент в:
# in our case, we want to perform this to all autoscaling groups
# you'll need Powershell 3.0+ in order to use ConvertFrom-Json
$asGroups = aws autoscaling describe-auto-scaling-groups --query 'AutoScalingGroups[*].{Name:AutoScalingGroupName,Instances:Instances[*].InstanceId}' ;
$asGroups = "{ asGroups: $asGroups }" | ConvertFrom-Json ;
# foreach autoscaling group, go through each instance and start
foreach ($asGroup in $($asGroups.asGroups)) {
echo "AS: $($asGroup.Name)" ;
foreach ($instance in $asGroup.instances) {
echo "starting instance: $instance";
aws ec2 start-instances `
--instance-ids $instance ;
}
}
# in our case, we want to perform this to all autoscaling groups
# you'll need Powershell 3.0+ in order to use ConvertFrom-Json
$asGroups = awsp autoscaling describe-auto-scaling-groups --query 'AutoScalingGroups[*].{Name:AutoScalingGroupName,Instances:Instances[*].InstanceId}' ;
$asGroups = "{ asGroups: $asGroups }" | ConvertFrom-Json ;
# foreach autoscaling group, go through each instance and stop
foreach ($asGroup in $($asGroups.asGroups)) {
echo "AS: $($asGroup.Name)" ;
foreach ($instance in $asGroup.instances) {
echo "stopping instance: $instance";
awsp ec2 stop-instances `
--instance-ids $instance ;
}
}
Последним шагом было бы добавить его в список запланированных задач на сервере управления (в настоящее время я просто использую свой рабочий стол, который никогда не выключается). Прилагается пример экспортированной задачи расписания, которая запускается еженедельно в понедельник, вторник, среду, четверг, пятницу в 7:00.
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Date>2014-08-22T13:13:02.2103946</Date>
<Author>localhost\Administrator</Author>
</RegistrationInfo>
<Triggers>
<CalendarTrigger>
<StartBoundary>2014-08-22T07:00:00</StartBoundary>
<Enabled>true</Enabled>
<ScheduleByWeek>
<DaysOfWeek>
<Monday />
<Tuesday />
<Wednesday />
<Thursday />
<Friday />
</DaysOfWeek>
<WeeksInterval>1</WeeksInterval>
</ScheduleByWeek>
</CalendarTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<UserId>localhost\Administrator</UserId>
<LogonType>InteractiveToken</LogonType>
<RunLevel>LeastPrivilege</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>false</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>true</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>P3D</ExecutionTimeLimit>
<Priority>7</Priority>
</Settings>
<Actions Context="Author">
<Exec>
<Command>C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe</Command>
<Arguments>-ExecutionPolicy ByPass c:\tasks\AWS-Autoscaling-EC2-Start-Morning.ps1</Arguments>
<WorkingDirectory>c:\tasks</WorkingDirectory>
</Exec>
</Actions>
</Task>
Вам нужно будет сделать «Stop» версию этой задачи, чтобы останавливать серверы в 19:00. Просто измените начальную границу на <StartBoundary>2014-08-22T19:00:00</StartBoundary>
и обновите <Arguments>-ExecutionPolicy ByPass c:\tasks\AWS-Autoscaling-EC2-Start-Morning.ps1</Arguments>
до правильного ps1
.
person
sonjz
schedule
25.08.2014