«1. Обзор

В этой статье мы научимся управлять ресурсами EC2 с помощью Java SDK. Если вы новичок в EC2 (Elastic Cloud Compute) — это платформа, которая предоставляет вычислительные мощности в облаке Amazon.

2. Предварительные условия

Зависимости Maven, настройки учетной записи AWS и клиентское подключение, необходимые для использования SDK Amazon AWS для EC2, такие же, как в этой статье.

Предполагая, что мы создали экземпляр 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("BaeldungSecurityGroup")
  .withDescription("Baeldung Security Group");
CreateSecurityGroupResult createSecurityGroupResult = ec2Client.createSecurityGroup(
  createSecurityGroupRequest);

Поскольку группы безопасности по умолчанию не разрешают сетевой трафик, нам нужно настроить нашу группу безопасности, чтобы разрешить трафик.

Давайте разрешим HTTP-трафик, поступающий с любого IP-адреса:

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("BaeldungSecurityGroup")
  .withIpPermissions(ipPermission);
ec2Client.authorizeSecurityGroupIngress(authorizeSecurityGroupIngressRequest);

3.2. Создание пары ключей

При запуске экземпляра EC2 нам нужно указать пару ключей. Мы можем создать пару ключей с помощью SDK:

CreateKeyPairRequest createKeyPairRequest = new CreateKeyPairRequest()
  .withKeyName("baeldung-key-pair");
CreateKeyPairResult createKeyPairResult = ec2Client.createKeyPair(createKeyPairRequest);

Давайте получим закрытый ключ:

createKeyPairResult.getKeyPair().getKeyMaterial();

Мы должны убедиться, что этот ключ хранится в надежном и безопасном месте. Если мы потеряем его, мы не сможем его вернуть (Amazon не хранит его). Это единственный способ подключиться к нашему экземпляру EC2.

3.3. Создание экземпляра EC2

Для создания EC2 мы будем использовать RunInstancesRequest:

RunInstancesRequest runInstancesRequest = new RunInstancesRequest()
  .withImageId("ami-97785bed")
  .withInstanceType("t2.micro") 
  .withKeyName("baeldung-key-pair") 
  .withMinCount(1)
  .withMaxCount(1)
  .withSecurityGroups("BaeldungSecurityGroup");

Идентификатор изображения — это образ AMI, который будет использовать этот экземпляр.

Тип экземпляра определяет характеристики экземпляра.

Имя ключа указывать необязательно; если он не указан, то мы не можем подключиться к нашему экземпляру. Это нормально, если мы уверены, что правильно настроили наш экземпляр и не будем нуждаться в подключении.

Минимальное и максимальное количество задает ограничения на количество создаваемых экземпляров. Это зависит от зоны доступности: если AWS не может создать хотя бы минимальное количество экземпляров в зоне, он их не создаст.

И наоборот, если AWS не может создать максимальное количество экземпляров, он попытается создать меньше, при условии, что это число больше указанного нами минимального количества экземпляров.

Теперь мы можем выполнить запрос с помощью метода runInstances() и получить идентификатор созданного экземпляра:

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 сгруппированы в резервирования. Резервирование — это вызовы StartInstancesRequest, которые использовались для создания одного или нескольких экземпляров EC2:

response.getReservations()

Отсюда мы можем получить фактические экземпляры. Давайте получим первый инстанс в первом резервировании:

response.getReservations().get(0).getInstances().get(0)

Теперь мы можем описать наш инстанс:

// ...
.getImageId()
.getSubnetId()
.getInstanceId()
.getImageId()
.getInstanceType()
.getState().getName()
.getMonitoring().getState()
.getKernelId()
.getKeyName()

5. Заключение

В этом кратком руководстве мы показали, как управлять инстансами Amazon EC2 с помощью SDK для Java.

Как обычно, фрагменты кода можно найти на GitHub.