Armazene arquivos de uma aplicação em um volume EBS

AWSBeginner
Pratique Agora

Introdução

Sua aplicação de relatórios precisa de um disco separado para seu arquivo de relatório. Você criará um volume do Amazon EBS, o anexará a uma instância EC2, formatará e montará seu sistema de arquivos e disponibilizará um relatório a partir desse volume. Depois, desmontará, desanexará e excluirá os recursos que criou.

Você já deve conhecer o lançamento de instâncias EC2 e o SSH. Cada laboratório começa em um ambiente novo, com sua própria imagem de aplicação, rede e par de chaves.

Relação com a certificação

Este laboratório pratica a escolha de armazenamento em blocos para uma carga de trabalho EC2 e apoia os conceitos de armazenamento da tarefa 3.6 dos objetivos do domínio 3 do AWS Certified Cloud Practitioner CLF-C02.

Inicie o servidor de armazenamento

Nesta etapa, você iniciará a instância da aplicação e identificará sua zona de disponibilidade.

Comece em seu espaço de trabalho e carregue os IDs dos recursos fornecidos:

cd /home/labex/project
source launch.env

Inicie uma instância chamada storage-server. A imagem já contém uma aplicação de relatórios; você fornecerá seu volume de dados:

aws ec2 \
  run-instances \
  --image-id "$AMI_ID" \
  --instance-type t3.micro \
  --subnet-id "$SUBNET_ID" \
  --security-group-ids "$SECURITY_GROUP_ID" \
  --key-name report-key \
  --count 1 \
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=storage-server}]'

Obtenha o ID da instância por sua tag de nome:

INSTANCE_ID=$(aws ec2 \
  describe-instances \
  --filters Name=tag:Name,Values=storage-server \
  --query 'Reservations[0].Instances[0].InstanceId' \
  --output text)

Espere a instância ficar em execução:

aws ec2 \
  wait instance-running \
  --instance-ids "$INSTANCE_ID"

Uma zona de disponibilidade é um local isolado dentro de uma região. Um volume EBS é anexado a uma instância na mesma zona de disponibilidade. Consulte a zona da instância em vez de tentar adivinhá-la:

