Skip to content

afonsoaugusto/aws-glue-csv-parquet

Repository files navigation

aws-glue-csv-parquet

CircleCI Codacy Badge

Dando prosseguimento no projeto proposto no repositório data-engineer, apresento a solução utilizando AWS Glue e Terraform como ferramenta de provisionamento.

Submodulos do projeto

Utilizo um projeto meu base-ci só para ter o container base e algumas variaveis de ambiente durante a pipeline.

git submodule add [email protected]:afonsoaugusto/base-ci.git

git submodule update --init --recursive

Execução do projeto

Criação do usuário provisioner

Para executar o projeto é necessário realizar o deploy do mesmo. E para tal é necessário um usuário na AWS para ser responsavel por deployar o projeto.

Este projeto utiliza terraform para automação. E como backend é utilizado o s3. Portanto é necessário que seja disponbilizado um s3 que o usuário de deploy tenha privilégio de escrita e leitura.

O mesmo pode ser criado utilizando os comandos abaixo:

export BUCKET_NAME=glue-terraform-tfstate
aws s3api create-bucket --bucket $BUCKET_NAME --region us-east-1

aws s3api put-public-access-block \
    --bucket $BUCKET_NAME \
    --public-access-block-configuration "BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true"

aws s3api put-bucket-encryption \
    --bucket $BUCKET_NAME \
    --server-side-encryption-configuration '{"Rules": [{"ApplyServerSideEncryptionByDefault": {"SSEAlgorithm": "AES256"}}]}'
aws s3api put-bucket-tagging --bucket $BUCKET_NAME --tagging 'TagSet=[{Key=project,Value=aws-glue-csv-parquet}]'

export USERNAME_PROVISIONER=provisioner
aws iam create-user \
    --user-name $USERNAME_PROVISIONER \
    --tags Key=project,Value=aws-glue-csv-parquet

# obs: se o bucket utilizado não for o glue-terraform-tfstate, favor modificar no arquivo policy-provisioner.json e no vars.env

aws iam create-policy \
    --policy-name ${USERNAME_PROVISIONER}_basics \
    --policy-document file://policy-povisioner.json

export ACCOUNT_ID=`aws sts get-caller-identity --output text | awk '{print $1}'`
aws iam attach-user-policy \
    --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/${USERNAME_PROVISIONER}_basics \
    --user-name ${USERNAME_PROVISIONER}

aws iam create-access-key --user-name ${USERNAME_PROVISIONER}

# Para inativar (Inactive) ou ativar (Active) as credenciais, é apenas executar:

aws iam update-access-key \
    --access-key-id ACCESS_KEY_ID \
    --status Inactive --user-name ${USERNAME_PROVISIONER}

Para atualizar a policy caso necessário

export USERNAME_PROVISIONER=provisioner
export ACCOUNT_ID=`aws sts get-caller-identity --output text | awk '{print $1}'`
aws iam create-policy-version \
    --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/${USERNAME_PROVISIONER}_basics \
    --policy-document file://policy-povisioner.json \
    --set-as-default

aws iam list-policy-versions \
    --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/${USERNAME_PROVISIONER}_basics

aws iam delete-policy-version \
    --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/${USERNAME_PROVISIONER}_basics \
    --version-id v4

Deploy do ambiente

Após criar as credenciais para o usuário, o mesmo pode ser exportado as variaveis para executar o deploy:

export AWS_ACCESS_KEY_ID=<>
export AWS_SECRET_ACCESS_KEY=<>
export AWS_PAGER=""
export AWS_REGION=us-east-1

Após as variaveis estarem exportadas, o deploy pode ser feito com o comando make deploy.

O comando make deploy irá realizar o terraform plan e apply do projeto.

make deploy

cicleci

buckets

Executando os jobs

Após executar o deploy teremos:

Database glue

databases

Crawler glue

Crawler

Job glue

Job

Com estes objetos é necessário executar o crawler, que após ele executar teremos uma tabela adicionada no database.

aws glue get-crawler --output yaml --name aws-glue-csv-parquet --query 'Crawler.[Name, State]'
aws glue start-crawler --name aws-glue-csv-parquet

crawler-execution

table

table

Após o crawler terminar, podemos executar o job.

aws glue get-job --job-name aws-glue-csv-parquet --output yaml
aws glue start-job-run --job-name aws-glue-csv-parquet

getJob

jobExecution

jobExecution-terminal

Após a conclusão do job, teremos no folder output no bucket o resultado do etl.

bucket-output

Você pode copiar os arquivos localmente se preferir.

aws s3 sync s3://glue-terraform/data/output/ .

Estes passos poderiam ser invocados por lambda, trigger ou executados em um pipeline separado.

TODO

  • Separar os modulos em repositórios separados para reaproveitamento
  • Melhorar o template do modulo de iam para ser mais generico
  • Levar as definições criadas no Makefile (definições para terraform) para o projeto base-ci
  • Subir a versão do terraform devido a mesma que está sendo executada é a 12.29
  • Colocar na branch main o passo Plan
  • Após colocar passo plan no pipeline main, verificar se é necessário aprovação manual para o apply
  • Criar modulos para os itens referentes ao glue
  • Melhorar o script de etl passando vários valores como parametros
  • Adicionar anotações no script etl para ter o diagrama dinamico gerado pela interface do glue e também melhorar a documentação
  • Revisitar as definições de capacidade do glue, devido o mesmo estar com a minima capacidade possivel devido ao escopo do problema e preservar a minha conta

About

aws-glue-csv-parquet

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published