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.