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.
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
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
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.
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])
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.
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!
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.
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.
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));
}
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.
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
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).
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.