Bancos de Dados Relacionais (SQL) na AWS com Amazon RDS
Explorando o Amazon RDS, um serviço de provisionamente e gerenciamento de banco de dados relacional na AWS.
Serviços utilizados
Amazon RDS;
AWS Lambda; e
MySQL Workbench.
O que é um banco de dados relacional?
Um banco de dados relacional é um mecanismo de armanezamento que permite a persistência de dados e opcionalmente implementar funcionalidades, armazenando os dados em tabelas, que possuem relacionamentos entre si.
Tabelas de um banco de dados relacional
São organizadas em colunas, onde cada coluna armazena um tipo de dados;
Os dados são armazenados em linhas da tabela;
Possuem uma chave primária (PK) que identificam de forma única cada registro de uma linha;
Possuem chaves estrangeiras (FK) que estabelecem o relacionamento entre tabelas; e
Utilizam índices para pesquisa rápida de dados.
Relacionamento entre tabelas em um banco de dados relacional
1:1 duas tabelas se relacionam de forma direta onde a chave primária de uma tabela é utilizada uma única vez em outra.
1:n duas tabelas se relacionam de forma direta onde a chave primária de uma tabela é utilizada várias vezes em outra.
n:n acontece de forma indireta entre duas tabelas, gerando de uma terceira tabela. Na prática ocorrem dois ou mais relacionamentos um para vários.
Sobre o Amazon RDS
O Amazon Relational Database Service (Amazon RDS) facilita a configuração, a operação e a escalabilidade de bancos de dados relacionais na nuvem. Fornece capacidade econômica e redimensionável e automiza o provisionamento de hardware, configuração de bancos de dados, aplicação de patches e backups.
Mecanismos de banco de dados na Amazon RDS: Amazon Aurora, PostgreSQL, MySQL, MariaDB, Oracle e SQL Server.
Preços do Amazon RDS
Preços baseados na dimensão de instâncias EC2
Free tier: 750 horas de uso de instâncias db.t2.micro Single-AZ do Amazon RDS, 20 GB de armazenamento de banco de dados de SSD e 20 GB de armanezamento de backup.
Documentação da AWS sobre o Amazon RDS
Atividade prática
Criar uma instância RDS;
Acessar com o MySQ Workbench e criar tabelas e inserir dados;
Criar uma função Lambda para consultar dados em tabelas do RDS; e
Código do instrutor
Criando queries
- Criar um database:
CREATE DATABASE PERMISSIONS_DB;
- Acessar o db criado:
USE PERMISSIONS_DB;
- Criar uma tabela de usuários:
CREATE TABLE user (
id bigint(20) NOT NULL,
email varchar(40) NOT NULL,
username varchar(15) NOT NULL,
password varchar(100) NOT NULL,
PRIMARY KEY (id)
);
- Criar uma tabela de carrinho de compras:
CREATE TABLE role (
id bigint(20) NOT NULL,
name varchar(60) NOT NULL,
PRIMARY KEY (id)
);
- Criar uma tabela user roles:
CREATE TABLE user_roles (
user_id bigint(20) NOT NULL,
role_id bigint(20) NOT NULL,
FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE RESTRICT ON UPDATE CASCADE,
FOREIGN KEY (role_id) REFERENCES role (id) ON DELETE RESTRICT ON UPDATE CASCADE,
PRIMARY KEY (user_id, role_id)
);
- Descrição da tabela:
DESC user
- Inserindo dados em tabelas:
INSERT INTO user VALUES (1, '[email protected]', 'Lucas', 'strongpasswd');
INSERT INTO user VALUES (2, '[email protected]', 'Igla', 'strongpasswd');
INSERT INTO role VALUES (3, 'ADMIN');
INSERT INTO role VALUES (4, 'USER');
INSERT INTO user_roles VALUES (1, 3);
INSERT INTO user_roles VALUES (1, 4);
INSERT INTO user_roles VALUES (2, 4);
- Verificando:
SELECT * FROM user_roles;
- Selecionando dados da tabela associativa:
SELECT user.id, user.email, user.username, role.id AS role_id, role.name AS role_name
FROM user
JOIN user_roles on (user.id=user_roles.user_id)
JOIN role on (role.id=user_roles.role_id);
Configurando permissões de acesso ao RDS
Selecionar a função criada -> Configuration -> Permissions -> Selecionar a função criada e abrir no console do AWS IAM; e
Attach policies -> Pesquisar pela policy AWSLambdaVPCAccessExecutionRole -> Attach policy.
import json
import pymysql
endpoint = 'endpoint-name'
username = 'user-name'
password = 'user-password'
database_name = 'db-name'
connection = pymysql.connect(host=endpoint, user=username, password=password, db=database_name)
def lambda_handler(event, context):
cursor = connection.cursor()
cursor.execute('SELECT user.id, user.email, user.username, role.id AS role_id, role.name AS role_name FROM user JOIN user_roles on (user.id=user_roles.user_id)JOIN role on (role.id=user_roles.role_id)')
rows = cursor.fetchall()
return {
'statusCode': 200,
'body': json.dumps(rows)
}
pip install pymysql -t .
explorer .