Автоматическое выключение и запуск инстанса Amazon EC2


могу ли я автоматически запускать и завершать свой экземпляр Amazon с помощью Amazon API? Не могли бы вы описать, как это можно сделать? В идеале мне нужно запускать экземпляр и останавливать экземпляр через определенные промежутки времени каждый день.

13 86

13 ответов:

на всякий случай, если кто-то наткнется на этот старый вопрос, в настоящее время вы можете добиться того же, добавив расписание в группу автоматического масштабирования: увеличьте количество экземпляров в группе автоматического масштабирования до 1 в определенное время и уменьшите его до 0 впоследствии.

и поскольку этот ответ получает много просмотров, я подумал, что ссылка на очень полезное руководство об этом:запуск экземпляров EC2 по повторяющемуся расписанию с автоматическим масштабированием

вы можете попробовать использовать инструменты API Amazon EC2 напрямую. Есть на самом деле вам нужны только две команды: ec2-start-instances и ec2-stop-instances. Убедитесь, что переменные среды, такие как EC2_HOME, AWS_CREDENTIAL_FILE, EC2_CERT, EC2_PRIVATE_KEY и др. правильно настроенные и все учетные данные AWS, сертификаты и файлы закрытых ключей находятся в правильном месте - вы можете найти дополнительную информацию в API AWS EC2 документация по инструментам.

