Arrêt automatique et démarrage de L'Instance Amazon EC2

Puis-je démarrer et terminer automatiquement mon instance Amazon à l'aide de L'API Amazon? Pouvez-vous décrire comment cela peut être fait? Idéalement, j'ai besoin de démarrer l'instance et d'arrêter l'instance à des intervalles de temps spécifiés tous les jours.

86
demandé sur Pasta 2010-03-10 01:21:38

13 réponses

Juste au cas où quelqu'un trébuche sur cette vieille question, de nos jours, vous pouvez réaliser la même chose en ajoutant une planification à un groupe de mise à l'échelle automatique: augmentez la quantité d'instances dans un groupe de mise à l'échelle automatique à 1 à certains moments et ramenez-le à 0 par la suite.

Et puisque cette réponse reçoit beaucoup de vues, j'ai pensé à créer un lien vers un guide très utile à ce sujet: exécution D'Instances EC2 sur un calendrier récurrent avec mise à L'échelle automatique

100
répondu Nakedible 2013-05-05 07:23:05

Vous pouvez essayer d'utiliser directement les outils de L'API Amazon EC2. Il y a vraiment seulement deux commandes dont vous avez besoin: ec2-start-instances et ec2-stop-instances. Assurez-vous que les variables d'environnement telles que EC2_HOME, AWS_CREDENTIAL_FILE, EC2_CERT, EC2_PRIVATE_KEY, etc. sont correctement configuré et tous les fichiers D'informations D'identification, de certificat et de clé privée AWS vous pouvez trouver plus d'informations dans L'API AWS EC2 outils de documentation.

, Vous pouvez tester la commande à main d'abord, puis, quand tout fonctionne bien, configurez Unix crontab ou les tâches planifiées sous Windows. Vous pouvez trouver l' exemple ci-dessous pour le fichier Linux /etc/crontab (n'oubliez pas que tout ces variables d'environnement mentionnées ci-dessus doivent être présentes pour 'votre compte' utilisateur.

/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.

Je suis un développeur pour le projet BitNami Cloud, où nous emballons le AWS tools (y compris ceux que j'ai mentionnés) dans un logiciel gratuit et facile à utiliser installateur que vous pouvez essayer: BitNami CloudTools pack pile

25
répondu danoo 2011-08-04 22:26:58

Je vous recommande de jeter un oeil au EC2 Guide de démarrage, qui vous montre comment faire ce dont vous avez besoin en utilisant les outils de ligne de commande EC2. Vous pouvez facilement écrire ceci dans un travail cron (sous Linux / UNIX) ou un travail planifié sur Windows pour appeler les commandes start et stop à un moment donné.

Si vous voulez le faire à partir de votre propre code, vous pouvez utiliser les API SOAP ou REST; consultez le Guide du développeur pour plus de détails.

17
répondu gareth_bowles 2010-03-09 23:50:28

J'ai écrit du code en Python, en utilisant la bibliothèque Boto, pour ce faire. Vous pouvez ajuster cela pour votre propre usage. Assurez-vous de l'exécuter dans le cadre d'un travail cron, puis vous pourrez démarrer ou arrêter autant d'instances que nécessaire pendant l'exécution des travaux 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])
15
répondu Suman 2013-03-28 21:25:23

La société pour laquelle je travaille avait des clients demandant régulièrement à ce sujet, donc nous avons écrit un freeware EC2 scheduling app disponible ici:

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

Il fonctionne sur Windows et Mac, vous permet de créer plusieurs horaires quotidiens / hebdomadaires / mensuels et vous permet d'utiliser des filtres correspondants pour inclure un grand nombre d'instances facilement ou inclut ceux que vous ajoutez à l'avenir.

5
répondu AntonyM 2012-03-23 10:04:14

Si ce n'est pas Critique - une chose simpliste à faire est de planifier le fichier batch pour exécuter 'SHUTDOWN' (windows) à 3h du matin tous les jours. Ensuite, au moins vous ne courez pas le risque de laisser accidentellement une instance indésirable en cours d'exécution indéfiniment.

Évidemment, ce n'est que la moitié de l'histoire!

3
répondu AndyM 2011-08-01 10:41:25

Le Pipeline de données AWS fonctionne correctement. https://aws.amazon.com/premiumsupport/knowledge-center/stop-start-ec2-instances/

Si vous souhaitez exclure days du démarrage (par exemple weekend), ajoutez un objet ShellCommandPrecondition.

Dans AWS Console / Data Pipeline, créez un nouveau pipeline. Il est plus facile d'éditer / importer une définition (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"
}
}

