LocalStack: Guia de Inicio

Hace algún tiempo probé localstack para arquitectura serverless de manera local(Siempre estoy buscando como trabajar con serverless localmente: Link) y me dejo muy buenas sensaciones, ahora he visto que ampliaron sus funcionalidades y los servicios que integra y me he puesto a la tarea de probarlo en profundidad, en este post dejo los comentarios y el paso a paso del Getting Starterd.

Que es LocalStack:

Es una herramienta que permite probar de manera local algunos servicios de AWS, pero en palabras del propio LocalStack:

Develop and test your AWS applications locally to reduce development time and increase product velocity. Reduce unnecessary AWS spend and remove the complexity and risk of maintaining AWS dev accounts.

https://www.localstack.cloud/

Anteriormente, he escrito como a probar Lambda y algunos servicios de manera local, pero, LocalStack nos ofrece alguna alternativa más en su version free y funcionalidades adicionales en la versión de licencia de pago.

Instalar LocalStack

Nos logueamos en la cuenta de LocalStack, yo particularmente estoy logueado con la cuenta de GitHub. LocalStack ofrece varios métodos de autenticación.

En Linux, descargamos el archivo:

curl --output localstack-cli-3.7.0-linux-amd64-onefile.tar.gz \
    --location https://github.com/localstack/localstack-cli/releases/download/v3.7.0/localstack-cli-3.7.0-linux-amd64-onefile.tar.gz

Descomprimimos e instalamos:

sudo tar xvzf localstack-cli-3.7.0-linux-*-onefile.tar.gz -C /usr/local/bin

Comprobamos que version tenemos instalada:

localstack --version
# 3.7.0

Configurar el Auth token:

  1. Ir a la página de LocalStack después de autenticarnos: https://app.localstack.cloud/workspace/auth-token

  2. Copiar el Auth Token

  1. Exporto el Auth token en la máquina o configurar con el comando LocalStack
localstack auth set-token XXX-XXX-XXX
# Token configured successfully

Inicializar el LocalStack

Lanzamos el comando de encendido:

localstack start

Si ejecutamos el comando directamente aparecerá el siguiente error:

[11:14:59] starting LocalStack in Docker mode 🐳               localstack.py:503
2024-09-03T11:15:00.313  INFO --- [  MainThread] localstack.utils.bootstrap : Execution of "prepare_host" took 764.13ms
❌ Error: 
===============================================
License activation failed! 🔑❌

Reason: Unexpected license server error: {"error": true, "message": "licensing.license.not_assigned"}

Due to this error, Localstack has quit. LocalStack pro features can only be used with a valid license.

- Please check that your credentials are set up correctly and that you have an active license.
  You can find your credentials in our webapp at https://app.localstack.cloud.
- If you want to continue using LocalStack without pro features you can set `ACTIVATE_PRO=0`.

Configuramos el parámetro ACTIVATE_PRO=0 que comenta en la última línea:

export ACTIVATE_PRO=0

Levantamos nuevamente el servicio:

localstack start

El servicio deberá levantar de manera correcta:

     __                     _______ __             __
    / /   ____  _________ _/ / ___// /_____ ______/ /__
   / /   / __ \/ ___/ __ `/ /\__ \/ __/ __ `/ ___/ //_/
  / /___/ /_/ / /__/ /_/ / /___/ / /_/ /_/ / /__/ ,<
 /_____/\____/\___/\__,_/_//____/\__/\__,_/\___/_/|_|

 💻 LocalStack CLI 3.7.0
 👤 Profile: default

[11:16:12] starting LocalStack in Docker mode 🐳               localstack.py:503
           container image not found on host                   bootstrap.py:1272
[11:17:02] download complete                                   bootstrap.py:1276
──────────────── LocalStack Runtime Log (press CTRL-C to quit) ─────────────────

LocalStack version: 3.7.2.dev6
LocalStack build date: 2024-09-03
LocalStack build git hash: daa45717

Ready.

Levantamos un entorno de prueba:

Seguimos la guía de inicio para probar con un stack conocido, en posteriores post probaremos nuestros propios stacks, la guía que seguiremos es:

https://docs.localstack.cloud/getting-started/quickstart/

An AWS architecture demonstrating a sample serverless image resizer application

  1. Descargar el código fuente, que es una arquitectura de referencia que permite un redimensionamiento de imágenes a un Bucket S3 y otras funcionalidades:

     git clone https://github.com/localstack-samples/sample-serverless-image-resizer-s3-lambda.git
     cd sample-serverless-image-resizer-s3-lambda
    
  2. Instalamos las dependencias del proyecto:

