Skip to content

Commit

Permalink
O trampo foi terminado
Browse files Browse the repository at this point in the history
  • Loading branch information
anselmo committed Jan 15, 2024
1 parent dcbb306 commit e4c2fde
Show file tree
Hide file tree
Showing 2,613 changed files with 317,790 additions and 7 deletions.
228 changes: 228 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,228 @@
Bem vindo ao meu projetinho malandro...

# Criptografia Unificada feat. (Unity Catalog e DBT)
* **Criado por:** Anselmo Borges
* **Data de criação:** 12.01.2014
* **Ultima atualização:** 14.01.2014

Esse projeto foi criado com o intuito de validar uma POC de integração entre clouds usando o Unity Catalog e acabou virando bem mais que isso, acabei resolvendo um problema antigo que tinha na Porto que era a ineficiencia de comunicação entre lakes Cloud. Na Porto o primeiro lake de dados nasceu na GCP e com o tempo outras fontes de dados foram surgindo como Azure e AWS, havendo hoje dados nas 3 clouds que não se falam.

Fora isso existem dados no ambiente on premisses onde a ingestão vem ocorrendo parte na GCP e parte comigo na Azure.

## Features destravadas
Como disse nesse projeto acabamos de fazer uma série de coisas bacanas como:
* Na Azure:
* Configuração de Storage Account e containers (Metadados e Áreas Bronze e Silver)
* Criação do connector Databricks para o Unity Catalog
* Permissionamento no Storage Acccount
* Criação de Workspace Databricks
* Criação de Azure KeyVault, atribuição de privilégios para o managed identity do Databricks e secret

* No Databricks:
* Criação do Metastore do Unity Catalog e vinculo nas Workspaces
* Controle de acesso com grupos e usuários distintos por Workspaces
* Criação de External Storage para os Databases Bronze e Silver de acordo com os containers
* Criação de secret scope com Azure KeyVault
* Configuração do `databricks-cli`
* Criação de function SQL de criptografia no Unity Catalog
* Restrição de acessos a catalogos por Workspaces
* Restricão de usuários a determinados catalogos via Unity Catalog
* Criptografia de dados sensiveis
* Mascaramento de dados sensiveis por grupo de acesso
* Criação de External Catalogs (BigQuery e Redshift)

* No BigQuery:
* Criação de Dataset
* Crição de funções
* Geração de key json de acesso e privilégios necessários
* Salvamento de consultas e execução remota

* No Redshift
* Criação de ambiente Redshift
* Liberação de acesso publico via NSG
* Criação de função de criptografia

* No DBT-CORE:
* Minha primeira experiência real com DBT core (nem é a versão paga) e tô completamente apaixonado.
* Instalação do DBT-CORE local
* Conexão com as 3 bases do projeto (Databricks, BigQuery e Redshift)
* Ingestão de dados via `dbt seed`
* Criação de módulos e vinculo entre eles
* Customização em casos de multiplos Schemas
* Criação de documentação básica

**POUCA COISA NÉ! E ISSO ACONTECEU TUDO NUM FINAL DE SEMANA OCIOSO!**

## Desenho do projeto
Segue abaixo um desenho para um entendimento melhor do projeto e o que vamos fazer.

![Desenho da arquitetura proposta](imagens/criptografia_unificada.jpg "Diagrama de Dados")

## Cronograma
O passo a passo para a construção desse ambiente vai partir do pré requisito que ja temos algumas das peças configuradas (pra efeito de uma apresentação mais rápida), com o tempo vou criando um roteirinho de como montei do zero, mas vou levar em consideração que você:

* Já tem o Big Query, user de serviço e a chave JSON criados
* Já tem o Redshift e liberou acesso público
* Já tem o Storage Account, containers e privilégios setados
* Já criou o Unity catalog nos 2 Workspaces
* Já configurou os grupos de acessos
* Já criou os SQL Warehouses nos 2 Workspaces e já mudou pra Premium pra usar serveless
* Já tem os Tokens Databricks em mãos
* Já criou os externals Catalogs e Externals storages no Unity
* Já criou os Catalogos
* cat_bq_rescue
* cat_rs_rescue
* engenharia (o da função)
* rescue
* Ja criou os Databases no catalogo rescue
* bronze (apontando pro external storage do container bronze)
* silver (apontando pro external storage do container silver)
* Já instalou o DBT Core e os plugins para:
* Redshift
* Databricks
* Big Query
* Ja configurou as conexões com os 3 bancos

Peço desculpas não mostrar esses pontos agora, preciso fazer a apresentação dessa solução na Porto essa semana, mas depois acrescento esses materiais não menos importantes pra que você possa simular ai no seu ambiente e ficar feliz igual eu tô.