Mettez le script Bash à télécharger et à exécuter en tant que condition préalable dans votre compartiment S3

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

Lors de l'activation et de l'exécution pipeline les jours de week-end, L'État de santé du Pipeline de la console AWS indique une "erreur"trompeuse. Le script bash renvoie une erreur (exit 1) et EC2 n'est pas démarré. Les jours 1 à 5, le statut est "sain".

Pour arrêter EC2 automatiquement à la fermeture du bureau, utilisez la commande AWS CLI quotidiennement sans condition préalable.

2
répondu user3526918 2015-10-29 15:02:13

Vous pourriez regarder Ylastic pour ce faire. L'alternative semble être d'avoir une machine en cours d'exécution qui arrête / démarre d'autres instances en utilisant un travail cron ou une tâche planifiée.

Évidemment, si vous ne voulez qu'une seule instance, c'est une solution coûteuse, car une machine doit toujours fonctionner, et payer ~80$par mois pour qu'une machine exécute des tâches cron n'est pas rentable.

1
répondu Chris S 2010-04-10 15:53:38

L'AutoScaling est limité aux instances de terminaison. Si vous voulez arrêter une instance et conserver l'état du serveur, un script externe est la meilleure approche.

Vous pouvez le faire en exécutant un travail sur une autre instance qui s'exécute 24/7 ou vous pouvez utiliser un service tiers tel que Ylastic (mentionné ci-dessus) ou Rocket Peak.

Par exemple en C# le code pour arrêter un serveur est assez simple:

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));
        }
1
répondu MrGreggs 2013-11-26 20:16:17

IMHO l'ajout d'un calendrier à un groupe de mise à l'échelle automatique est la meilleure approche "cloud like" comme mentionné précédemment.

Mais dans le cas où vous ne pouvez pas terminer vos instances et en utiliser de nouvelles, par exemple si vous avez des adresses IP élastiques associées à etc.

Vous pouvez créer un script Ruby pour démarrer et arrêter vos instances en fonction d'une plage de dates et d'heures.

#!/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

Regardez amazon_start_stop pour créer un planificateur pour la libre à l'aide de Heroku Planificateur de.

1
répondu Pablo Cantero 2014-01-08 19:12:09

Même s'il existe des moyens d'y parvenir en utilisant la mise à l'échelle automatique, il peut ne pas convenir à toutes les occasions car il termine les instances. Les travaux Cron ne fonctionneront jamais pour une seule instance (bien qu'ils puissent parfaitement être utilisés pour des situations telles que l'arrêt d'une seule instance et la planification d'autres instances lors de l'exécution de nombreuses instances). Vous pouvez utiliser des appels D'API comme StartInstancesRequest , et StopInstancesRequest pour obtenir la même chose, mais encore une fois, vous devez compter sur un troisième ressources. Il existe de nombreuses applications à l'annexe AWS cas avec de nombreuses fonctionnalités, mais pour une solution simple, je recommanderais une application gratuite comme snapleaf.io

1
répondu Upul Doluweera 2014-03-19 13:02:41

Je crois que la question initiale était un peu déroutante. Cela dépend de ce dont les pâtes ont besoin: 1.lancer / terminer (magasin d'instance) - la mise à L'échelle automatique est la bonne solution( réponse de Nakedible) 2.démarrer / arrêter l'instance de démarrage EBS-la mise à l'échelle automatique n'aidera pas, j'utilise des scripts programmés à distance (c'est-à-dire, EC2 CLI).

0
répondu lk7777 2013-11-26 14:17:48

Vous ne pouvez pas le faire automatiquement, ou du moins pas sans une certaine programmation et manipulation de L'API dans les fichiers de script. Si vous voulez une solution fiable pour arrêter, redémarrer et gérer vos images (probablement pour contrôler les coûts dans votre environnement), vous pouvez regarder LabSlice. Avertissement: je travaille pour cette entreprise.

-8
répondu Simon at LabSlice-com 2010-11-15 21:16:45