[英].Net AWS Server Manager
我正在嘗試構建一個簡單的應用程序來啟動、停止和更改 AWS 實例的實例類型。
最終目標:實例類型 - 增加或減少實例類型(t1.micro、t1.large 等)啟動/停止實例 -
我目前的問題是關於下面的代碼:
InstanceState Start(RunningInstance instance)
{
using (var client = CreateClient())
{
var confirmStart = MessageBox.Show("Are you sure you want to START this server?", "Start Server", MessageBoxButtons.YesNo);
if (confirmStart == DialogResult.Yes)
{
var doubleCheck = MessageBox.Show("Start the Server?", "Are you sure?", MessageBoxButtons.YesNo);
if (doubleCheck == DialogResult.Yes)
{
var request = new StartInstancesRequest();
request.InstanceId.Add(instance.InstanceId);
var response = client.StartInstances(request);
return response.StartInstancesResult.StartingInstances[0].CurrentState;
}
else
return null;
}
else
return null;
}
}
基本上,仔細檢查是否要“啟動”服務器。 如果用戶決定他們不想啟動服務器,我需要它“什么都不做”,對於沒有任何變化的方面返回空“工作”; 但是,我收到了 NullReferenceException(預期)。 為了在不使用 Null 的情況下“什么都不做”或保持當前狀態,我可以返回什么?
附帶說明 - 我仍然是 AWS .Net SDK 的新手,所以任何提示都將不勝感激。
在我看來,即使您沒有啟動它,您也可以在所有情況下簡單地檢索實例的當前狀態。
要獲取您不打算啟動的實例的實例狀態,您需要調用另一個描述該實例的 API。 有幾種可以返回實例狀態,以下是針對不同用例的一些建議:
這是您可以從兩個 else 語句調用的最小示例函數。 在您沒有啟動實例的情況下,您將使用它來提供 InstanceState。
private InstanceState getInstanceState(string instanceId)
{
using (IAmazonEC2 client = new AmazonEC2Client())
{
var statusResponse = client.DescribeInstanceStatus(new DescribeInstanceStatusRequest()
{
InstanceIds = new List<string>() { instanceId }
});
return statusResponse?.InstanceStatuses?.FirstOrDefault(
x => x.InstanceId == instanceId).InstanceState;
}
}
請注意,如果輸入的 InstanceId 無效,DescribeInstanceStatus 將拋出狀態代碼為 400 BadRequest 的AmazonEC2Exception 。 您似乎已經在驗證實例的存在,但是如果打算讓一個層像這樣直接使用 AWS API,您可能希望將該層包裝在 try/catch 中,捕獲 AmazonEC2Exception,並優雅地處理來自AWS API 以這種方式。
例如,調用 DescribeInstanceStatus 可能僅僅是因為 InstanceId 無效,但也可能只是暫時性故障,甚至可能是由於您所在地區的 EC2 服務出現故障。 如果 EC2 服務不可用,您的應用程序同樣將無法做很多事情,因此請確保您捕獲該服務並通過優雅的錯誤處理將其傳達給您的用戶。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.