AVAILABILITY_ZONE=$(aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[0].Instances[0].Placement.AvailabilityZone' \
  --output text)

Inspecione o estado e a zona:

aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[].Instances[].{Instance:InstanceId,State:State.Name,Zone:Placement.AvailabilityZone}'

Confirme running. Abra AWS View, clique em Refresh resources, selecione storage-server e clique em Check application. Confirme HTTP 200 antes de adicionar armazenamento.

Crie e anexe o volume de dados

Nesta etapa, você criará um volume de dados EBS separado e o anexará ao servidor em execução.

O Amazon EBS fornece armazenamento em blocos para EC2. Um volume é um recurso semelhante a um disco, enquanto um sistema de arquivos organiza os arquivos nesse disco. Anexar um volume disponibiliza seu dispositivo de blocos; isso não cria um sistema de arquivos. O guia de volumes EBS descreve a anexação e a persistência dos volumes.

Crie um pequeno volume SSD de uso geral vazio. gp3 seleciona o tipo de volume, --size 1 solicita um GiB e a variável da zona o coloca na mesma zona de sua instância. Guarde seu ID para as operações seguintes:

VOLUME_ID=$(aws ec2 \
  create-volume \
  --availability-zone "$AVAILABILITY_ZONE" \
  --size 1 \
  --volume-type gp3 \
  --tag-specifications 'ResourceType=volume,Tags=[{Key=Name,Value=report-data}]' \
  --query 'VolumeId' \
  --output text)

Espere o novo volume ficar disponível:

aws ec2 \
  wait volume-available \
  --volume-ids "$VOLUME_ID"

Anexe-o usando o nome de dispositivo da API /dev/sdf:

aws ec2 \
  attach-volume \
  --volume-id "$VOLUME_ID" \
  --instance-id "$INSTANCE_ID" \
  --device /dev/sdf

Espere a anexação:

aws ec2 \
  wait volume-in-use \
  --volume-ids "$VOLUME_ID"

Inspecione o volume e sua anexação:

aws ec2 \
  describe-volumes \
  --volume-ids "$VOLUME_ID" \
  --query 'Volumes[].{Volume:VolumeId,State:State,Zone:AvailabilityZone,Size:Size,Type:VolumeType,Attachments:Attachments}'

Confirme in-use, tamanho 1, tipo gp3 e uma anexação à sua instância. Atualize AWS View e inspecione a linha do volume. O volume raiz é separado do novo volume de dados.

Monte o volume e disponibilize um relatório

Nesta etapa, você inicializará o volume de dados vazio e disponibilizará um relatório para a aplicação.

Consulte o endereço público atual da instância:

PUBLIC_IP=$(aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[0].Instances[0].PublicIpAddress' \
  --output text)

Conecte-se com a configuração SSH fornecida:

ssh -F ssh_config ubuntu@"$PUBLIC_IP"

Dentro da instância, inspecione o dispositivo recém-anexado. Seu nome Linux neste laboratório é /dev/xvdf; nomes de dispositivos podem ser diferentes do nome de anexação da API. Outras imagens EC2 podem apresentar nomes NVMe, portanto identifique o disco antes de operar nele. O guia oficial de preparação de volumes Linux explica essa diferença.

lsblk -f /dev/xvdf

Confirme que o dispositivo não tem um tipo de sistema de arquivos. Crie um sistema de arquivos ext4 somente neste volume de dados novo e vazio. Formatar um volume com dados existentes os apagaria:

sudo mkfs.ext4 /dev/xvdf

Um ponto de montagem é o diretório pelo qual você acessa um sistema de arquivos. Monte o novo sistema de arquivos no diretório preparado para a aplicação de relatórios:

sudo mount /dev/xvdf /srv/reports

Confirme o dispositivo de origem, o sistema de arquivos e o ponto de montagem:

findmnt /srv/reports

Procure /dev/xvdf, ext4 e /srv/reports. Crie um relatório CSV com dados sintéticos. sudo tee escreve no sistema de arquivos pertencente ao administrador; o here-document com delimitador entre aspas preserva as duas linhas:

sudo tee /srv/reports/report.csv <<'CSV'
period,total
Q1,320
CSV

Leia o arquivo novamente:

cat /srv/reports/report.csv

Volte ao terminal do LabEx:

exit

Em AWS View, selecione storage-server e clique em Read volume report. Confirme HTTP 200 e o texto CSV period,total e Q1,320. Essa resposta demonstra que a aplicação consegue ler o arquivo do volume montado.

A montagem neste laboratório é manual. Uma reinicialização não restaura automaticamente uma montagem manual; em produção, normalmente se configura o UUID do sistema de arquivos em /etc/fstab depois de testar a entrada.

Desmonte, desanexe e exclua

Nesta etapa, você removerá o volume de dados e a instância da aplicação em uma ordem controlada.

Primeiro, reconecte-se à instância da aplicação:

ssh -F ssh_config ubuntu@"$PUBLIC_IP"

Desmonte o sistema de arquivos antes de desanexar seu disco. Isso interrompe o acesso ao sistema de arquivos e descarrega as gravações pendentes:

sudo umount /srv/reports

Confirme que ele não está mais montado:

findmnt /srv/reports

Um diretório não montado não produz saída e findmnt retorna um código de saída diferente de zero; isso é esperado aqui. Volte ao terminal do LabEx:

exit

Desanexe somente seu volume de dados:

aws ec2 \
  detach-volume \
  --volume-id "$VOLUME_ID" \
  --instance-id "$INSTANCE_ID" \
  --device /dev/sdf

Espere o volume ficar disponível novamente:

aws ec2 \
  wait volume-available \
  --volume-ids "$VOLUME_ID"

Exclua o volume desanexado. Isso remove seus dados permanentemente, portanto guarde arquivos importantes ou um backup antes de excluir um volume de produção:

aws ec2 \
  delete-volume \
  --volume-id "$VOLUME_ID"

Encerre a instância da aplicação:

aws ec2 \
  terminate-instances \
  --instance-ids "$INSTANCE_ID"

Espere o encerramento:

aws ec2 \
  wait instance-terminated \
  --instance-ids "$INSTANCE_ID"

Inspecione o estado final da instância:

aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[].Instances[].{Instance:InstanceId,State:State.Name}'

Confirme terminated e depois liste os volumes restantes:

aws ec2 \
  describe-volumes \
  --query 'Volumes[].{Volume:VolumeId,State:State}'

Espere []: seu volume de dados foi excluído explicitamente e o volume raiz desta instância foi excluído no encerramento. Atualize AWS View e confirme que o servidor não é mais um destino em execução e que a lista de volumes está vazia. Mantenha a rede e o par de chaves preparados.

Resumo

Você criou um volume de dados EBS na mesma zona de disponibilidade de uma instância EC2, o anexou, formatou um sistema de arquivos vazio e o montou para a aplicação. Você verificou uma resposta real do relatório e depois desmontou, desanexou e excluiu o volume antes de encerrar o servidor.