2016-10-03 193 views
1

我從代碼開始新的AWS實例(與Windows):如何檢查是否AWS實例實際上是提供

RunInstancesResponse launchResponse = ec2Client.RunInstances(launchRequest); 

然後我要求它的狀態:

var instanceRequest = new DescribeInstancesRequest(); 
    var response = ec2Client.DescribeInstances(instanceRequest); 

當狀態是16 /正在運行我試圖連接到此實例,但失敗。稍後可以連接。 在AWS控制檯中,我看到'狀態檢查',當圖像獲取狀態'運行'時開始運行,我認爲'狀態檢查'完成時圖像變得真正可用。

+3

我想從亞馬遜的角度來看實例正在運行。問題是實例上的操作系統還沒有完成引導/啓動,可能沒有準備好接受連接。在AWS說實例正在運行後,您可能不得不再等一兩分鐘。 –

回答

1

關於運行狀態,我同意Mark B.運行狀態並不保證OS已經啓動完成,用戶數據已經完成運行,您的生成密碼是否可用等。檢查狀態可能是巧合的是對你更好,因爲 - 默認情況下 - 它只檢查正在運行的實例,但好處可能只是巧合,因爲這些檢查同樣不會檢查您實例上可能感興趣的許多內部操作。

要看status checks,您需要使用不同的API:

個DescribeInstanceStatus:

簡單的例子:

using (IAmazonEC2 client = new AmazonEC2Client()) 
{ 
    string instanceId = "i-abcd1234"; 

    DescribeInstanceStatusResponse response = client.DescribeInstanceStatus(
     new DescribeInstanceStatusRequest 
     { 
      InstanceIds = new List<string> { instanceId } 
     }); 

    InstanceStatus status = response?.InstanceStatuses.FirstOrDefault(
     x => x.InstanceId == instanceId 
    ); 

    if (status != null) 
    { 
     // Perform your checks on InstanceStatus here 
    } 
} 

其他一些另類的想法:

  • 看從實例user data
  • 投票的實例的端點發布的消息,直到它變得可用。如果此實例專門託管Web服務,則這是一種更好的方法,可以通過ELB自動執行。
0

同意安東尼 - 不要依賴於API的地位。 你說:

「我試圖連接到該實例,但它失敗後,它 可以連接。」

爲什麼不這樣做,在你的代碼?

while (true) 
{ 
    try 
    { 
     // try and connect to whatever you're waiting for on your instance(s) 
     ConnectToInstance("instance IP address goes here"); 
     return; 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine("Still waiting to connect: " + e)   
     Thread.Sleep(5000); 
    } 
} 

可能會增加一個等待的最長時間。那麼你不依賴AWS狀態或用戶數據或Windows服務啓動延遲等。

相關問題