C# .Net AWS服务器管理器
我正在尝试构建一个简单的应用程序来启动、停止和更改AWS实例的实例类型 最终目标: 实例类型-增加或减少实例类型(t1.micro、t1.large等) 开始/停止实例- 我现在的问题是关于以下代码:C# .Net AWS服务器管理器,c#,.net,amazon-web-services,amazon-ec2,aws-sdk,C#,.net,Amazon Web Services,Amazon Ec2,Aws Sdk,我正在尝试构建一个简单的应用程序来启动、停止和更改AWS实例的实例类型 最终目标: 实例类型-增加或减少实例类型(t1.micro、t1.large等) 开始/停止实例- 我现在的问题是关于以下代码: InstanceState Start(RunningInstance instance) { using (var client = CreateClient()) { var confirmStar
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;
}
}
基本上,如果要“启动”服务器,请仔细检查。如果用户决定他们不想启动服务器,我需要它“不做任何事情”返回null“工作”,因为没有任何变化;但是,我得到了一个NullReferenceException(预期)我可以返回什么以使其“不执行任何操作”或“不使用Null”保持当前状态?
另一方面,我对AWS.Net SDK还是新手,因此任何提示都将不胜感激。在我看来,您可以在所有情况下检索实例的当前状态,即使您没有启动它 要获取不打算启动的实例的实例状态,您需要调用另一个描述该实例的API。有几种方法可以返回实例状态,下面是针对不同用例的几点建议:
- 如果您还打算返回实例元数据,或者不确定您可能需要并想要完整RunningInstance对象的所有信息,请使用DescribeInstances
- 如果只需要状态,DescribeInstanceStatus将返回较小的响应
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;
}
}
private InstanceState getInstanceState(字符串instanceId)
{
使用(IAmazonEC2 client=newamazonec2client())
{
var statusResponse=client.descripbeinstancestatus(新的descripbeinstancestatusrequest()
{
instanceId=新列表(){instanceId}
});
返回状态响应?.InstanceStatuses?.FirstOrDefault(
x=>x.InstanceId==InstanceId).InstanceState;
}
}
错误处理
请注意,如果输入InstanceId无效,DescribeInstanceStatus将抛出一个状态代码为400的BadRequest。您似乎已经在验证实例的存在,但如果希望有一个层直接与AWS API一起工作,您可能希望将该层包装为try/catch、catch on AmazonEC2Exception和gracefully以这种方式处理来自AWS API的故障
例如,调用DescribeInstanceStatus可能仅仅是因为InstanceId无效,但也可能是暂时性故障,甚至可能是由于您所在地区的EC2服务关闭。如果EC2服务不可用,您的应用程序也将无法完成很多工作,因此请确保您捕捉到了这一点并进行通信通过优雅的错误处理将其发送给用户
进一步阅读