AWS Java SDK - 使用公共 IP 启动 EC2 Spot 实例

水牛

Java SDK 文档不包括将 Spot 实例启动到具有公共 IP 的 VPC:https : //docs.aws.amazon.com/sdk-for-java/v1/developer-guide/tutorial-spot-adv- .html .

怎么做?

水牛

这是使用 aws-java-sdk-ec2-1.11.487 的 SSSCE:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2ClientBuilder;
import com.amazonaws.services.ec2.model.CreateTagsRequest;
import com.amazonaws.services.ec2.model.InstanceNetworkInterfaceSpecification;
import com.amazonaws.services.ec2.model.InstanceType;
import com.amazonaws.services.ec2.model.LaunchSpecification;
import com.amazonaws.services.ec2.model.RequestSpotInstancesRequest;
import com.amazonaws.services.ec2.model.SpotInstanceRequest;
import com.amazonaws.services.ec2.model.Tag;

public class SpotLauncher
{
  private static final int kInstances = 25;
  private static final String kMaxPrice = "0.007";
  private static final InstanceType kInstanceType = InstanceType.M3Medium;

  private static final String kSubnet = "subnet-xxxx";
  private static final String kAmi = "ami-xxxx";

  private static final String kName = "spot";
  private static final String kSecurityGroup2 = "sg-xxxx";
  private static final String kSecurityGroup1 = "sg-yyyy";

  public static void main(String[] args)
  {
    AmazonEC2 ec2 = AmazonEC2ClientBuilder.defaultClient();

    RequestSpotInstancesRequest request = new RequestSpotInstancesRequest();

    request.setSpotPrice(kMaxPrice); // max price we're willing to pay
    request.setInstanceCount(kInstances);

    LaunchSpecification launchSpecification = new LaunchSpecification();
    launchSpecification.setImageId(kAmi);
    launchSpecification.setInstanceType(kInstanceType);
    launchSpecification.setKeyName("aws");

    // security group IDs - don't add them, they're already added to the network spec
    // launchSpecification.withAllSecurityGroups(new GroupIdentifier().withGroupId("sg-xxxx"), new GroupIdentifier().withGroupId("sg-yyyy"));

    List<String> securityGroups = new ArrayList<String>();
    securityGroups.add(kSecurityGroup1);
    securityGroups.add(kSecurityGroup2);

    InstanceNetworkInterfaceSpecification networkSpec = new InstanceNetworkInterfaceSpecification();
    networkSpec.setDeviceIndex(0);
    networkSpec.setSubnetId(kSubnet);
    networkSpec.setGroups(securityGroups);
    networkSpec.setAssociatePublicIpAddress(true);

    List<InstanceNetworkInterfaceSpecification> nicWrapper = new ArrayList<InstanceNetworkInterfaceSpecification>();
    nicWrapper.add(networkSpec);

    // launchSpecification.setSubnetId("subnet-ccde4ce1"); // don't add this, it's already added to the network interface spec
    launchSpecification.setNetworkInterfaces(nicWrapper);

    // add the launch specifications to the request
    request.setLaunchSpecification(launchSpecification);

    // call the RequestSpotInstance API
    ec2.requestSpotInstances(request);

    while (!SetEc2Names(ec2))
    {
      Sleep(2000);
    }

    System.out.println("\nDONE.");

  }

  private static void Sleep(long aMillis)
  {
    try
    {
      Thread.sleep(aMillis);
    }
    catch (InterruptedException aEx)
    {
      aEx.printStackTrace();
    }
  }

  private static boolean SetEc2Names(AmazonEC2 aEc2Client)
  {
    List<SpotInstanceRequest> requests = aEc2Client.describeSpotInstanceRequests().getSpotInstanceRequests();

    Collections.sort(requests, GetCreatedDescComparator());

    for (int i = 0; i < kInstances; i++)
    {
      SpotInstanceRequest request = requests.get(i);
      if (request.getLaunchSpecification().getImageId().equals(kAmi))
      {
        System.out.println("request: " + request);

        String instanceId = request.getInstanceId();

        if (instanceId == null)
        {
          System.out.println("instance not launched yet, we don't have an id");
          return false;
        }

        System.out.println("setting name for newly launched spot instance, id: " + instanceId);

        AssignName(aEc2Client, request);
      }
    }

    return true;
  }

  private static void AssignName(AmazonEC2 aEc2Client, SpotInstanceRequest aRequest)
  {
    String instanceId = aRequest.getInstanceId();
    Tag tag = new Tag("Name", kName);

    CreateTagsRequest tagRequest = new CreateTagsRequest();

    List<String> instanceIds = new ArrayList<String>();
    instanceIds.add(instanceId);

    tagRequest.withResources(instanceIds);
    List<Tag> tags = new ArrayList<Tag>();
    tags.add(tag);
    tagRequest.setTags(tags);

    aEc2Client.createTags(tagRequest);
  }

