2012-10-25 118 views
2

在啓動實例時是否可以傳遞腳本?因此,實例將在初始化後執行該腳本?在Amazon EC2中啓動實例時傳遞腳本

public static void startInstance(final String instanceId) { 
    StartInstancesRequest startRequest = new StartInstancesRequest().withInstanceIds(instanceId); 
    logger.info(String.format("Starting instance '%s':...", instanceId)); 
    ec2.startInstances(startRequest);  
} 

有什麼想法嗎?腳本將是一種啓動腳本,只要實例準備就緒,我需要執行它。提前致謝。

回答

5

我介紹的社區Ubuntu的AMI的用戶數據腳本的概念在2009年(從RightScale的一些想法簡化版本):

http://alestic.com/2009/06/ec2-user-data-scripts

它歸結爲:

如果實例用戶數據以兩個字符開頭#!然後實例在第一次啓動時以root用戶身份運行它。

此功能後來被包含在Ubuntu官方的AMI在CloudInit包:

https://help.ubuntu.com/community/CloudInit

亞馬遜現在包括CloudInit包在自己的亞馬遜的Linux的AMI:

http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/AmazonLinuxAMIBasics.html

其他發行版歡迎(並且可能已經)在AMI中包含此功能。

+0

我一直在Ubuntu規範映像中使用雲初始化包。它通常效果很好,但是我已經看到了一些極少數情況,腳本因爲某些原因而不執行,因此當您的應用程序首次開始運行時,您可能需要進行理智檢查以確保您希望運行的腳本實際執行。例如,我有我的心跳腳本由彈性負載均衡器檢查我的系統上的某些數據,這些數據只會在啓動腳本中填充,然後才能將ELB健康狀況檢查返回200響應。 –

+0

太棒了!非常感謝Eric&Mike ... 還有一個問題,在快速搜索後發現,如果我們想通過AWS SDK來實現RunInstances,那麼方法就是這樣。現在問題是,RunInstances和StartInstances之間有什麼區別?再次感謝 – dreamer

+0

@tanzir:在EC2上,「run」創建一個新的實例,「start」接受一個已經停止的實例並重新運行。 –

0

您可以使用Userdata將腳本傳遞到新的EC2實例,但我不知道您是否可以啓動預先存在的實例並傳遞它的數據。

我有一個預先配置好的AMI,它有一個腳本保存在根驅動器上,這個腳本用於配置服務器並下載最新的源代碼。

所以,你的請求可能如下所示:

VAR runInstance =新RunInstancesRequest();

 runInstance.WithImageId("{ami-id}") 
      .WithInstanceType("{size}") 
      .WithMaxCount(1) 
      .WithMinCount(1) 
      .WithSecurityGroup("{the security group}") 
      .WithKeyName("{your key}") 
      .WithUserData(Convert.ToBase64String(Encoding.ASCII.GetBytes(userData))); 

     ec2.RunInstances(runInstance); 

用戶數據可以包含對腳本或腳本本身的引用。

+0

可以在實例停止時更改實例的用戶數據,但當實例再次啓動時,CloudInit軟件將不會運行它。用戶數據腳本僅在實例的第一次啓動時運行。 –

+0

因此,如果我們想在每次啓動實例時都運行腳本,那麼沒有辦法做到這一點? 再次感謝Eric – dreamer

+0

@tanzir:您的用戶數據腳本可以安裝在每次啓動時運行的標準啓動腳本。 –

相關問題