Crie um banco de dados PostgreSQL para uma aplicação

AWSBeginner
Pratique Agora

Introdução

Uma aplicação de pedidos precisa de um banco de dados relacional para armazenar pedidos de clientes. Neste laboratório, você criará um banco de dados PostgreSQL privado com o Amazon RDS, conectará um cliente SQL padrão e configurará a aplicação para usar o novo endpoint.

Você deve conhecer as sub-redes de VPC, os grupos de segurança e as conexões de aplicações dos cursos anteriores de VPC e EC2. O ambiente fornece a rede, a aplicação e a AWS CLI configurada. Não é necessária uma conta pessoal da AWS. Você removerá o banco de dados ao final.

Relação com certificações

Este laboratório oferece prática introdutória para os seguintes tópicos de exames.

Crie o banco de dados da aplicação

Nesta etapa, você criará uma instância privada PostgreSQL na rede de banco de dados preparada.

O Amazon RDS gerencia instâncias de bancos de dados relacionais. O PostgreSQL é o mecanismo que armazena tabelas e executa SQL. A AWS CLI gerencia o recurso do RDS; um cliente SQL conecta-se ao mecanismo para trabalhar com os dados. Criar uma instância do RDS e consultar uma tabela são operações diferentes.

O AWS Management Console é útil para explorar serviços e inspecionar recursos. A CLI é útil para consultas precisas, operações repetíveis e automação, embora sua sintaxe exija prática. Este curso usa o Terminal e o AWS View preparados. O AWS View mostra os recursos deste laboratório e os resultados da aplicação; ele é separado do AWS Management Console.

Comece no diretório de trabalho e carregue as configurações de conexão fornecidas:

cd /home/labex/project
source database.env

DB_SECURITY_GROUP_ID identifica as regras de acesso à rede preparadas para o banco de dados. PGSERVICEFILE e PGPASSFILE informam ao cliente PostgreSQL onde estão os arquivos comuns de conexão e senha. Mantenha os arquivos de senha privados; não é necessário exibir seu conteúdo.

Inspecione o grupo de sub-redes de banco de dados preparado:

aws rds \
  describe-db-subnet-groups \
  --db-subnet-group-name orders-subnets \
  --query 'DBSubnetGroups[].{Name:DBSubnetGroupName,VPC:VpcId,Subnets:Subnets[].SubnetIdentifier}'

Um grupo de sub-redes de banco de dados identifica as sub-redes de VPC disponíveis para o RDS. Este grupo contém sub-redes privadas de banco de dados em duas zonas de disponibilidade. Ter duas sub-redes no grupo não habilita, por si só, uma implantação Multi-AZ.

Crie a instância:

aws rds \
  create-db-instance \
  --db-instance-identifier orders-db \
  --db-instance-class db.t3.micro \
  --engine postgres \
  --engine-version 16.15 \
  --allocated-storage 20 \
  --master-username orders_admin \
  --master-user-password "$(cat db-password.txt)" \
  --db-name orders \
  --db-subnet-group-name orders-subnets \
  --vpc-security-group-ids "$DB_SECURITY_GROUP_ID" \
  --no-publicly-accessible \
  --backup-retention-period 0 \
  --query 'DBInstance.{Identifier:DBInstanceIdentifier,Status:DBInstanceStatus,Engine:Engine}'

O identificador da instância orders-db nomeia o recurso do RDS; o nome do banco de dados orders nomeia o banco PostgreSQL dentro dele. db.t3.micro seleciona uma classe de instância, e 20 é o tamanho de armazenamento solicitado em GiB. O acesso privado mantém as conexões da aplicação dentro da rede preparada. A retenção de backups automáticos está desabilitada para este exercício curto; um laboratório posterior ensina a criar um snapshot manual.

$(cat db-password.txt) fornece a senha preparada do banco de dados sem imprimi-la. Não cole senhas em anotações ou capturas de tela.

Aguarde a disponibilidade e consulte o endpoint de conexão:

aws rds \
  wait db-instance-available \
  --db-instance-identifier orders-db
aws rds \
  describe-db-instances \
  --db-instance-identifier orders-db \
  --query 'DBInstances[0].{Identifier:DBInstanceIdentifier,Database:DBName,Status:DBInstanceStatus,Endpoint:Endpoint}'

Espere encontrar o banco de dados orders, o status available e a porta PostgreSQL 5432. O endpoint é o endereço usado pelos clientes para selecionar esta instância de banco de dados. O AWS View deve listar orders-db como banco primário. A tabela de pedidos ainda não foi criada.