  private static Comparator<SpotInstanceRequest> GetCreatedDescComparator()
  {
    return new Comparator<SpotInstanceRequest>()
    {

      @Override
      public int compare(SpotInstanceRequest o1, SpotInstanceRequest o2)
      {
        return -1 * o1.getCreateTime().compareTo(o2.getCreateTime());
      }

    };
  }

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法使用公共IP ping AWS EC2实例

来自分类Dev

使用AWS的PHP SDK重新启动ec2实例

来自分类Dev

使用 .NET SDK 启动带有用户数据的 AWS EC2 实例

来自分类Dev

AWS EC2:保留已运行实例的公共IP

来自分类Dev

AWS EC2:保留已运行实例的公共IP

来自分类Dev

使用AWS-cli从外部获取EC2实例的公共IP地址

来自分类Dev

AWS Java SDK - 获取 EC2 实例信息

来自分类Dev

使用Ansible启动AWS EC2实例的最佳方法

来自分类Dev

无法使用deltacloud启动AWS EC2实例

来自分类Dev

PXE 从 AWS EC2 实例启动?

来自分类Dev

如何在PowerShell中使用公共IP地址将EC2实例启动到VPC中?

来自分类Dev

如何在EC2启动实例请求中获取公共IP地址?

来自分类Dev

在没有公共IP地址的情况下访问在VPC中启动的EC2实例?

来自分类Dev

使用 aws CLI 为 Spot 实例分配弹性 IP 地址

来自分类Dev

AWS EC2:如何从Ubuntu实例内部了解公共IP

来自分类Dev

如果EC2 AWS实例崩溃,公共IP会如何处理?

来自分类Dev

在AWS EC2实例启动脚本中使用AWS命令行功能

来自分类Dev

在AWS EC2实例启动脚本中使用AWS命令行功能

来自分类Dev

使用名称启动EC2实例

来自分类Dev

启动时 AWS EC2 实例未运行 Java 程序

来自分类Dev

是否可以使用 node.js sdk 从 EC2 运行实例创建启动配置?

来自分类Dev

如何捕获CLI启动的EC2实例的IP地址以供后续使用?

来自分类Dev

如何捕获CLI启动的EC2实例的IP地址以供后续使用?

来自分类Dev

使用boto3从AWS Lambda启动EC2实例时超时

来自分类Dev

使用AWS开发工具包启动ec2实例时指定存储

来自分类Dev

AWS EC2:在使用 CLI 启动实例时添加标签

来自分类Dev

EC2 Spot实例:如何启动任务,如何停止任务?

来自分类Dev

如何使用AWS CDK与EC2实例创建弹性IP关联?

来自分类Dev

从 AWS lambda 函数获取 EC2 实例 IP 并使用请求库

Related 相关文章

  1. 1

    无法使用公共IP ping AWS EC2实例

  2. 2

    使用AWS的PHP SDK重新启动ec2实例

  3. 3

    使用 .NET SDK 启动带有用户数据的 AWS EC2 实例

  4. 4

    AWS EC2:保留已运行实例的公共IP

  5. 5

    AWS EC2:保留已运行实例的公共IP

  6. 6

    使用AWS-cli从外部获取EC2实例的公共IP地址

  7. 7

    AWS Java SDK - 获取 EC2 实例信息

  8. 8

    使用Ansible启动AWS EC2实例的最佳方法

  9. 9

    无法使用deltacloud启动AWS EC2实例

  10. 10

    PXE 从 AWS EC2 实例启动?

  11. 11

    如何在PowerShell中使用公共IP地址将EC2实例启动到VPC中?

  12. 12

    如何在EC2启动实例请求中获取公共IP地址?

  13. 13

    在没有公共IP地址的情况下访问在VPC中启动的EC2实例?

  14. 14

    使用 aws CLI 为 Spot 实例分配弹性 IP 地址

  15. 15

    AWS EC2:如何从Ubuntu实例内部了解公共IP

  16. 16

    如果EC2 AWS实例崩溃,公共IP会如何处理?

  17. 17

    在AWS EC2实例启动脚本中使用AWS命令行功能

  18. 18

    在AWS EC2实例启动脚本中使用AWS命令行功能

  19. 19

    使用名称启动EC2实例

  20. 20

    启动时 AWS EC2 实例未运行 Java 程序

  21. 21

    是否可以使用 node.js sdk 从 EC2 运行实例创建启动配置?

  22. 22

    如何捕获CLI启动的EC2实例的IP地址以供后续使用?

  23. 23

    如何捕获CLI启动的EC2实例的IP地址以供后续使用?

  24. 24

    使用boto3从AWS Lambda启动EC2实例时超时

  25. 25

    使用AWS开发工具包启动ec2实例时指定存储

  26. 26

    AWS EC2:在使用 CLI 启动实例时添加标签

  27. 27

    EC2 Spot实例:如何启动任务,如何停止任务?

  28. 28

    如何使用AWS CDK与EC2实例创建弹性IP关联?

  29. 29

    从 AWS lambda 函数获取 EC2 实例 IP 并使用请求库

热门标签

归档