1. 概述

本文将介绍如何使用Java SDK控制EC2资源。如果你还不熟悉EC2(弹性云计算),简单说这是亚马逊云提供的计算容量服务平台。

2. 前置条件

使用Amazon AWS SDK for EC2所需的Maven依赖、AWS账户设置和客户端连接,与这篇文章中的配置完全相同。

假设我们已经按上文创建了AWSCredentials实例,接下来就可以创建EC2客户端:

Ec2Client ec2Client = Ec2Client.builder()
    .credentialsProvider(ProfileCredentialsProvider.create("default"))
    .region(Region.US_EAST_1)
    .build();

3. 创建EC2实例

通过SDK,我们可以快速搭建启动第一个EC2实例所需的环境

3.1 创建安全组

安全组用于控制EC2实例的网络流量。一个安全组可以被多个EC2实例共用。

创建安全组的代码:

CreateSecurityGroupRequest createSecurityGroupRequest = CreateSecurityGroupRequest.builder()
    .groupName("BaeldungSecurityGroup")
    .description("Baeldung Security Group")
    .build();

ec2Client.createSecurityGroup(createSecurityGroupRequest);

由于安全组默认禁止所有网络流量,我们需要配置规则允许特定流量

允许来自任意IP的HTTP流量:

IpRange ipRange1 = IpRange.builder()
    .cidrIp("0.0.0.0/0")
    .build();

IpPermission ipPermission1 = IpPermission.builder()
    .ipRanges(Arrays.asList(ipRange1))
    .ipProtocol("tcp")
    .fromPort(80)
    .toPort(80)
    .build();

最后,将ipRange绑定到AuthorizeSecurityGroupIngressRequest并通过EC2客户端执行:

AuthorizeSecurityGroupIngressRequest authorizeSecurityGroupIngressRequest = AuthorizeSecurityGroupIngressRequest
    .builder()
    .groupName("BaeldungSecurityGroup")
    .ipPermissions(ipPermission1, ipPermission2)
    .build();

ec2Client.authorizeSecurityGroupIngress(authorizeSecurityGroupIngressRequest);

3.2 创建密钥对

启动EC2实例时需要指定密钥对通过SDK创建密钥对

CreateKeyPairRequest createKeyPairRequest = CreateKeyPairRequest.builder()
    .keyName("baeldung-key-pair")
    .build();

CreateKeyPairResponse createKeyPairResponse = ec2Client.createKeyPair(createKeyPairRequest);
String privateKey = createKeyPairResponse.keyMaterial();

⚠️ 务必妥善保存私钥!一旦丢失无法找回(Amazon不保存),这是连接EC2实例的唯一凭证。

3.3 创建EC2实例

使用RunInstancesRequest创建实例:

RunInstancesRequest runInstancesRequest = RunInstancesRequest.builder()
    .imageId("ami-97785bed")
    .instanceType("t2.micro") 
    .minCount(1)
    .maxCount(1)
    .keyName("baeldung-key-pair")
    .securityGroups("BaeldungSecurityGroup")
    .build();

关键参数说明:

  • imageId:实例使用的AMI镜像
  • instanceType实例类型,定义硬件规格
  • keyName:可选参数,未指定则无法SSH连接(确保配置无误时可省略)
  • minCount/maxCount:创建实例数量的上下限
    • 若AWS无法创建最小数量,则不会创建任何实例
    • 若无法创建最大数量,会尝试创建介于最小值和最大值之间的实例数

执行请求并获取实例ID:

RunInstancesResponse runInstancesResponse = ec2Client.runInstances(runInstancesRequest);
String yourInstanceId = runInstancesResponse.instances().get(0).instanceId();

4. 管理EC2实例

通过SDK可以启动、停止、重启、描述和监控EC2实例。

4.1 启动、停止和重启实例

这些操作相对简单粗暴:

启动实例:

StartInstancesRequest startInstancesRequest = StartInstancesRequest.builder()
    .instanceIds(yourInstanceId)
    .build();

StartInstancesResponse startInstancesResponse = ec2Client.startInstances(startInstancesRequest);

停止实例:

StopInstancesRequest stopInstancesRequest = StopInstancesRequest.builder()
    .instanceIds(yourInstanceId)
    .build();

ec2Client.stopInstances(stopInstancesRequest);

重启实例:

RebootInstancesRequest rebootInstancesRequest = RebootInstancesRequest.builder()
    .instanceIds(yourInstanceId)
    .build();

ec2Client.rebootInstances(rebootInstancesRequest);

✅ 可通过响应获取实例前一状态

ec2Client.stopInstances(stopInstancesRequest)
    .stoppingInstances()
    .get(0)
    .previousState()
    .name();

4.2 监控实例

开启/关闭监控:

MonitorInstancesRequest monitorInstancesRequest = MonitorInstancesRequest.builder()
    .instanceIds(yourInstanceId)
    .build();

ec2Client.monitorInstances(monitorInstancesRequest);

UnmonitorInstancesRequest unmonitorInstancesRequest = UnmonitorInstancesRequest.builder()
    .instanceIds(yourInstanceId)
    .build();

ec2Client.unmonitorInstances(unmonitorInstancesRequest);

4.3 描述实例

获取实例详细信息:

DescribeInstancesRequest describeInstancesRequest = DescribeInstancesRequest.builder().build();
DescribeInstancesResponse response = ec2Client.describeInstances(describeInstancesRequest);

EC2实例按预留实例(Reservation)分组,每个预留实例对应一次启动请求:

response.reservations()

获取第一个预留实例中的第一个实例:

response.reservations().get(0).instances().get(0)

可获取的关键属性:

// ...
.imageId()           // AMI镜像ID
.subnetId()          // 子网ID
.instanceId()        // 实例ID
.instanceType()      // 实例类型
.state().name()      // 实例状态
.monitoring().state()// 监控状态
.kernelId()          // 内核ID
.keyName()           // 密钥对名称

5. 总结

本文展示了使用Java SDK管理Amazon EC2实例的核心操作。完整代码示例可在GitHub获取。


原始标题:Managing EC2 instances in Java

« 上一篇: JPA 高级标签实现
» 下一篇: Java Weekly, 第219期