.Net AWS服务器管理器

问题描述 投票:1回答:1

我正在尝试构建一个简单的应用程序来启动,停止和更改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;
            }
        }

基本上,如果要“启动”服务器,请仔细检查。如果用户决定他们不想启动服务器,我需要它“不做任何事”返回null“Works”,因为没有任何变化;但是,我得到一个NullReferenceException(预期)。我可以返回什么,以便“不做任何事”或保持当前状态“不使用Null?

在旁注 - 我仍然是AWS .Net SDK的新手,所以任何提示都将不胜感激。

c# .net amazon-web-services amazon-ec2 aws-sdk
1个回答
1
投票

听起来像你可以简单地在所有情况下只检索实例的当前状态,即使你没有启动它。

要获取您不打算启动的实例的实例状态,您需要调用另一个描述该实例的API。有几个可以返回实例状态,这里有几个针对不同用例的建议:

  • 如果您还想要返回实例元数据,或者不确定您可能需要的所有信息并想要一个完整的RunningInstance对象,请使用DescribeInstances。
  • 如果您只需要状态,DescribeInstanceStatus将返回较小的响应。

DescribeInstanceStatus示例

这是一个最小的示例函数,您可以从两个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服务不可用,您的应用程序同样无法做很多事情,因此请务必抓住并通过优雅的错误处理将其传达给您的用户。

进一步阅读

© www.soinside.com 2019 - 2024. All rights reserved.