Gerenciando instâncias do EC2 em Java

Gerenciando instâncias do EC2 em Java

1. Visão geral

Neste artigo, aprenderemos acontrol EC2 resources using the Java SDK. Se você é novo em **EC2 (Elastic Cloud Compute) - esta é uma plataforma que fornece capacidade de computação na nuvem da Amazon.

2. Pré-requisitos

As dependências do Maven, as configurações de conta da AWS e a conexão do cliente necessárias para usar o Amazon AWS SDK para EC2 são as mesmas dethis article here.

Supondo que criamos uma instância deAWSCredentials, conforme descrito no artigo anterior, podemos prosseguir e criar nosso cliente EC2:

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

3. Criação de uma instância EC2

Usando o SDK, podemos rapidamenteset up what we need to start our first EC2 instance.

3.1. Criando um Grupo de Segurança

Security groups control the network traffic to our EC2 instances. Podemos usar um grupo de segurança para várias instâncias EC2.

Vamos criar um grupo de segurança:

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

Como os grupos de segurança não permitem nenhum tráfego de rede por padrão, teremos queconfigure our security group to allow traffic.

Vamos permitir o tráfego HTTP vindo de qualquer endereço 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);

Finalmente, devemosattach the ipRange instance to an AuthorizeSecurityGroupIngressRequeste fazer a solicitação usando nosso cliente EC2:

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

3.2. Criação de um par de chaves

Ao iniciar uma instância EC2, precisamos especificar umkey pair.We can create a key pair using the SDK:

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

Vamos pegar a chave privada:

createKeyPairResult.getKeyPair().getKeyMaterial();

Temos quemake sure to keep this key somewhere secure and safe. Se perdermos, não poderemos recuperá-lo (a Amazon não o mantém). É a única maneira de nos conectarmos à nossa instância EC2.

3.3. Criando a instância EC2

Para criar o EC2, usaremos umRunInstancesRequest:

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

Id da imagem é oAMI image that this instance will use.

An instance type define ospecifications of the instance.

The key name is optional; se não for especificado, não podemos conectar à nossa instância. Isso é bom se tivermos certeza de que configuramos nossa instância corretamente e não precisamos nos conectar.

Min and max count give bounds as to how many instances will be created. Isso depende da zona de disponibilidade: se a AWS não puder criar pelo menos o número mínimo de instâncias na zona, ela não criará nenhuma.

Por outro lado, se a AWS não puder criar o número máximo de instâncias, ela tentará criar menos, desde que esse número seja maior do que o número mínimo de instâncias que especificamos.

Agora podemos executar a solicitação usando o método runInstances () e recuperar o ID da instância criada:

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

4. Gerenciando uma instância EC2

Usando o SDK, podemosstart, stop, reboot, describe and configure monitoring para nossas instâncias EC2.

4.1. Iniciando, parando e reiniciando uma instância EC2

Iniciar, parar e reinicializar uma instância é relativamente simples.

Iniciando uma instância:

StartInstancesRequest startInstancesRequest = new StartInstancesRequest()
  .withInstanceIds(yourInstanceId);

ec2Client.startInstances(request);

Interrompendo uma instância:

StopInstancesRequest stopInstancesRequest = new StopInstancesRequest()
  .withInstanceIds(yourInstanceId);

ec2Client.stopInstances(request);

Reiniciando uma instância:

RebootInstancesRequest request = new RebootInstancesRequest()
  .withInstanceIds(yourInstanceId);

RebootInstancesResult rebootInstancesRequest = ec2Client.rebootInstances(request);

De cada uma dessas solicitações, é possívelinterrogate the previous state of the instance:

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

4.2. Monitorando uma instância EC2

Vamos ver comostart 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. Descrevendo uma instância EC2

Finalmente, podemosdescribe our EC2 instances:

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

As instâncias EC2 são agrupadas emreservations. As reservas são as chamadasStartInstancesRequest que foram usadas para criar uma ou mais instâncias EC2:

response.getReservations()

A partir daqui, podemos obter as instâncias reais. Vamos pegar a primeira instância na primeira reserva:

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

Agora, podemos descrever nossa instância:

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

5. Conclusão

Neste tutorial rápido, mostramos comomanage Amazon EC2 instances using the Java SDK.

Como de costume, trechos de código podem ser encontradosover on GitHub.