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.
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:
Ir a la página de LocalStack después de autenticarnos: https://app.localstack.cloud/workspace/auth-token
Copiar el
Auth
Token
- 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/
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
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-installerpyenv 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
Modificamos el archivo
bin/deploy.sh
, remplazando las versiones dePython
por la3.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}" # ...
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
- 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:
- 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
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