Python¶
Introdução¶
Pensando em aumentar a legibilidade, manutenção e organização do código. O código em python está separado em 3 partes:
python\engdados\s3_redshift_load_files.py
: Script main, contendo de forma resumida o código sem detalhes das funções.python\engdados\mod_terraform.py
: módulo contendo algumas poucas funções para auxiliar com os arquivos do terraform.python\engdados\mod_aws.py
: módulo contendo algumas funções para auxiliar nos recursos da AWS.
Módulos¶
Nos trechos abaixo, as funções vão apresentar os módulos na frente, por exemplo: m_tf.get_path_s3()
.
módulo | abreviação |
---|---|
mod_terraform | m_tf |
mod_aws | m_aws |
Imports¶
Imports utilizados no desenvolvimento. Sobre a instalação dos imports, favor verificar o tópico requirements. Caso tenha dificuldades em ler conteúdos em inglês, sugiro utilizar o navegador google chrome para visualização das documentações.
Imports | descrição | documentação |
---|---|---|
boto3 | AWS SDK for Python (Boto3) para criar, configurar e gerenciar serviços da AWS | AWS SDK for Python (Boto3) |
pandas | Ferramenta de análise e manipulação de dados de código aberto rápida, poderosa, flexível e fácil de usar, construída sobre a linguagem de programação Python | Guia do usuário |
io | O módulo fornece as principais facilidades do Python para lidar com vários tipos de E/S | io Python |
json | A biblioteca json nos permite poder analisar JSON | json Python |
psycopg2 | Adaptador de banco de dados PostgreSQL | Official Psycopg |
logging | Este módulo define funções e classes que implementam um sistema flexível de registro de eventos para aplicativos e bibliotecas. | logging Python |
Requirements¶
Requerimentos utilizados e que necessitam de instalação.
Como faço para instalar os requerimentos?
Para instalação de requirements utilize o seguinte comando:
Ambiente virtual¶
Sobre comandos de criação, ativação e desativação de ambiente virtual. Caso já tenha conhecimento, basta pular para o conexão aws.
Como usar o ambiente virtual?
criar:
ativar: desativar:Conexão AWS¶
Para a conexão estarei utilizando o boto3
.
Estarei utilizando o profile_name
para realizar a sessão e posteriomente o cliente.
Necessita da CLI AWS
Pegando os arquivos terraform.tfstate¶
Fiz a leitura buscando em 2 lugares diferentes. A primeira parte é identificação válida dos arquivos (verificar se existem), então foram criadas 2 funções com buscas de caminhos específicos: m_tf.get_path_s3()
e m_tf.get_path_redshift()
. Ambas retornam os caminhos (path) dos arquivos.
A segunda parte é a leitura dos arquivos identificados. Foram criadas outras 2 funções com parâmetros específicos para cada uma: m_tf.read_s3_tfstate_backend()
e m_tf.read_redshift_tfstate()
. Ambas retornam informações, por exemplo: região do redshift, região do bucket backend (remote state), etc.
# 1- Pega o diretório dos arquivos, valida e guarda as informações básicas em novas variáveis
path_s3 = m_tf.get_path_s3()
path_redshift = m_tf.get_path_redshift()
## 1.1- s3
backend_details = m_tf.read_s3_tfstate_backend(f"{path_s3}")
backend_bucket, backend_region, backend_key = backend_details
## 1.2- redshift
redshift_details = m_tf.read_redshift_tfstate(f"{path_redshift}")
redshift_iam_arn, redshift_secrete_name, redshift_region_name = redshift_details
code function get_path_s3()
code function get_path_redshift()
code function read_s3_tfstate_backend()
code function read_redshift_tfstate()
Pegar arquivos armazenados no bucket S3¶
Para identificar objetos no S3, precisamos do nome do bucket e dos arquivos a serem lidos. Para facilitar esse processo, foi criada a função m_aws.get_bucket()
. Essa função precisa de informações como o nome do bucket compartilhado, a chave do bucket backend e a conexão do cliente s3. Ela retornará o nome do bucket que armazena os objetos.
A função m_aws.get_csv_s3()
verifica e lista os objetos com extensão '.csv' ou '.CSV', retornando a lista de objetos.
code function get_bucket()
code function get_csv_s3()
Pegar dados armazenados no Secrets Manager¶
Para dar prosseguimento precisamos recuperar alguns dados sensíveis adicionados no secrets manager, então foi criado a função m_aws.get_secrets_redshift()
com objetivo de recuperar essas informações e armazená-las para o próximo passo.
A conexão com banco do redshift é feita, nesse projeto, pelo uso do psycopg2. Utilizando as informações recuperadas pela função m_aws.get_secrets_redshift()
.
# 4- Acessando e pegando os valores guardados do Redshift no Secrets Manager
client_secret = session.client('secretsmanager', region_name=redshift_region_name)
secrets_manager_details = m_aws.get_secrets_redshift(client_secret, redshift_secrete_name)
redshift_db_name, redshift_db_user, redshift_db_password, redshift_db_port, redshift_db_host = secrets_manager_details
# 5- conexão ao banco
rd_con = psycopg2.connect(host=redshift_db_host, database=redshift_db_name,
user=redshift_db_user, password=redshift_db_password, port=redshift_db_port)
rd_con.autocommit = True
cur = rd_con.cursor()
code function get_secrets_redshift()
Criação de usuários, grupos e vinculos¶
A função m_aws.create_users_redshift()
tem como objetivo criar os usuários, grupos e realizar vinculos entre as partes.
Por último a limpeza do arquivo com dados do secrets manager.
code function create_users_redshift()
Permissões aos grupos e listagem de pastas¶
Lembra que criamos os usuários e grupos de usuários? Então, estaremos realizando a primeira parte das permissões para os usuários criados, após essa etapa será realizado a preparação para os nomes das pastas.
Para adição de permissões, a função m_aws.give_permissions_database()
receberá a conexão, o nome do banco de dados e nome do grupo.
A função m_aws.get_folder()
pega a primeira parte do diretório da lista de objetos e armazena em SCHEMAS_REDSHIFT
.
code function give_permissions_database()
code function get_folder()
Criação e Permissões para Schemas¶
Nessa etapa criaremos os schemas e adicionaremos as permissões para os usuários do grupo 'transformers'.
A função m_aws.create_schema_redshift()
cria os schemas com base nos diretórios armazenados em schemas_redshift
.
Os Tranformadores precisam de acesso aos schemas criados, pois vão trabalhar com todas as tabelas existentes. A função m_aws.give_permission_schemas()
visa permitir ao grupo selecionado tenha permissões, além de fazer com que o redshift_db_user
ganhe privilégios para as novas tabelas criadas.
code function create_schema_redshift()
code function give_permission_schemas()
Criação das tabelas e copy¶
A função m_aws.csv_to_redshift()
é um pouco maior, ela contém outras funções em seu corpo. Em resumo ela pega o objeto, faz a leitura utilizando o io.BytesIO()
, verifica quais são os delimitadores dos objetos .csv
, qual o tipo de dado da coluna, qual o tamanho máximo nos registros da coluna e realiza o copy dos dados para o Redshift.
code function csv_to_redshift()
Check Objetivos¶
Os ícones são os finalizados e os são os em abertos.
- Pegar dados dos arquivos terraform.tfstate
- Pegar os arquivos csv's armazenados na amazom S3
- Pegar dados armazenados no Secrets Manager
- Criar usuários, grupos e vínculos
- Permissões aos grupos e listagem de pastas
- Permissões e criação de schemas
- Criação das tabelas e copy
- Refatorar os módulos mod_aws e mod_terraform