自动closures并启动Amazon EC2实例

我可以使用Amazon API自动启动和终止我的Amazon实例吗? 你能描述一下如何做到这一点吗? 理想情况下,我需要每天以指定的时间间隔启动实例并停止实例。

为了防止有人在这个老问题上磕磕绊绊,现在可以通过向自动扩展组添加一个调度来实现同样的目的:在某些时候将自动扩展组中的实例数量增加到1,然后再减less到0 。

而且由于这个答案得到了很多的意见,我想链接到一个非常有用的指南: 在循环调度与Auto Scaling运行EC2实例

您可以尝试直接使用Amazon EC2 API工具。 实际上你只需要两个命令:ec2-start-instances和ec2-stop-instances。 确保EC2_HOME,AWS_CREDENTIAL_FILE,EC2_CERT,EC2_PRIVATE_KEY等环境variables已正确configuration,并且所有AWS证书,证书和私钥文件都位于适当的位置 – 您可以在AWS EC2 API工具文档中find更多信息。

您可以先手动testing命令,然后当一切正常时,在Windows上configurationUnix crontab或Scheduled Tasks。 您可以在Linux / etc / crontab文件中find下面的例子(不要忘记,上面提到的所有环境variables都需要用于“your-account”用户。

/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 pack stack

我build议你看看“ EC2入门指南” ,它向你展示了如何使用EC2命令行工具来完成你所需要的。 你可以很容易地将这个脚本编写成一个cron作业(在Linux / UNIX上)或Windows上的计划作业,以在给定的时间调用启动和停止命令。

如果你想从你自己的代码中做到这一点,你可以使用SOAP或REST API; 详细信息请参阅开发者指南 。

我用Python编写代码,使用Boto库来做到这一点。 你可以调整这个以供自己使用。 确保将其作为cron作业的一部分运行,然后在cron作业运行期间,您可以启动或closures尽可能多的实例。

 #!/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上运行,允许您创build多个每日/每周/每月的日程安排,并允许您使用匹配filter轻松地包含大量实例,或者包含将来添加的实例。

如果不是关键任务 – 一个简单的事情就是安排batch file每天凌晨3点运行“关机”(windows)。 那么至less你不会冒不小心让一个不需要的实例无限期运行的风险。

显然这只是故事的一半!

AWS Data Pipeline工作正常。 https://aws.amazon.com/premiumsupport/knowledge-center/stop-start-ec2-instances/

如果您希望从开始(例如周末)排除几天,请添加一个ShellCommandPrecondition对象。

在AWS Console / Data Pipeline中,创build一个新的pipe道。 编辑/导入定义(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 

在周末激活和运行pipe道时,AWS控制台pipe道健康状态会读取误导性的“错误”。 bash脚本返回一个错误(出口1),EC2未启动。 在第1天到第5天,状态是“健康”。

要在closures办公室时自动停止EC2,请每日使用AWS CLI命令的前提条件。

你可以看看Ylastic来做到这一点。 替代scheme似乎是有一台机器运行,closures/启动其他实例使用cron作业或计划的任务。

显然,如果你只想要一个实例,这是一个昂贵的解决scheme,因为一台机器必须一直运行,每台机器每月支付$ 80以运行cron作业是不经济的。

AutoScaling仅限于终止实例。 如果你想停止一个实例并保持服务器状态,那么外部脚本是最好的方法。

您可以通过在另一个全天候运行的实例上运行作业来完成此任务,或者您可以使用第三方服务,如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)); } 

恕我直言,为自动扩展组增加一个时间表是前面提到的最好的“像云一样”的方法。

但是,如果您不能终止您的实例并使用新的实例,例如,如果您有弹性IP关联等

您可以创build一个Ruby脚本来启动和停止基于date时间范围的实例。

 #!/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 Scheduler免费创build一个调度器。

我相信最初的问题有点混乱。 这取决于面食需要什么:1.启动/终止(实例存储) – Auto Scaling是正确的解决scheme(Nakedible的答案)2.启动/停止EBS启动实例 – Auto Scaling不会帮助,我使用远程调度脚本,ec2 CLI)。

尽pipe有办法通过自动缩放来实现这一点,但是它可能并不适合所有场合,因为它会终止实例。 Cron作业永远不会用于单个实例(尽pipe它可以完美地用于诸如在运行多个实例时停止单个实例和安排其他实例的情况)。 您可以使用StartInstancesRequest和StopInstancesRequest等API调用来实现相同的function,但是您必须依赖第三个资源。 有许多应用程序可以安排许多function的AWS实例,但对于一个简单的解决scheme,我会推荐一个免费的应用程序,如snapleaf.io

你不能自动做这个,或者至less不是没有脚本文件中的一些编程和API操作。 如果你想要一个可靠的解决scheme来停止,重新启动和pipe理你的图像(大概是为了控制你的环境的成本),那么你可能想看看LabSlice 。 免责声明:我为这家公司工作。