![Felizão](https://media.giphy.com/media/GS9pfaxQj5hPKFGGp8/giphy.gif "Felizão")

Então sem demora vamos começar pelo BigQuery:

### Big Query
Vamos partir do principio que o BigQuery tá zerado e você tem todos os privilégios de BigQuery Admin.

#### Criando o schema de engenharia e a função
Nos 3 ambientes vamos criar um schema de engenharia, esse schema tem o intuito de armazenar a função de criptografia `encrypt`, a idéia e pra segmentar acesso já que ela tem uma chave que pode ser vista caso o usuário tenha acesso a ela, a ideia é que só o usuário do pipe tenha privilégio a ela e mais ninguem, ou seja, bronze e silver é de engenharia e engenharia deveria pelo menos ser autimatizada.

Vamos rodar o script abaixo via UI do BigQuery mesmo:
```
Create schema engenharia;
CREATE OR REPLACE FUNCTION `integracao-bq.engenharia.encrypt`(input_string STRING) RETURNS STRING AS (
(SELECT TO_HEX(MD5(CONCAT(input_string, 'E3GD8uPL0AFwLbYtGQx1HHqOvZ9jROnAnEbtUSLdhyI'))))
);
```
Esse comando cria tanto o schema quanto a função.

No BigQuery encerramos por enquanto.

### Redshift:
No Redshift também vamos partir do principio que você tem os acessos necessários e está acessando pelo Query Editor V2 (é um editor nativo da AWS pra rodar as queries no Redshift)

Rode o comando abaixo para criar o database `rescue`:
```
create database "rescue";
```
Altere agora no Query editor o Database que você está logado vai aparecer `rescue` e `dev`, escolha `rescue` e em seguida rode esse novo comando para criar os schemas `tools`,`bronze` e `silver`.
```
create schema tools;
create schema bronze;
create schema silver;
```
Agora com os schemas criados crie a função:

```
CREATE OR REPLACE function engenharia.tools.crypto(input_string VARCHAR)
RETURNS VARCHAR
IMMUTABLE
LANGUAGE plpythonu
AS $$
import hashlib
key = 'E3GD8uPL0AFwLbYtGQx1HHqOvZ9jROnAnEbtUSLdhyI'
salted_text = input_string + key
hashed_text = hashlib.md5(salted_text.encode()).hexdigest()
return hashed_text
$$;
```
Feito isso encerramos no Redshift também por enquanto.

### Databricks
Já deixei pronto o catalogo `rescue` e os databases `bronze`, `silver` e `gold` (sim, aqui vai ter o Gold, pois vamos criar nosso Golden Record), pois os mesmos tem uma configuração especifica que apontam para um external storage que criei. O catalogo e o database de engenharia já não tem muito luxo e podemos criar tudo via comando.

```
create catalog engenharia;
create schema engenharia.tools;
CREATE OR REPLACE FUNCTION engenharia.tools.encrypt(input_string STRING)
RETURNS STRING
LANGUAGE PYTHON
AS $$
import hashlib
key = 'E3GD8uPL0AFwLbYtGQx1HHqOvZ9jROnAnEbtUSLdhyI'
salted_text = input_string + key
hashed_text = hashlib.md5(salted_text.encode()).hexdigest()
return hashed_text
$$;
```
Bem mais fácil no Databricks! Encerramos por aqui também!

### DBT
Agora que já temos os 3 bancos das 3 cloud preparados com os databases e funções de criptografia criados, estou partindo da premissa que os 3 projetos daqui já estão configurados com seus respectivos databases:
* **bronze_adb** - Conectado com o Databricks
* **bq_create** - Conectado com o BigQuery
* **rs_create** - Conectado com o Databricks


A ordem que vamos rodar será a seguinte:
1. BigQuery
2. RedShift
3. Databricks

Vamos levar em consideração que o nosso diretório rais é o `dbtzin` as respectivas pastas de cada projeto estão nesse diretório.

#### BigQuery
Pra entrar na pasta dê um `cd bq_create` e vamos rodar 2 comandos (se você não rodar na pasta vai dar merda, pois ele não encontra o `dbt_project.yml`):
* `dbt seed` - Comando mais que malandro que já faz a ingestão do nosso dado pra tabela Bronze
* `dbt run` - Comando que roda o pipeline real, ele cria a tabela silver já usando a function de criptografia.

Vamos rodar 2 comandinhos extra que vai gerar a documentação pra gente dar uma olhada:
* `dbt docs generate` - gera a documentação das tabelas criadas
* `dbt docs serve` - Sobe um serviço web na porta 8080 pra visualizar a documentação, pra sair basta dar `CTRL + C`

Com isso criamos as 2 tabelas dá uma conferida lá que foda, ele cria também um schema MAIUSCULO que vou explicar quando chegar no Databricks.

#### Redshift
Pra entrar na pasta dê um `cd rs_create` e vamos rodar 2 comandos (se você não rodar na pasta vai dar merda, pois ele não encontra o `dbt_project.yml`):
* `dbt seed` - Comando mais que malandro que já faz a ingestão do nosso dado pra tabela Bronze. Eu achei muito foda ele fazer isso no Redshift pois a primeira vez que fiz, fiz na mão, foi um parto, IAM, editor de bosta do Redshift e mais dor de cabeça, por ai o cara sobe liso e em segundos. DBT é vida <3
* `dbt run` - Comando que roda o pipeline real, ele cria a tabela silver já usando a function de criptografia.

Vamos rodar 2 comandinhos extra que vai gerar a documentação pra gente dar uma olhada:
* `dbt docs generate` - gera a documentação das tabelas criadas
* `dbt docs serve` - Sobe um serviço web na porta 8080 pra visualizar a documentação, pra sair basta dar `CTRL + C`

Com isso criamos as 2 tabelas, uma no schema bronze e a criptografada na silver.

#### Databricks:
Por fim vamos fazer tudão, mas vou explicar o que esse do Databricks faz:
1. Ele não puxa os dados usando seed, optei por fazer uma copia do external catalog do Unity com a base fo BigQuery só pra você pirar no poder disso.
2. Ele cria a camada silver já criptografando
3. Vamos rodar um outro projeto chamado `gold_adb` que vai cria nosso golden record, mas jájá falamos dele.

Vamos por pra rodar então:
Pra entrar na pasta dê um `cd bronze_adb` (não mudei o nome que fiquei com preguiça) e vamos rodar 2 comandos (se você não rodar na pasta vai dar merda, pois ele não encontra o `dbt_project.yml`):
* `dbt run` - Comando que roda o pipeline real, ele cria a tabela silver já usando a function de criptografia e nesse caso faz a gold também.

Vamos rodar 2 comandinhos extra que vai gerar a documentação pra gente dar uma olhada:
* `dbt docs generate` - gera a documentação das tabelas criadas
* `dbt docs serve` - Sobe um serviço web na porta 8080 pra visualizar a documentação, pra sair basta dar `CTRL + C`

Valide se criou tudo nos 3 bancos, veja se está tudo certinho (eu sei que tá, rs) e vamos rodar a Gold que faz o que?

**Criamos o nosso produto de dados na camado gold, fazendo um Join das 3 tabelas (Databricks, RedShift e BigQuery, fala se não é foda?). Vou além, ele faz o Join pela chave de criptografia UNICA nas 3!**

![RECEBA](https://media.giphy.com/media/1ngaeOmc6GLqY2qly4/giphy.gif "Obrigado meu Deus!")

Pra entrar na pasta dê um `cd gold_adb` e vamos rodar 1 comando (se você não rodar na pasta vai dar merda, pois ele não encontra o `dbt_project.yml`):
* `dbt run` - Comando que faz o Join da porra toda e gera a tabela no catalogo negócios e no database Gold.

Vamos rodar 2 comandinhos extra que vai gerar a documentação pra gente dar uma olhada:
* `dbt docs generate` - gera a documentação das tabelas criadas
* `dbt docs serve` - Sobe um serviço web na porta 8080 pra visualizar a documentação, pra sair basta dar `CTRL + C`



33 changes: 33 additions & 0 deletions bq_create/models/rescue/maiuscula/DADOS_EJA.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/*
O Parametro config entra com configurações especificas desse modelo,
por exemplo, o nome desse arquivo é tbronze.sql, porém quero que a
tabela criada se chame dados_eja, outro detalhe é que a conexão padrão
com o Fatabricks foi realizada no schema 'default', eu quero que a tabela
seja criada no schema 'bronze'.
As informações que estiverem aqui, sobressaem o arquivo dbt_preject.yml.
*/

/*
Ou seja no config abaixo:
- schema: quero que meu schema seja o bronze
- alias: quero que o nome dessa tabela no schema bronze seja dados_eja
- materialized: quero que o objeto gerado no banco de dados seja uma tabela
*/

{{ config(schema='MAIUSCULA', alias='DADOS_EJA') }}

with dados_eja as (
select
TOTAL_REGISTOS,
ESCOLA,
engenharia.encrypt(cast(INEP as string)) as INEP,
ANO,
VALOR_DESTINADO,
'São Sebastião' as CIDADE,
'São Paulo' as ESTADO
from bronze.dados_eja
)

select *
from dados_eja
18 changes: 18 additions & 0 deletions bq_create/models/rescue/maiuscula/schema.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
models:
- name: dados_eja
description: "Tabela Silver no Big Query com dados do EJA importados da camada Bronze, adicionamos as coluna CIDADE e ESTADO e criptografamos a coluna INEP com MD5"
columns:
- name: TOTAL_REGISTOS
description: "Total de registros encontrados do incentivo"
- name: ESCOLA
description: "Escola incluida no projeto"
- name: INEP
description: "Código INEP da escola (Agora criptografado na Silver com MD5)"
- name: ANO
description: "Ano do Incentivo"
- name: VALOR_DESTINADO
description: "Valor total do incentivo"
- name: CIDADE
description: "Cidade da Escola"
- name: ESTADO
description: "Estado da Escola"
63 changes: 58 additions & 5 deletions bronze_adb/README.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,63 @@
Welcome to your new dbt project!
Bem vindo ao meu projetinho malandro...

### Using the starter project
# Criptografia Unificada feat. (Unity Catalog e DBT)
* **Criado por:** Anselmo Borges
* **Data de criação:** 12.01.2014
* **Ultima atualização:** 14.01.2014

Esse projeto foi criado com o intuito de validar uma POC de integração entre clouds usando o Unity Catalog e acabou virando bem mais que isso, acabei resolvendo um problema antigo que tinha na Porto que era a ineficiencia de comunicação entre lakes Cloud. Na Porto o primeiro lake de dados nasceu na GCP e com o tempo outras fontes de dados foram surgindo como Azure e AWS, havendo hoje dados nas 3 clouds que não se falam.

Fora isso existem dados no ambiente on premisses onde a ingestão vem ocorrendo parte na GCP e parte comigo na Azure.

## Features destravadas
Como disse nesse projeto acabamos de fazer uma série de coisas bacanas como:
* Na Azure:
* Configuração de Storage Account e containers (Metadados e Áreas Bronze e Silver)
* Criação do connector Databricks para o Unity Catalog
* Permissionamento no Storage Acccount
* Criação de Workspace Databricks
* Criação de Azure KeyVault, atribuição de privilégios para o managed identity do Databricks e secret

* No Databricks:
* Criação do Metastore do Unity Catalog e vinculo nas Workspaces
* Controle de acesso com grupos e usuários distintos por Workspaces
* Criação de External Storage para os Databases Bronze e Silver de acordo com os containers
* Criação de secret scope com Azure KeyVault
* Configuração do `databricks-cli`
* Criação de function SQL de criptografia no Unity Catalog
* Restrição de acessos a catalogos por Workspaces
* Restricão de usuários a determinados catalogos via Unity Catalog
* Criptografia de dados sensiveis
* Mascaramento de dados sensiveis por grupo de acesso
* Criação de External Catalogs (BigQuery e Redshift)

* No BigQuery:
* Criação de Dataset
* Crição de funções
* Geração de key json de acesso e privilégios necessários
* Salvamento de consultas e execução remota

* No Redshift
* Criação de ambiente Redshift
* Liberação de acesso publico via NSG
* Criação de função de criptografia

* No DBT-CORE:
* Minha primeira experiência real com DBT core (nem é a versão paga) e tô completamente apaixonado.
* Instalação do DBT-CORE local
* Conexão com as 3 bases do projeto (Databricks, BigQuery e Redshift)
* Ingestão de dados via `dbt seed`
* Criação de módulos e vinculo entre eles
* Customização em casos de multiplos Schemas
* Criação de documentação básica

**POUCA COISA NÉ! E ISSO ACONTECEU TUDO NUM FINAL DE SEMANA OCIOSO!**

## Desenho do projeto
Segue abaixo um desenho para um entendimento melhor do projeto e o que vamos fazer.

![Desenho da arquitetura proposta](imagens/criptografia_unificada.jpg "Diagrama de Dados")

Try running the following commands:
- dbt run
- dbt test


### Resources:
Expand Down
2 changes: 1 addition & 1 deletion bronze_adb/models/rescue/bronze/tbronze.sql
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@

with bronze as (
select *
from cat_bq_rescue.bq_databricks.dados_eja
from cat_bq_rescue.bronze.dados_eja
)

select *
Expand Down
Binary file added dbtzin/bin/__pycache__/jp.cpython-38.pyc
Binary file not shown.
Loading

0 comments on commit e4c2fde

Please sign in to comment.