Servicios usados para un Data Lake en AWS
Tags: datalake, aws, athena, iam
Published: 2024-03-12 09:45:48

Este artículo no es una guía, sino una serie de anotaciones de los servicios usados para montar un data lake con AWS. Partiendo de datos extraídos de una base de datos Amazon Aurora PostgreSQL, del que ya facilité [el script usado](https://dev.to/daniconil/un-script-para-exportar-selectivamente-tablas-de-una-bd-en-aws-25l3) en este mismo espacio, y un esquema previo, fuimos preparando esta plataforma. Por mi parte, mi rol fue el de habilitar los flujos y las automatizaciones. Uno de los puntos en los que se dedicó más tiempo fue a afinar permisos para evitar posibles agujeros de seguridad.

Pero, ¿qué es un data lake? Se trata de un repositorio en el que se almacenan datos en bruto con los que obtener información, a través de analítica y "cocina", para facilitar la toma de decisiones, ya sean estratégicas o de marketing.

Como decía al principio, la información expuesta abajo son apuntes de los servicios usados, descartes y precisiones que se hicieron, especialmente en el AWS Identity and Access Management (IAM) para determinar los roles. 

<aside>⚠️ Este proyecto partió de cero con un esquema que fue modificándose con el tiempo haciéndolo más sencillo. Los nombres de los roles son ejemplos.</aside>

Hecha la introducción, y recordando que ya subí el [script](https://dev.to/daniconil/un-script-para-exportar-selectivamente-tablas-de-una-bd-en-aws-25l3) con el que se extraían los datos de una instancia de Amazon Aurora PostgreSQL (RDS), comento los servicios usados:

## IAM

AWS Identity and Access Management (IAM) es un servicio web que lo ayuda a controlar de forma segura el acceso a los recursos de AWS. Con IAM, puede administrar de forma centralizada los permisos que controlan a qué recursos de AWS pueden acceder los usuarios. Utilice IAM para controlar quién está autenticado (ha iniciado sesión) y autorizado (tiene permisos) para utilizar recursos.

### Roles

De nombre AWSGlueServiceRole-crawlers, estos son los permisos asociaciados a este rol: 

1. AWSCodeCommitFullAccess (AWS managed)
2. AWSGlueServiceRole (AWS managed)
3. AWSGlueServiceRole-crawlers-s3Policy (Customer managed, expuesto más abajo)
4. AWSKeyManagementServicePowerUser (AWS managed)

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "databrew.amazonaws.com",
          "kms.amazonaws.com",
          "glue.amazonaws.com",
          "codecommit.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

### Policies

**AWSGlueServiceRole-ics-glue**

Rol para albergar la calendarización con permisos de tomar y depositar objetos en un bucket S3.

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::calendar-files-eu*"
      ]
    }
  ]
}
```

**AWSGlueServiceRole-crawlers-EZCRC-s3Policy**

Recuerdo que nos tomó cierto tiempo hasta descubrir que era imprescindible indicar las acciones `Encrypt` y `Decrypt` de manera explícita.

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObject",
        "kms:GenerateDataKey",
        "kms:Encrypt",
        "kms:Decrypt"
      ],
      "Resource": [
        "arn:aws:kms:us-west-2:[AWS_ID]:key/[appflow-key]",
        "arn:aws:kms:us-west-2:[AWS_ID]:key/[rds_key]",
        "arn:aws:kms:us-west-2:[AWS_ID]:key/[ssh_key]",
        "arn:aws:s3:::datalake/ga4-funnel-events-flow/",
        "arn:aws:s3:::datalake/ga4-user-ids-flow/",
        "arn:aws:s3:::datalake/ga4-user-engagement-flow/",
        "arn:aws:s3:::datalake/ga4-traffic-flow/",
        "arn:aws:s3:::datalake/ga4-user-searches-flow/",
        "arn:aws:s3:::datalake/ga4-destinations-flow/",
        "arn:aws:s3:::datalake/ga4-listing-views-referrers-flow/",
        "arn:aws:s3:::datalake/raw_internal/export/",
        "arn:aws:s3:::datalake/processed_data/*"
      ]
    }
  ]
}
```
**Nota:** `ga4` es la implementación de Google Analytics 4.

## KMS

AWS KMS sirve para cifrar datos en sus cargas de trabajo de KMS, firmar datos de manera digital, cifrar dentro de sus aplicaciones con SDK de cifrado de AWS y generar y verificar códigos de autenticación de mensajes. En el JSON de arriba aparecen expuesto tres, que están descritos en este apartado. El KMS viene representado por una ristra de números y caracteres típico de una clave pública. En este caso, lo hemos cambiado por el nombre y puesto entre corchetes para indicar que en realidad es otro dato el que debería ir ahí y que, por seguridad, no se expone. 

- **appflow_key**, se trata de la clave que autoriza el acceso de servicios externos como Google Analytics. Más información en la [sección de Integración de SaaS de AWS](https://aws.amazon.com/es/appflow/). 
- **rds_key**, la clave de autorización del intercambio de información desde una instancia del servicio RDS.
- **ssh_key**, la conexión con las instancias.

## CodeCommit

Este servicio es un repositorio de código, usado para alojar las versiones de los distintos scripts usados por la persona que ostente el rol de analista. CodeCommit es sencillo de implementar y automatiza cualquier cambio desde Athena, es decir, si se modifica el script, esta acción conlleva hacer git add, commit y push. No consume apenas porque para este cometido no llega a superar la capa gratuita de AWS. Dentro de Glue cabe también la posibilidad de usar GitHub, pero preferimos usar el nativo de AWS. 

## Glue

AWS Glue es un servicio de integración de datos sin servidor que facilita a los usuarios de análisis descubrir, preparar, migrar e integrar datos de varios orígenes. Puede utilizarlo para análisis, machine learning y desarrollo de aplicaciones. También incluye herramientas adicionales de productividad y operaciones de datos para la creación, la ejecución de trabajos y la implementación de flujos de trabajo empresariales. 

Como sysadmin, se me escapa el uso más allá de acceder a él para preparar las automatizaciones con otros servicios.

## DataBrew

Este servicio fue descartado porque conseguimos extraer la información directamente de la base de datos en un formato, .parquet, que le venía bien al analista de datos. 

## S3

Servicio de alojamiento donde albergar la información. Tanto en el script como en estas notas tiene el nombre raíz de "datalake".

## Athena

Amazon Athena es un servicio de análisis interactivo y sin servidor creado en marcos de código abierto, lo que lo hace compatible con formatos abiertos de archivos y tablas. Athena proporciona un método simplificado y flexible de analizar petabytes de datos donde residan. Analice datos o cree aplicaciones a partir de un lago de datos de Amazon Simple Storage Service (S3) y más de 30 orígenes de datos, que incluyen orígenes de datos en las instalaciones u otros sistemas en la nube que usan SQL o Python.

En nuestro caso, comenzamos implementando Athena conectándolo a la base de datos vía Metabase con el conector oficial.

[Amazon Athena](https://www.metabase.com/docs/latest/databases/connections/athena)

## Script de exportación

Alojado en una instancia EC2 y programado, en estas notas ha sido enlazado en más de una ocasión y qué menos que indicarlo aquí también como otro de los requisitos:

[Un script para exportar selectivamente tablas de una BD en AWS](https://dev.to/daniconil/un-script-para-exportar-selectivamente-tablas-de-una-bd-en-aws-25l3). 

---

Termino recordando de qué se trata este artículo, son el esbozo de unas anotaciones para construir un data lake con AWS del que partimos con más corazón que conocimientos y un esquema que fue modificándose poco a poco.