Simulando AWS Secrets Manager en Local usando LocalStack

Cuando iniciamos el desarrollo de una solución de software lo hacemos en un ambiente local para ir construyendo y probando que vamos por el camino correcto con algo funcional. Al encontrarnos con un ambiente de desarrollo (integración) en la nube debemos desplegar para ver si finalmente la funcionalidad hace lo que tiene que hacer y hacerlo en local trae sus retos asociados a dependencias con servicios ofrecidos por AWS. Por ejemplo, requerir de leer un secreto que contiene los datos de conexión a una base de datos o cualquier otro servicio.

Entonces, sería muy útil tener un ambiente local donde simular los servicios de AWS y poder crear un secreto con los datos de conexión para una base de datos sin tener que colocarlos directamente en la clase de conexión o en algún archivo de configuración de forma temporal. En este artículo te enseñaré cómo simular AWS Secrets Manager de una manera sencilla usando LocalStack.



LocalStack es una herramienta que nos permite disponer de un ambiente local AWS lo más cercano posible al que se tendría en una cuenta oficial de este proveedor y a su vez, se reducen costos en infraestructura en la etapa de desarrollo y aunque no todos sus servicios están disponibles en la versión free, esto no significa de entrada que no puedas realizar la homologación de tu ambiente. Por ejemplo, imagina que debes conectarte a una base de datos Postgres en un RDS solo disponible en la versión Pro de LocalStack. Una posible solución es crearla en un contenedor de Docker en ambiente local y que los datos de acceso se tomen desde el secreto.


Creando un secreto en ambiente local:


  1. Los servicios es tener en cuenta que Localstack funciona sobre Docker así que una vez instalado, iniciarlo será igual que levantar cualquier contenedor y por defecto expone todos los servicios por el endpoint http://localhost:4566 o https://localhost:4566 aunque realmente es indiferente porque permite multiplexación (recibe ambos tipos de peticiones por el mismo puerto). En versiones anteriores cada api era expuesta por un puerto diferente, actualmente todo está expuesto por el mismo puerto. Por defecto, es el 4566 pero puedes cambiarlo si deseas.


>pip install localstack
 Para iniciarlo bastará con ejecutar el comando
>localstack start
O también con el comando
>docker start localstack_main


A partir de este momento ya puedes usarlo desde tu consola y ejecutar comandos con aws cli (sino lo tienes, lo puedes instalar y listo) con el atenuante que debes estar especificando por cada ejecución el endpoint-url de localstack en cada comando que lance.

  1. Crea un archivo con los datos a cargar en formato “.json” y guardalo como mycreds.json o como desees.


{
	"password":"*****",
	"dbname":"bdprueba",
	"engine":"postgres",
	"port": "15432",
	"host":"localhost",
	"username":"usariomaestro"
}


  1. Para crear el secreto ejecuta:


>aws --endpoint-url=http://localhost:4566 secretsmanager create-secret --name MyTestDatabaseSecret --description "My test database secret created with the CLI" --secret-string file://mycreds.json

Y así se habrá creado un secreto con el nombre “MyTestDatabaseSecret” que contendrá los datos del archivo “mycreds.json” y para comprobar que ha sido creado ejecuta:


>aws --endpoint-url=http://localhost:4566 --region=us-east-1 secretsmanager get-secret-value  --secret-id "MyTestDatabaseSecret "

Como podrás darte cuenta puedes ejecutar todos los comandos que te ofrece AWS. Aunque no todo es felicidad. Como ya mencioné, no todos los servicios de AWS se encuentran disponibles en la versión free. Sin embargo, esto no significa que no pueda ser útil en tu día a día, con esta versión no se tendrá acceso a todo, pero si podrás estar muy cerca de homologar el ambiente local con el de la cuenta de desarrollo.

En la versión free están disponibles una variedad de servicios que pueden ser muy útiles para nuestros ambientes locales:


· ACM

· API Gateway

· CloudFormation

· CloudWatch

· CloudWatch Logs

· DynamoDB

· DynamoDB Streams

· EC2

· Elasticsearch Service

· EventBridge (CloudWatch Events)

· Firehose

· IAM

· Kinesis

· KMS

· Lambda

· Redshift

· Route53

· S3

· SecretsManager

· SES

· SNS

· SQS

· SSM

· StepFunctions

· STS


Para consumir estos servicios de LocalStack, solo debes tener el sdk de aws correspondiente al lenguaje que estés usando. Por ejemplo, en java con spring boot para obtener el secreto, en el archivo application-dev.yml puedes tener algo como lo siguiente:



aws:
    region: us-east-1
    secretName: MyTestDatabaseSecret
     endpoint: localhost:4566

Observa que lo único que debes cambiar es el endpoint por el de localstack y el consumo será igual cómo lo implementaste para ejecutarlo en una cuenta AWS.



En conclusión, es una herramienta útil para los desarrollos y pruebas en local así no se cuenten con todos los servicios en la versión free. Obtener la versión PRO dependerá del análisis de beneficios y costos que ofrezca a tu empresa o proyecto en particular respecto a adquirir una cuenta aws o tener esta versión en la fase de desarrollo.



¡Gracias por leer!