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获取。