вы можете проверить команду вручную, а затем, когда все работает нормально, настройка Unix crontab или запланированных задач в Windows. Вы можете найти пример ниже для файла Linux / etc / crontab (не забывайте, что все эти переменные среды, упомянутые выше, должны присутствовать на вашего аккаунта пользователя.

/etc/crontab
0 8     * * *   your-account ec2-start-instances <your_instance_id>
0 16    * * *   your-account ec2-stop-instances <your_instance_id>
# Your instance will be started at 8am and shutdown at 4pm.

Я разработчик для проекта BitNami Cloud, где мы упаковываем Инструменты AWS (включая те, которые я упомянул) в бесплатном, простом в использовании установщик, который вы можете попробовать: BitNami CloudTools упаковка стек

Я рекомендую вам взглянуть на EC2 руководство по началу работы, который показывает вам, как сделать то, что вам нужно, используя инструменты командной строки EC2. Вы можете легко записать это в задание cron (в Linux / UNIX) или запланированное задание в Windows для вызова команд start и stop в заданное время.

Если вы хотите сделать это из своего собственного кода, Вы можете использовать API SOAP или REST; см. Руководство Для Разработчиков для сведения.

Я написал код на Python, используя библиотеку Boto, чтобы сделать это. Вы можете настроить это для вашего собственного использования. Убедитесь, что это выполняется как часть задания cron, а затем вы сможете запускать или выключать столько экземпляров, сколько вам нужно во время выполнения заданий cron.

#!/usr/bin/python
#
# Auto-start and stop EC2 instances
#
import boto, datetime, sys
from time import gmtime, strftime, sleep

# AWS credentials
aws_key = "AKIAxxx"
aws_secret = "abcd"

# The instances that we want to auto-start/stop
instances = [
    # You can have tuples in this format:
    # [instance-id, name/description, startHour, stopHour, ipAddress]
    ["i-12345678", "Description", "00", "12", "1.2.3.4"]
]

# --------------------------------------------

# If its the weekend, then quit
# If you don't care about the weekend, remove these three 
# lines of code below.
weekday = datetime.datetime.today().weekday()
if (weekday == 5) or (weekday == 6):
    sys.exit()

# Connect to EC2
conn = boto.connect_ec2(aws_key, aws_secret)

# Get current hour
hh = strftime("%H", gmtime())

# For each instance
for (instance, description, start, stop, ip) in instances:
    # If this is the hour of starting it...
    if (hh == start):
        # Start the instance
        conn.start_instances(instance_ids=[instance])
        # Sleep for a few seconds to ensure starting
        sleep(10)
        # Associate the Elastic IP with instance
        if ip:
            conn.associate_address(instance, ip)
    # If this is the hour of stopping it...
    if (hh == stop):
        # Stop the instance
        conn.stop_instances(instance_ids=[instance])

компания, в которой я работаю, регулярно спрашивала клиентов об этом, поэтому мы написали бесплатное приложение для планирования EC2, доступное здесь:

http://blog.simple-help.com/2012/03/free-ec2-scheduler/

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

Если это не критически важно-упрощенная вещь, чтобы сделать, чтобы запланировать пакетный файл для запуска "SHUTDOWN" (windows) в 3 утра каждый день. Тогда, по крайней мере, вы не рискуете случайно оставить нежелательный экземпляр запущенным на неопределенный срок.

очевидно, что это только половина истории!

AWS Data Pipeline работает нормально. https://aws.amazon.com/premiumsupport/knowledge-center/stop-start-ec2-instances/

Если вы хотите исключить дни от начала (например, выходные) добавить объект ShellCommandPrecondition.

в AWS Console/Data Pipeline создайте новый конвейер. Это easyer, чтобы редактировать/импортировать четкости (в формате JSON)

    {
"objects": [
{
  "failureAndRerunMode": "CASCADE",
  "schedule": {
    "ref": "DefaultSchedule"
  },
  "resourceRole": "DataPipelineDefaultResourceRole",
  "role": "DataPipelineDefaultRole",
  "pipelineLogUri": "s3://MY_BUCKET/log/",
  "scheduleType": "cron",
  "name": "Default",
  "id": "Default"
},
{
  "name": "CliActivity",
  "id": "CliActivity",
  "runsOn": {
    "ref": "Ec2Instance"
  },
  "precondition": {
    "ref": "PreconditionDow"
  },
  "type": "ShellCommandActivity",
  "command": "(sudo yum -y update aws-cli) && (#{myAWSCLICmd})"
},
{
  "period": "1 days",
  "startDateTime": "2015-10-27T13:00:00",
  "name": "Every 1 day",
  "id": "DefaultSchedule",
  "type": "Schedule"
},
{
  "scriptUri": "s3://MY_BUCKET/script/dow.sh",
  "name": "DayOfWeekPrecondition",
  "id": "PreconditionDow",
  "type": "ShellCommandPrecondition"
},
{
  "instanceType": "t1.micro",
  "name": "Ec2Instance",
  "id": "Ec2Instance",
  "type": "Ec2Resource",
  "terminateAfter": "50 Minutes"
}
],
"parameters": [
{
  "watermark": "aws [options] <command> <subcommand> [parameters]",
  "description": "AWS CLI command",
  "id": "myAWSCLICmd",
  "type": "String"
}
 ],
"values": {
"myAWSCLICmd": "aws ec2 start-instances --instance-ids i-12345678 --region eu-west-1"
}
}

поместите сценарий Bash для загрузки и выполнения в качестве предварительного условия в вашем S3 ведро

#!/bin/sh
if [ "$(date +%u)" -lt 6 ]
then exit 0
else exit 1
fi

при активации и запуске конвейера в выходные дни состояние работоспособности конвейера консоли AWS считывает вводящую в заблуждение "ошибку". Сценарий bash возвращает ошибку (выход 1) и EC2 не запускается. В дни с 1 по 5, статус "ЗДОРОВ".

чтобы автоматически остановить EC2 при закрытии офиса, используйте команду AWS CLI daily wihtout предварительное условие.

вы могли бы посмотреть на Ylastic для этого. Альтернативой, по-видимому, является запуск одной машины, которая завершает работу/запускает другие экземпляры с помощью задания cron или запланированной задачи.

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

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

вы можете сделать это, запустив задание на другом экземпляре, который работает 24/7, или вы можете использовать стороннюю службу, такую как Ylastic (упомянутый выше) или Rocket Peak.

например, в C# код для остановки сервера довольно прост:

public void stopInstance(string instance_id, string AWSRegion)
        {
            RegionEndpoint myAWSRegion = RegionEndpoint.GetBySystemName(AWSRegion);
            AmazonEC2 ec2 = AWSClientFactory.CreateAmazonEC2Client(AWSAccessKey, AWSSecretKey, myAWSRegion);
            ec2.StopInstances(new StopInstancesRequest().WithInstanceId(instance_id));
        }

IMHO добавление расписания в группу автоматического масштабирования является лучшим" облачным " подходом, как упоминалось ранее.

но в случае, если вы не можете завершить свои экземпляры и использовать новые, например, если у вас есть эластичные IP-адреса, связанные с etc.

вы можете создать скрипт Ruby для запуска и остановки ваших экземпляров на основе диапазона времени даты.

#!/usr/bin/env ruby

# based on https://github.com/phstc/amazon_start_stop

require 'fog'
require 'tzinfo'

START_HOUR = 6 # Start 6AM
STOP_HOUR  = 0 # Stop  0AM (midnight)

conn = Fog::Compute::AWS.new(aws_access_key_id:     ENV['AWS_ACCESS_KEY_ID'],
                             aws_secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'])

server = conn.servers.get('instance-id')

tz = TZInfo::Timezone.get('America/Sao_Paulo')

now = tz.now

stopped_range = (now.hour >= STOP_HOUR && now.hour < START_HOUR)
running_range = !stopped_range

if stopped_range && server.state != 'stopped'
  server.stop
end

if running_range && server.state != 'running'
  server.start

  # if you need an Elastic IP
  # (everytime you stop an instance Amazon dissociates Elastic IPs)
  #
  # server.wait_for { state == 'running' }
  # conn.associate_address server.id, 127.0.0.0
end

посмотреть amazon_start_stop чтобы создать планировщик бесплатно с помощью Heroku Планировщик.

несмотря на то, что есть способы добиться этого с помощью автоматического масштабирования, он может не подходить для всех случаев, когда он завершает экземпляры. Задания Cron никогда не будут работать для одного экземпляра (хотя его можно отлично использовать для таких ситуаций, как остановка одного экземпляра и планирование других экземпляров при запуске многих экземпляров). Вы можете использовать вызовы API, такие как StartInstancesRequest и StopInstancesRequest чтобы достичь того же, но снова вы должны полагаться на a третий ресурс. Есть много приложений для планирования экземпляров AWS со многими функциями, но для простого решения я бы рекомендовал бесплатное приложение, такое какsnapleaf.io

Я считаю, что первоначальный вопрос был немного запутанным. Это зависит от того, какая паста нужна: 1.launch / terminate ( instance store) - автоматическое масштабирование является правильным решением( ответ Nakedible) 2.запуск / остановка экземпляра загрузки EBS-автоматическое масштабирование не поможет, я использую удаленные запланированные сценарии (т. е. EC2 CLI).

вы не можете сделать это автоматически или, по крайней мере, не без некоторых программ и манипуляций API в файлах сценариев. Если вы хотите надежное решение для остановки, перезапуска и управления изображениями (предположительно для контроля затрат в вашей среде), то вы можете посмотреть на LabSlice. Отказ от ответственности: я работаю в этой компании.