Simple ETL
Esta guía te muestra cómo construir un pipeline de procesamiento de archivos usando AWS S3, Lambda y DynamoDB localmente con LocalStack. Este lab demuestra cómo las subidas a S3 disparan una Lambda para registrar metadatos en una tabla DynamoDB.
Prerrequisitos
Sección titulada «Prerrequisitos»- Docker instalado y en ejecución.
- Dev Containers extension instalada (opcional).
- AWS Toolkit para VS Code (opcional, incluido en el Dev Container).
Cómo ejecutar
Sección titulada «Cómo ejecutar»-
Configurar el entorno:
Abre VS Code en la carpeta del proyecto y ejecuta este comando en la Paleta de Comandos:
Ventana de terminal > Dev Containers: Reopen in Container- Inicia LocalStack:
Ventana de terminal docker compose up -d localstack - Configura el AWS CLI:
Ventana de terminal aws configure set aws_access_key_id test --profile localstackaws configure set aws_secret_access_key test --profile localstackaws configure set region us-east-1 --profile localstackaws configure set output json --profile localstackaws configure set endpoint_url http://localhost:4566 --profile localstackaws configure set cli_pager "" --profile localstack - Instala las dependencias de Python:
Ventana de terminal pip install uvuv sync - Empaqueta la función Lambda:
Ventana de terminal python deploy/utils/package_lambda.py - Despliega:
Ventana de terminal python deploy/boto3_deploy.py
- Inicia LocalStack:
-
Ejecutar el ejemplo:
Ventana de terminal python main.pyVentana de terminal curl -X PUT -T src/lambda.py http://localhost:4566/file-uploads-bucket/manual-upload.py- Selecciona el perfil
localstacken el AWS Toolkit. - Haz clic derecho en
file-uploads-buckety selecciona Upload Files….
- Selecciona el perfil
Métodos de despliegue
Sección titulada «Métodos de despliegue»Hay otros métodos de despliegue que puedes usar en este lab.
terraform -chdir=deploy initterraform -chdir=deploy apply -auto-approve- Crea un bucket temporal para el despliegue:
Ventana de terminal aws s3 mb s3://lambda-deploy-bucket --profile localstack - Sube el paquete Lambda:
Ventana de terminal aws s3 cp tmp/lambda.zip s3://lambda-deploy-bucket/lambda.zip --profile localstack - Despliega el stack:
Ventana de terminal aws cloudformation deploy --profile localstack \--stack-name aws-dynamo-db-stack \--template-file deploy/cloud_formation_deploy.yaml \--capabilities CAPABILITY_NAMED_IAM
python deploy/boto3_deploy.py- Crea la tabla DynamoDB:
Ventana de terminal aws dynamodb create-table --profile localstack \--table-name file-logs \--attribute-definitions AttributeName=file_id,AttributeType=S \--key-schema AttributeName=file_id,KeyType=HASH \--billing-mode PAY_PER_REQUEST - Crea el rol IAM:
Ventana de terminal aws iam create-role --profile localstack \--role-name lambda-s3-processor-role \--assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"lambda.amazonaws.com"},"Action":"sts:AssumeRole"}]}' - Crea la función Lambda:
Ventana de terminal aws lambda create-function --profile localstack \--function-name s3-file-processor \--runtime python3.12 \--role arn:aws:iam::000000000000:role/lambda-s3-processor-role \--handler lambda.lambda_handler \--zip-file fileb://tmp/lambda.zip \--environment Variables={DYNAMODB_TABLE=file-logs} - Crea el bucket S3:
Ventana de terminal aws s3 mb s3://file-uploads-bucket --profile localstack - Añade permisos S3 y configura la notificación:
Ventana de terminal aws lambda add-permission --profile localstack \--function-name s3-file-processor \--statement-id s3-trigger \--action lambda:InvokeFunction \--principal s3.amazonaws.com \--source-arn arn:aws:s3:::file-uploads-bucketaws s3api put-bucket-notification-configuration --profile localstack \--bucket file-uploads-bucket \--notification-configuration '{"LambdaFunctionConfigurations":[{"LambdaFunctionArn":"arn:aws:lambda:us-east-1:000000000000:function:s3-file-processor","Events":["s3:ObjectCreated:*"]}]}'
Validar resultados
Sección titulada «Validar resultados»- Comprueba el bucket S3:
Ventana de terminal aws s3 ls s3://file-uploads-bucket --profile localstack - Escanea la tabla DynamoDB:
Ventana de terminal aws dynamodb scan --table-name file-logs --profile localstack - Consulta los logs de Lambda:
Ventana de terminal aws logs tail /aws/lambda/s3-file-processor --profile localstack
- S3: Despliega la sección S3 para ver los archivos subidos.
- CloudWatch: Despliega la sección Logs para ver la salida de ejecución de Lambda.
- Descarga: NoSQL Workbench para DynamoDB.
- Configura la conexión: Haz clic en Operation builder > Add connection > DynamoDB local. Establece Connection Name como
LocalStack, Hostname comolocalhost, Port como4566. - Conecta para explorar y editar la tabla
file-logs.
Limpieza
Sección titulada «Limpieza»docker compose down -vSolución de problemas
Sección titulada «Solución de problemas»| Problema | Solución |
|---|---|
| Conexión rechazada | Asegúrate de que LocalStack está en ejecución y espera el mensaje Ready. en los logs. |
| Lambda no se dispara | Verifica los logs: aws logs tail /aws/lambda/s3-file-processor --profile localstack |