Conecte o cliente SQL e a aplicação

Nesta etapa, você testará o mecanismo de banco de dados e configurará seu endpoint na aplicação.

O psql é o cliente padrão de linha de comando do PostgreSQL. O serviço preparado chamado orders-db contém os dados de conexão da instância que você acabou de criar. Um nome de serviço é uma entrada conveniente de configuração do cliente; ele não é um recurso da AWS.

Uma conexão PostgreSQL privada precisa de endpoint acessível e porta permitida

Diagrama conceitual: Uma conexão PostgreSQL privada precisa de endpoint acessível e porta permitida.

Consulte o mecanismo:

psql \
  "service=orders-db" \
  --command 'SELECT current_database(), current_user;'

Espere encontrar o banco de dados orders e o usuário orders_admin. Esse resultado vem de uma conexão ao banco, e não dos metadados do recurso do RDS. O RDS gerencia o host do banco; as aplicações conectam-se pelo protocolo do banco de dados, sem acesso SSH ao host.

Obtenha o endpoint do RDS. --query seleciona um campo, --output text produz um valor simples, e $(...) do shell o salva em DB_ENDPOINT:

DB_ENDPOINT=$(aws rds \
  describe-db-instances \
  --db-instance-identifier orders-db \
  --query 'DBInstances[0].Endpoint.Address' \
  --output text)

Inspecione a configuração da aplicação fornecida:

cat app-config.json

read_host seleciona o banco para consultas, e write_host seleciona o banco para alterações. Por enquanto, ambos devem usar o primário. password_file referencia um arquivo privado em vez de incorporar uma senha neste documento JSON.

Use jq, uma ferramenta de edição de JSON, para definir os dois campos de host. Grave um novo arquivo e substitua a configuração somente após a edição ter sucesso:

jq \
  --arg host "$DB_ENDPOINT" \
  '.read_host = $host | .write_host = $host' \
  app-config.json > app-config.new
mv app-config.new app-config.json

Teste a conexão da aplicação:

curl \
  --silent \
  --show-error \
  --fail \
  http://127.0.0.1:8080/application/connection

Espere que database seja orders, user seja orders_admin e read_only seja false. O primário aceita gravações, mas este laboratório apenas estabelece a conexão. A lista de pedidos do AWS View continuará indisponível até existir uma tabela de pedidos; você criará essa tabela no próximo laboratório. Conexão ao PostgreSQL primário no AWS View

O exemplo mostra a aplicação conectada ao banco primário orders e ao endpoint nativo do RDS. A tabela de pedidos ainda não foi criada. Seus identificadores de recursos podem ser diferentes.

AWS Console: RDS

Exemplo da Console oficial: Endpoint e Port em Connectivity & security correspondem a Endpoint.Address e Endpoint.Port da CLI. O exemplo mostra MySQL e 3306; este laboratório usa PostgreSQL e 5432 com o endpoint retornado pelo seu comando. Não copie o hostname nem a porta do exemplo. Continue no Terminal e AWS View sem entrar na AWS.

Source: AWS RDS guide.

Remova a instância de banco de dados

Nesta etapa, você removerá o banco temporário, preservando a aplicação e a rede preparadas.

Exclua sua instância sem manter um snapshot final:

aws rds \
  delete-db-instance \
  --db-instance-identifier orders-db \
  --skip-final-snapshot \
  --query 'DBInstance.DBInstanceIdentifier'

--skip-final-snapshot descarta o banco deste exercício em vez de salvar uma cópia de recuperação. Para dados importantes, decida como preservar um backup antes de excluir uma instância.

Aguarde a exclusão e inspecione o inventário:

aws rds \
  wait db-instance-deleted \
  --db-instance-identifier orders-db
aws rds \
  describe-db-instances \
  --query 'DBInstances[].DBInstanceIdentifier'

Espere encontrar []. O AWS View deve mostrar nenhum banco de dados. O endpoint antigo da aplicação já não aponta para um banco existente, portanto uma falha de conexão é esperada após a exclusão. Mantenha o grupo de sub-redes, os grupos de segurança e os arquivos da aplicação fornecidos.

Resumo

Você criou uma instância privada RDS PostgreSQL, distinguiu seu identificador de recurso do nome do banco e inspecionou seu endpoint. Usou psql para consultar o mecanismo e conectou uma aplicação ao mesmo primário. Por fim, excluiu a instância, preservando a rede preparada.

O próximo laboratório cria uma tabela de pedidos e usa SQL para armazenar e consultar pedidos de clientes.