Как остановить / запустить экземпляр EC2 по расписанию в группе автомасштабирования, не завершая работу экземпляра?

Если у вас есть группа автомасштабирования, как вы запускаете / останавливаете экземпляры (не запускаете / завершаете)? Поведение по умолчанию предназначено только для запуска и завершения экземпляров, но поскольку мы также получаем экономию средств за просто остановку экземпляра, мы бы предпочли позволить экземпляру сохраняться.

Для наших целей у нас есть среда контроля качества, и мы хотим запускать / останавливать несколько групп автомасштабирования ежедневно, чтобы сэкономить деньги, когда команда разработчиков покидает офис по вечерам и в выходные дни.

Итак, как этого добиться?

ПРИМЕЧАНИЕ.

Вскоре я дам свой собственный подробный ответ.


person sonjz    schedule 22.08.2014    source источник
comment
Я бы предположил, что было бы разумно реализовать их приложение так, чтобы завершение работы и получение нового экземпляра с нуля не было проблематичным для работы системы.   -  person Mike Brant    schedule 23.08.2014
comment
Согласованный. Но иногда в тестовой среде вы хотите поддерживать состояние экземпляра, так как разработчики запускают на нем тесты, создаются журналы, и в моем случае я немного ленив и не хочу писать сценарий вторичного Присоединение ENI в настоящее время для экземпляров, живущих в моих группах AS.   -  person sonjz    schedule 23.08.2014
comment
Я на шаг впереди, и у меня проблемы, пожалуйста, взгляните на мой вопрос инстансы AWS Autoscaling Group EC2 отключаются во время выполнения заданий cron   -  person Yevgeniy Afanasyev    schedule 23.02.2021


Ответы (2)


Прежде всего, группа автомасштабирования 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

Вы можете запустить свой скрипт, используя AWS Data Pipeline.
Используйте этот сценарий для получения идентификатора экземпляра, а также зоны доступности, региона и т. д.

Выберите Create New Pipeline и введите следующую информацию:

Name: for example, "Start EC2 instances" and "Stop EC2 instances".
Description: Provide relevant details about the pipeline as needed.
Source: Choose Build using template and choose the template Run AWS CLI command.
AWS CLI command: This is where you put your script to specify what the pipeline does.

Настройте каждый конвейер с соответствующей информацией планирования.

Run: Choose on activation to run the pipeline as an on-demand pipeline.  
Run every: Enter a period for every pipeline run.
Starting: Enter a time and date for the pipeline to start.
Ending: Enter a time and date for the pipeline to end.

Установите следующие параметры для реализации соответствующего безопасного доступа:

IAM Roles: Choose Custom
Pipeline Role: DataPipelineDefaultRole
EC2 Instance Role: DataPipelineDefaultResourceRole

Обратите внимание, что конвейер данных создает необходимые роли IAM. для вас.
Для получения дополнительной информации см. AWS Цены на конвейер данных.

См. Также другой вариант использования AWS Lambda.

person Chetabahana    schedule 07.07.2016