Перейти к основному содержимому

Управление экземплярами EC2 в Java

· 4 мин. чтения

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

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

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

CreateKeyPairRequest createKeyPairRequest = new CreateKeyPairRequest()
.withKeyName("foreach-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("foreach-key-pair")
.withMinCount(1)
.withMaxCount(1)
.withSecurityGroups("ForEachSecurityGroup");

Идентификатор изображения — это образ 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 с помощью Java SDK.

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