Recomendado instalar la version de python 3.9 como indica la guia de inicio por que no funcionaran correctamente las lambas de la prueba.

  • Instalamos pyenv: https://github.com/pyenv/pyenv-installer

  •   pyenv install 3.9.0
      pyenv global 3.9.0
    

    Dependencias del proyecto:

  •   python3 -m venv .venv
      source .venv/bin/activate
      pip install -r requirements-dev.txt
    

Probando conexión

Para entender como funciona probaremos el uso de comando awslocal, es un wrapper de AWS Cli que ofrece LocalStack para tener bien separadas las conexiones a nuestro stack local y el stack en el Cloud.

awslocal s3 ls

El log del stack mostrara esto:

Ready.
2024-09-03T09:53:20.688  INFO --- [et.reactor-0] localstack.utils.bootstrap : Execution of "_load_service_plugin" took 706.66ms
2024-09-03T09:53:20.688  INFO --- [et.reactor-0] localstack.utils.bootstrap : Execution of "require" took 706.99ms
2024-09-03T09:53:20.792  INFO --- [et.reactor-0] localstack.request.aws     : AWS s3.ListBuckets => 200

Para seguir investigamos probamos con qué usuario está conectado…

(.venv) ~/workspace/sample-serverless-image-resizer-s3-lambda (main)$ awslocal sts get-caller-identity
{
    "UserId": "AKIAIOSFODNN7EXAMPLE",
    "Account": "000000000000",
    "Arn": "arn:aws:iam::000000000000:root" # Cuenta y usuario
}

En el log de LocalStack encontraremos …

2024-09-03T10:17:03.212  INFO --- [et.reactor-0] localstack.request.aws     : AWS sts.GetCallerIdentity => 200

Desplegar los Servicios en nuestro LocalStack

  1. Modificamos el archivo bin/deploy.sh, remplazando las versiones de Python por la 3.9

     #bin/deploy.sh
     # ... configurar la version de python a 3.9
     awslocal lambda create-function \
         --function-name presign \
         --runtime python3.9 \
         --timeout 10 \
         --zip-file fileb://lambdas/presign/lambda.zip \
         --handler handler.handler \
         --role arn:aws:iam::000000000000:role/lambda-role \
         --environment Variables="{STAGE=local}"
     # ...
    
  2. Ejecutar bin/deploy.sh

    Este comando despliega la siguiente arquitectura:

Pruebas del Stack de Redimensionado de imágenes y revisión de como funciona LocalStack

  1. Que podemos ver de la información que tenemos desplegada: Accediendo a esta URL que levanta automáticamente LocalStack tendremos una vista general de los servicios que hemos desplegado

Se puede acceder a cada servicio donde se puede encontrar un panel con el listado de recursos y los detalles de cada uno; por ejemplo, las lambdas que tenemos desplegadas:

  1. Probando que la app que desplegamos de redimensionado de imágenes funcione correctamente
  • El output del instalador nos arroja la siguiente información:

      make_bucket: webapp
      upload: website/index.html to s3://webapp/index.html             
      upload: website/app.js to s3://webapp/app.js                      
      upload: website/favicon.ico to s3://webapp/favicon.ico            
    
      Fetching function URL for 'presign' Lambda...
      http://9htiqm8nu1kb6rwjyl12ymf0574bv7mp.lambda-url.us-east-1.localhost.localstack.cloud:4566/
      Fetching function URL for 'list' Lambda...
      http://632bfbyw4si5k354zabiydf4oj8lt9oo.lambda-url.us-east-1.localhost.localstack.cloud:4566/
      Now open the Web app under https://webapp.s3-website.localhost.localstack.cloud:4566/
      and paste the function URLs above (make sure to use https:// as protocol)
    

    Siguiendo los pasos tenemos el proceso de detección de los endpoints de las lambdas y si subimos una imagen, su correspondiente Imagen Resized como muestra la imagen a continuación.

Conclusiones

  • Hemos probado la aplicación de LocalStack levantando un stack completo que viene como prueba y funciona correctamente, se probaron los servicios de Lambda, s3, SNS

  • La experiencia de uso es buena, con mucha información

  • Es necesario estar logueado aunque no se tenga licencia PRO para sacarle provecho a la app.

  • Muy interesante herramienta que seguiré probando sobre todo con herramientas de Infraestructura como código para validar cuáles se pueden integrar y como es su comportamiento.

Referencias

1
Subscribe to my newsletter

Read articles from Oscar Cortes Bracho directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Oscar Cortes Bracho
Oscar Cortes Bracho

Cloud Software Engineer