【问题标题】:How to start an Amazon EC2 instance programmatically in .NET如何在 .NET 中以编程方式启动 Amazon EC2 实例
【发布时间】:2011-11-17 05:38:05
【问题描述】:

我一直在尝试在 C# 中启动 EC2 实例,但没有成功。

当传入实例 ID 以启动实例时,我收到一个错误,即尽管我传入了从对象属性获得的实例 ID,但无法找到该实例。

如果有任何提示或指示,我将不胜感激。

【问题讨论】:

    标签: c# .net amazon-ec2 amazon


    【解决方案1】:

    亚马逊付出巨大努力将其 AWS Cloud .Net SDK 集成到 VS2008 和 VS 2010

    • 1 - 下载并安装AWS SDK msi
    • 2 - 创建一个 AWS 控制台项目,输入您的凭据
      (可从您的 AWS 控制台右上角的登录名菜单下获得)
    • 3 - 添加以下代码(见下图)。
    • 4 - 大功告成。这很简单。
      您可以通过刷新 AWS 控制台屏幕来检查程序启动/停止是否成功。

    AmazonEC2 ec2 = AWSClientFactory.CreateAmazonEC2Client();
    //Start Your Instance
    ec2.StartInstances(new StartInstancesRequest().WithInstanceId("i-00000000"));
    //Stop it
    ec2.StopInstances(new StopInstancesRequest().WithInstanceId("i-00000000"));
    

    您只需将“i-00000000”替换为您的实例 ID(在您的 AWS 管理控制台中可用)

    希望这可以帮助那些在谷歌上搜索并偶然发现这个问题的人(就像我自己一样)快速开始。
    通过这些向导执行这些简单的步骤将使您免去很多麻烦。

    【讨论】:

      【解决方案2】:

      尝试使用AWSSDK 来启动“图像ID”的新实例:

      RunInstancesResponse response = Client.RunInstances(new RunInstancesRequest()
        .WithImageId(ami_id)
        .WithInstanceType(instance_type)
        .WithKeyName(YOUR_KEYPAIR_NAME)
        .WithMinCount(1)
        .WithMaxCount(max_number_of_instances)
        .WithUserData(Convert.ToBase64String(Encoding.UTF8.GetBytes(bootScript.Replace("\r", ""))))
      );
      

      (注意:.WithUserData() 是可选的,在上面用于传递简短的 shell 脚本。)

      如果调用成功,响应应该包含一个实例列表。您可以使用类似这样的东西来创建“实例 ID”列表:

      if (response.IsSetRunInstancesResult() && response.RunInstancesResult.IsSetReservation() && response.RunInstancesResult.Reservation.IsSetRunningInstance())
      {
           List<string> instance_ids = new List<string>();
           foreach (RunningInstance ri in response.RunInstancesResult.Reservation.RunningInstance)
           {
                instance_ids.Add(ri.InstanceId);
           }
      
           // do something with instance_ids
           ...
      }
      

      【讨论】:

        【解决方案3】:

        请注意,Amazon AWS 实例仅存在于一个区域中。如果您的实例 id i-12345 在 EU-West-1 区域中,并且您只需创建一个新的 EC2Client 并告诉客户端启动 i-12345 它可能会抱怨找不到该实例,因为客户端在 us-east-1 区域启动,该区域没有 i-12345 实例

        如果不是默认区域,您创建 cient 的调用应指定区域(我不知道哪个 AWS 区域是默认区域,所以我每次都指定):

        AmazonEC2 ec2 = AWSClientFactory.CreateAmazonEC2Client(
         new Amazon.EC2.AmazonEC2Config().WithServiceURL("https://eu-west-1.ec2.amazonaws.com")
        ); 
        

        【讨论】:

          【解决方案4】:

          好的,这是完整的端到端说明。 1. 使用 Nuget Package Manager 安装 AWSSDK.Core 和 AWSSDK.EC2。
          2. 然后将整个类复制到你的项目中。 AccessKey 和 Secret 在 AWS IAM 中获取。您需要确保您创建的用户具有“AmazonEC2FullAccess”(您可能可以使用较低级别的权限策略,我只是在这里懒惰:D)。 region 是您的 AWS EC2 实例区域。和实例 ID 可以在 EC2 仪表板列表中找到。简单,完美运行...您还可以编写额外的代码来管理响应对象。 3. 请注意,如果您使用代理,则必须对其进行配置(此处未包含代码)。

          public class AWSClass : IDisposable
              {
                  Amazon.EC2.AmazonEC2Client _client;
          
                  public AWSClass(string region, string AccessKey, string Secret)
                  {
                      RegionEndpoint EndPoint = RegionEndpoint.GetBySystemName(region);
                      Amazon.Runtime.BasicAWSCredentials Credentials = new Amazon.Runtime.BasicAWSCredentials(AccessKey, Secret);
                      _client = new AmazonEC2Client(Credentials, EndPoint);
                  }
          
                  public void Dispose()
                  {
                      _client = null;
                  }
          
                  public void StopInstance(string InstanceID)
                  {
                      StopInstancesResponse response = _client.StopInstances(new StopInstancesRequest
                      {
                          InstanceIds = new List<string> {InstanceID }
                      });
                      //Can also do something with the response object too
                  }
          
                  public void StartInstance(string InstanceID)
                  {
                      StartInstancesResponse response = _client.StartInstances(new StartInstancesRequest
                      {
                          InstanceIds = new List<string> { InstanceID }
                      });
          
                  }
          
              }
          

          【讨论】:

            【解决方案5】:

            试试这个。

            var startRequest = new StartInstancesRequest
                                {
                                    InstanceIds = new List<string>() { instanceId }
                                };
                            bool isError = true;
                            StartInstancesResponse startInstancesResponse = null;
                            while (isError)
                            {
                                try
                                {
                                    startInstancesResponse=amazonEc2client.StartInstances(startRequest);
                                    isError = false;
                                }
                                catch (Exception ex)
                                {
                                    Console.WriteLine(ex.Message + "\n" + ex.StackTrace);
                                    isError = true;
                                }
                            }
            

            【讨论】:

              猜你喜欢
              • 2023-03-29
              • 1970-01-01
              • 2012-06-27
              • 2023-03-07
              • 2020-11-01
              • 2012-04-27
              • 1970-01-01
              • 1970-01-01
              • 2011-07-15
              相关资源
              最近更新 更多