我正在尝试构建一个简单的应用程序来启动,停止和更改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;
}
}
基本上,仔细检查你是否想要"开始"服务器。如果用户决定他们不想启动服务器,我需要它来“不做什么”#34;返回null" Works"因为没有变化的方面;但是,我得到一个NullReferenceException(预期)。 我可以返回什么才能实现"什么都不做"或保持现状"不使用Null?
在旁注 - 我仍然是AWS .Net SDK的新手,所以任何提示都将不胜感激。
答案 0 :(得分:1)
听起来我觉得你可以简单地在所有情况下检索实例的当前状态,即使你没有启动它。
要获取您不打算启动的实例的实例状态,您需要调用另一个描述该实例的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服务不可用,那么您的应用程序同样无法做很多事情,因此请确保通过优雅的错误处理来捕获并将其传达给您的用户。