LocalStack es un emulador de los servicios de Amazon Web Services que corre en un contenedor Docker en tu sistema local o entorno de CI. LocalStack permite correr AWS Lambda y otros servicios completamente en tu computadora.

Todos los ejemplos a continuación son para sistemas Linux, probado en Ubuntu 20.04 y se asume que aws-cli está instalado.

Instalación

La documentación de LocalStack sugiere como primer método de instalación localstack-cli. Pero existen alternativas que incluyen Docker, Helm, que pueden funcionar en ambientes de CI y Cockpit, este último ofrece una experiencia de escritorio de acuerdo a la documentación.

python3 -m pip install --user localstack

Terminado el proceso de instalación puedes comprobar que puedas acceder al comando.

localstack --help

Si este no está disponible el PATH puedes ejecutar como módulo de python.

python3 -m localstack --help

Integración con aws-cli

LocalStack soporta una gama amplia de herramientas para la nube, en la documentación pudes ver la lista de herramientas oficialmente soportadas.

aws-cli es la herramienta de línea de comandos que permite interactuar con los servicios de AWS, awscli-local es un reemplazo directo que interactua con LocalStack. Desde luego podemos utilizar aws-cli aws --endpoint-url=http://localhost:4566 en lugar de awscli-local, pero yo lo encuentro más comodo.

python3 -m pip install awscli-local

Ahora configurar la herramienta.

aws configure --profile localstack

Escribe test como valor para AWS Access Key ID y AWS Secret Access Key.

Deja el default None como valore de Default region name y Default output format.

Inicio rápido

Ya tienes lo mínimo necesario para empezar a desarrollar en LocalStack. Por ahora una función lambda sencilla servirá, AWS Lambda es uno de los servicios que LocalStack provee.

Inicia LocalStack, al finalizar la inicialización debes poder acceder a la URL http://localhost:4566 en tu navegador web.

localstack start

Crea una función lambda

Primero crea el rol de ejecución para la función lambda, IAM es otra de las características de AWS que se emulan en LocalStack.

awslocal iam create-role --role-name lambda-ex --assume-role-policy-document '{"Version": "2012-10-17","Statement": [{ "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}'

Puedes escribir tu propia Lambda para la prueba, pero aquí hay un repositorio en Github con el código de ejemplo que utilizo en esta publicación.

Clona el rpositorio y crea el archivo function.zip que vamos a publicar en LocalStack.

git clone https://github.com/ecelis/localstack-posts.git
cd localstack-posts
zip function.zip index.js

Publica la función, el número de cuenta de AWS en el ARN debe ser siempre 000000000000 sin especificar región, como en el ejemplo.

awslocal lambda create-function --function-name my-function \
--zip-file fileb://function.zip --handler index.handler --runtime nodejs12.x \
--role arn:aws:iam::000000000000:role/lambda-ex

Terminado el proceso con éxito puedes listar las funciones publicadas en LocalStack.

awslocal lambda list-functions

Invoca la función para tu satisfacción.

awslocal lambda invoke --function-name my-function out.txt

El resultado debe ser un JSON similar al siguiente.

{
    "StatusCode": 200,
    "LogResult": "",
    "ExecutedVersion": "$LATEST"
}

Usa cat out.txt para mirar el contenido de out.txt que debe contener algo similar a los sigiente.

"2022/05/26/[$LATEST]d715a5ed8eddb6f5f731d0ecc584ad8d"

LocalStack ofrece una versión Pro con más servicios soportados, por ejemplo Lambda Layers o StepFunctions entre otros.