Java管理EC2实例
1. 概述
在本文中,我们将学习使用 Java SDK 控制 EC2 资源。如果您不熟悉 EC2(弹性云计算) ——这是一个在亚马逊云中提供计算能力的平台。
2.先决条件
使用Amazon AWS SDK for EC2 所需的 Maven 依赖项、AWS 账户设置和客户端连接与本文中的相同。
假设我们已经创建了一个AWSCredentials实例,如上一篇文章中所述,我们可以继续创建我们的 EC2 客户端:
AmazonEC2 ec2Client = AmazonEC2ClientBuilder
.standard()
.withCredentials(new AWSStaticCredentialsProvider(credentials))
.withRegion(Regions.US_EAST_1)
.build();
3. 创建 EC2 实例
使用 SDK,我们可以快速设置启动我们的第一个 EC2 实例所需的内容。
3.1. 创建安全组
**安全组控制到我们的 EC2 实例的网络流量。**我们可以为多个 EC2 实例使用一个安全组。
让我们创建一个安全组:
CreateSecurityGroupRequest createSecurityGroupRequest = new CreateSecurityGroupRequest()
.withGroupName("BlogdemoSecurityGroup")
.withDescription("Blogdemo Security Group");
CreateSecurityGroupResult createSecurityGroupResult = ec2Client.createSecurityGroup(
createSecurityGroupRequest);
由于默认情况下安全组不允许任何网络流量,因此我们必须配置我们的安全组以允许流量。
让我们允许来自任何 IP 地址的 HTTP 流量:
IpRange ipRange = new IpRange().withCidrIp("0.0.0.0/0");
IpPermission ipPermission = new IpPermission()
.withIpv4Ranges(Arrays.asList(new IpRange[] { ipRange }))
.withIpProtocol("tcp")
.withFromPort(80)
.withToPort(80);
最后,我们必须将ipRange实例附加到AuthorizeSecurityGroupIngressRequest并使用我们的 EC2 客户端发出请求:
AuthorizeSecurityGroupIngressRequest authorizeSecurityGroupIngressRequest
= new AuthorizeSecurityGroupIngressRequest()
.withGroupName("BlogdemoSecurityGroup")
.withIpPermissions(ipPermission);
ec2Client.authorizeSecurityGroupIngress(authorizeSecurityGroupIngressRequest);
3.2. 创建密钥对
启动 EC2 实例时,我们需要指定密钥对 。我们可以使用 SDK 创建一个密钥对:
CreateKeyPairRequest createKeyPairRequest = new CreateKeyPairRequest()
.withKeyName("blogdemo-key-pair");
CreateKeyPairResult createKeyPairResult = ec2Client.createKeyPair(createKeyPairRequest);
让我们获取私钥:
createKeyPairResult.getKeyPair().getKeyMaterial();
我们必须**确保将这把钥匙保存在安全的地方。**如果我们丢失了它,我们将无法找回它(亚马逊不会保留它)。这是我们可以连接到我们的 EC2 实例的唯一方式。
3.3. 创建 EC2 实例
要创建 EC2,我们将使用RunInstancesRequest:
RunInstancesRequest runInstancesRequest = new RunInstancesRequest()
.withImageId("ami-97785bed")
.withInstanceType("t2.micro")
.withKeyName("blogdemo-key-pair")
.withMinCount(1)
.withMaxCount(1)
.withSecurityGroups("BlogdemoSecurityGroup");
映像 ID 是此实例将使用的AMI 映像 。
实例类型 定义实例的规范。
**键名是可选的;**如果未指定,则我们无法连接到我们的实例。如果我们确信我们已经正确设置了我们的实例并且不需要连接,这很好。
**最小和最大计数给出了将创建多少个实例的界限。**这取决于可用区:如果 AWS 不能在该区域中创建至少最少数量的实例,它就不会创建任何实例。
相反,如果 AWS 无法创建最大数量的实例,它将尝试创建更少的实例,前提是该数量高于我们指定的最小实例数量。
现在我们可以使用 runInstances() 方法执行请求并检索创建的实例的 id:
String yourInstanceId = ec2Client.runInstances(runInstancesRequest)
.getReservation().getInstances().get(0).getInstanceId();
4. 管理 EC2 实例
使用 SDK,我们可以为我们的 EC2 实例启动、停止、重启、描述和配置监控。
4.1. 启动、停止和重启 EC2 实例
启动、停止和重启实例相对简单。
启动实例:
StartInstancesRequest startInstancesRequest = new StartInstancesRequest()
.withInstanceIds(yourInstanceId);
ec2Client.startInstances(request);
停止实例:
StopInstancesRequest stopInstancesRequest = new StopInstancesRequest()
.withInstanceIds(yourInstanceId);
ec2Client.stopInstances(request);
重启实例:
RebootInstancesRequest request = new RebootInstancesRequest()
.withInstanceIds(yourInstanceId);
RebootInstancesResult rebootInstancesRequest = ec2Client.rebootInstances(request);
从这些请求中的每一个,都可以询问实例的先前状态:
ec2Client.stopInstances(stopInstancesRequest)
.getStoppingInstances()
.get(0)
.getPreviousState()
.getName()
4.2. 监控 EC2 实例
让我们看看如何开始和停止监控我们的 EC2 实例:
MonitorInstancesRequest monitorInstancesRequest = new MonitorInstancesRequest()
.withInstanceIds(yourInstanceId);
ec2Client.monitorInstances(monitorInstancesRequest);
UnmonitorInstancesRequest unmonitorInstancesRequest = new UnmonitorInstancesRequest()
.withInstanceIds(yourInstanceId);
ec2Client.unmonitorInstances(unmonitorInstancesRequest);
4.3. 描述 EC2 实例
最后,我们可以描述我们的 EC2 实例:
DescribeInstancesRequest describeInstancesRequest
= new DescribeInstancesRequest();
DescribeInstancesResult response = ec2Client
.describeInstances(describeInstancesRequest);
EC2 实例被分组为预留。预留是用于创建一个或多个 EC2 实例的StartInstancesRequest调用:
response.getReservations()
从这里我们可以得到实际的实例。让我们在第一个预留中获取第一个实例:
response.getReservations().get(0).getInstances().get(0)
现在,我们可以描述我们的实例:
// ...
.getImageId()
.getSubnetId()
.getInstanceId()
.getImageId()
.getInstanceType()
.getState().getName()
.getMonitoring().getState()
.getKernelId()
.getKeyName()