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

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

1. обзор

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

2. Предпосылки

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

Предполагая, что мы создали экземплярAWSCredentials,, как описано в предыдущей статье, мы можем продолжить и создать нашего клиента EC2:

AmazonEC2 ec2Client = AmazonEC2ClientBuilder
  .standard()
  .withCredentials(new AWSStaticCredentialsProvider(credentials))
  .withRegion(Regions.US_EAST_1)
  .build();

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

Используя SDK, мы можем быстроset up what we need to start our first EC2 instance.

3.1. Создание группы безопасности

Security groups control the network traffic to our EC2 instances. Мы можем использовать одну группу безопасности для нескольких экземпляров EC2.

Создадим группу безопасности:

CreateSecurityGroupRequest createSecurityGroupRequest = new CreateSecurityGroupRequest()
  .withGroupName("exampleSecurityGroup")
  .withDescription("example Security Group");
CreateSecurityGroupResult createSecurityGroupResult = ec2Client.createSecurityGroup(
  createSecurityGroupRequest);

Поскольку группы безопасности по умолчанию не разрешают сетевой трафик, нам потребуетсяconfigure our security group to allow traffic.

Разрешим 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);

Наконец, мы должныattach the ipRange instance to an AuthorizeSecurityGroupIngressRequest и сделать запрос с помощью нашего клиента EC2:

AuthorizeSecurityGroupIngressRequest authorizeSecurityGroupIngressRequest
  = new AuthorizeSecurityGroupIngressRequest()
  .withGroupName("exampleSecurityGroup")
  .withIpPermissions(ipPermission);
ec2Client.authorizeSecurityGroupIngress(authorizeSecurityGroupIngressRequest);

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

При запуске инстанса EC2 нам нужно указатьkey pair.We can create a key pair using the SDK:

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

Получим закрытый ключ:

createKeyPairResult.getKeyPair().getKeyMaterial();

У нас естьmake sure to keep this key somewhere secure and safe.. Если мы потеряем его, мы не сможем вернуть его (Amazon не сохраняет). Это единственный способ подключиться к нашему экземпляру EC2.

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

Чтобы создать EC2, мы будем использоватьRunInstancesRequest:

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

Идентификатор изображения -AMI image that this instance will use.

An instance type определяетspecifications of the instance.

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

Min and max count give bounds as to how many instances will be created. Это зависит от зоны доступности: если AWS не может создать хотя бы минимальное количество экземпляров в зоне, он не создаст ни одного.

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

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

String yourInstanceId = ec2Client.runInstances(runInstancesRequest)
  .getReservation().getInstances().get(0).getInstanceId();

4. Управление экземпляром EC2

Используя SDK, мы можемstart, stop, reboot, describe and configure monitoring для наших экземпляров 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);

По каждому из этих запросов можноinterrogate the previous state of the instance:

ec2Client.stopInstances(stopInstancesRequest)
  .getStoppingInstances()
  .get(0)
  .getPreviousState()
  .getName()

4.2. Мониторинг экземпляра EC2

Посмотрим, какstart and stop monitoring our EC2 instances:

MonitorInstancesRequest monitorInstancesRequest = new MonitorInstancesRequest()
  .withInstanceIds(yourInstanceId);

ec2Client.monitorInstances(monitorInstancesRequest);

UnmonitorInstancesRequest unmonitorInstancesRequest = new UnmonitorInstancesRequest()
  .withInstanceIds(yourInstanceId);

ec2Client.unmonitorInstances(unmonitorInstancesRequest);

4.3. Описание экземпляра EC2

Наконец, мы можемdescribe our EC2 instances:

DescribeInstancesRequest describeInstancesRequest
 = new DescribeInstancesRequest();
DescribeInstancesResult response = ec2Client
  .describeInstances(describeInstancesRequest);

Экземпляры EC2 сгруппированы вreservations. Резервирования - это вызовыStartInstancesRequest, которые использовались для создания одного или нескольких экземпляров EC2:

response.getReservations()

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

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

Теперь мы можем описать наш экземпляр:

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

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

В этом кратком руководстве мы показали, какmanage Amazon EC2 instances using the Java SDK.

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