2010-03-09 112 views
84

我可以使用Amazon API自動啓動和終止我的Amazon實例嗎?你能否描述如何做到這一點?理想情況下,我需要每天以指定的時間間隔啓動實例並停止實例。自動關閉並啓動Amazon EC2實例

+2

EC2實例關閉時會發生什麼?它是否持續存在,或者您是否必須重新構建它? –

+0

使用Amazon API自動啓動和終止實例可能會導致該事件丟失數據。我建議使用[* AWS CloudWatch警報*]停止和恢復操作(http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/UsingAlarmActions.html) – hyip

+0

亞馬遜API istead,我會建議到[*使用AWS Lambda *計劃EC2開始/停止](http://stackoverflow.com/a/38371889/4058484),在您的情況下,它的成本低於$ 0.0004美元/月。 – hyip

回答

99

爲防萬一有人在這個老問題上磕磕絆絆,現在您可以通過向自動縮放組添加時間表來實現同樣的目的:在某些時間將自動縮放組中的實例數量增加到1,並減少它之後回到0。

而且因爲這個答案是獲得了很多的意見,我想鏈接到這個一個非常有用的指南:Running EC2 Instances on a Recurring Schedule with Auto Scaling

+3

這裏最好的芒。 –

+5

我嘗試了鏈接中描述的方法,它確實在本教程指定的時間開始/停止實例。但是,我注意到在AWS Web控制檯中,當通過此方法啓動實例時,它不會從一個鍵開始(這樣您就可以ssh進入它),而且它似乎也沒有與我一樣的東西安裝在我用作測試的微型實例上(我不是雲計算專家,但我認爲這意味着這個新啓動的實例沒有連接到EBS?)有沒有辦法自動啓動和按時間表停止* same *實例? –

+0

@KiranK。這是否意味着新實例未附加到當前使用的EBS捲上?你用了什麼? –

16

我建議你看看EC2 Getting Started Guide,它向你展示瞭如何使用EC2命令行工具來做你需要的。您可以輕鬆地將此腳本編寫到cron作業(在Linux/UNIX上)或Windows上的預定作業,以在給定時間調用啓動和停止命令。

如果您想從自己的代碼執行此操作,則可以使用SOAP或REST API;詳情請參閱Developer Guide

1

你可以看看Ylastic來做到這一點。另一種方法似乎是讓一臺機器運行,關閉/使用cron作業或計劃任務啓動其他實例。

顯然,如果您只想要一個實例,這是一個昂貴的解決方案,因爲一臺機器必須始終運行,並且每臺機器每月支付$ 80以運行cron作業不符合成本效益。

-8

你不能自動執行此操作,或者至少不能在腳本文件中沒有編程和API操作。如果你想要一個可靠的解決方案來停止,重新啓動和管理你的圖像(大概是爲了控制你的環境中的成本),那麼你可能想看看LabSlice。免責聲明:我爲這家公司工作。

3

如果它不是關鍵任務 - 一個簡單的事情就是安排批處理文件每天凌晨3點運行'SHUTDOWN'(windows)。那麼至少你不會冒着無意中讓一個不需要的實例無限期地運行的風險。

顯然這只是故事的一半!

24

您可以嘗試直接使用Amazon EC2 API工具。有 真的只有你需要的兩個命令:ec2-start-instances和ec2-stop-instances。 確保環境變量,如EC2_HOME, AWS_CREDENTIAL_FILE,EC2_CERT,EC2_PRIVATE_KEY等都是正確 配置和所有AWS證書,證書和私鑰文件 是在正確的位置 - 你可以找到AWS EC2 API 更多信息工具文檔。

您可以先手動測試命令,然後當一切正常時, 在Windows上配置Unix crontab或Scheduled Tasks。您可以在Linux/etc/crontab文件中找到下面的 示例(不要忘記所有 上述的環境變量都需要在 「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雲項目,在這裏我們打包 AWS工具(包括我提到的那些)在一個自由,易於使用的 安裝程序,你可能想嘗試開發者:BitNami CloudTools pack stack

+2

對於這仍然需要有另一個實例。因爲關機不是問題,而是啓動。克隆或任何東西在關閉後都不會在死機中運行。 –

+0

我遵循[這些步驟](http://docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/set-up-ec2-cli-linux.html#set-up-ec2-cli-tools-on- amazon-linux)在我的AMazon Linux實例上設置AWS CLI工具。 停止實例正常工作。但是,啓動一個已經停止的實例會導致400錯誤,找不到實例Id。我如何啓動已停止的實例? –

5

我所在的公司有客戶經常詢問有關這方面的工作,所以我們已經寫了一個免費的EC2調度可在這裏應用:

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

它可以在Windows和Mac上運行,可以創建多個每日/每週/每月的日程安排,並允許您使用匹配篩選器輕鬆包含大量實例,或者包含將來添加的實例。

15

我用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]) 
+0

這對於Elastic Beanstalk環境也可能嗎? –

0

我相信最初的問題有點混亂。這取決於麪食需要什麼: 1.啓動/終止(實例存儲) - Auto Scaling是正確的解決方案(Nakedible的答案) 2.啓動/停止EBS啓動實例 - Auto Scaling不會幫助,我使用遠程調度腳本(即,ec2 CLI)。

1

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)); 
     } 
1

IMHO添加日程到自動縮放團是最好的「雲狀」的方法如前所述。

但如果你不能終止您的實例,並使用新的,例如,如果你有相關的彈性IP地址等

您可以創建一個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 Scheduler調度。

1

即使有方法可以使用自動縮放來實現這一點,但它可能並不適合所有場合,因爲它會終止實例。Cron作業永遠不會用於單個實例(儘管它可以完美地用於諸如在運行多個實例時停止單個實例和調度其他實例的情況)。您可以使用像StartInstancesRequestStopInstancesRequest這樣的API調用來實現相同的功能,但您必須依靠第三個資源。有許多應用程序可以安排具有許多功能的AWS實例,但對於簡單的解決方案,我會推薦免費的應用程序,如snapleaf.io

2

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

如果您希望排除開始(例如週末)的日子,請添加一個ShellCommandPrecondition對象。

在AWS控制檯/數據管道中,創建一個新管道。這是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命令,而不要使用前提條件。

相關問題