He escrito una pila SAM y puedo compilarla, empaquetarla e implementarla en AWS. También puedo usar start-local o invocar para probar. Ahora necesito probar otros recursos de AWS. He agregado esos recursos a mi plantilla SAM. Funciona bien en AWS, pero estoy buscando una manera de implementar mi pila SAM en localstack (por ejemplo, dynamodb local). Ahora tengo que crear los recursos con la CLI y luego puedo implementar mi pila SAM (solo lambda, API GW en este caso). ¿Cómo puedo hacer esto?
Acabo de pasar por esto. Creo que lo siguiente es correcto.
AWS SAM es una formación en la nube redonda envolvente. Entonces, su plantilla SAM es en realidad una plantilla de Cloudformation. Su plantilla de Cloudformation define sus lambdas y dynamodb, etc. Cuando implementa en AWS, todas sus lambdas y dynamodb van a AWS y puede realizar pruebas en la nube.
Cuando ejecuta AWS SAM localmente, ejecuta su lambda localmente (en un contenedor docker) pero aún accede a los recursos en la nube de AWS.
LocalStack tiene una interfaz de CloudFormation, por lo que debería ser posible implementar su archivo de plantilla de CloudFormation. Pero me encontré con algunos problemas con esto y me di por vencido.
Serverless Framework es similar a AWS SAM en que es un marco para desarrollar su código serverless (lambda) y para implementarlo en AWS. Serverless tiene su propia especificación yaml para definir una pila. Convertir de Cloudformation a Serverless yaml es un poco de trabajo.
Hay un complemento sin servidor para localstack. Entonces es posible implementar su código en localstack. Si tiene API Gateway frente a sus lambdas, habrá una URL local a la que puede acceder que activa sus lambdas. Esto está completamente dentro de localstack y no usa AWS SAM.
En este punto, es posible que su código aún llegue a los servicios reales de AWS. Por lo tanto, debe cambiar la URL del punto final para que apunte localmente, como mencionó Andrew A. Para esto, y para mantener su código igual para prueba y producción, puede usar variables de entorno para cada uno de los puntos finales del servicio.
Como menciona Andrew A., debería ser posible ejecutar código usando SAM local que accede a los recursos proporcionados por localstack. Sin embargo, puede ser preferible mantener una herramienta, si esto se hizo dentro de una tubería de prueba, por ejemplo.
Después de algunas investigaciones, la forma más confiable es
sam build compila y comprime tu zip en .aws-sam/build $ cd .aws-sam/build $ zip -qr MyLambda.zip MyLambda $ tree .aws-sam -L 2 .aws-sam ├── build │ ├── MyLambda.zip │ ├── MyLambda │ └── template.yaml └── build.toml 2 directories, 3 files aws --endpoint-url=http://localhost:4566 lambda create-function \ --function-name "my-lambda" --runtime=nodejs12.x --role dummy \ --zip-file=fileb:.aws-sam/build/MyLambda.zip \ --handler MyLambda/src/index.handlerLos creadores de Localstack han creado un envoltorio liviano para el sam cli. Simplemente use pip para instalar samlocal como una biblioteca de Python en su máquina:
pip install aws-sam-cli-local
A continuación, puede realizar la implementación en la pila local utilizando samlocal deploy en lugar de sam deploy deployment normal. Algo como lo siguiente:
samlocal deploy --stack-name sam-app --capabilities CAPABILITY_IAM --guided
Para obtener más detalles sobre las opciones disponibles en sam deployment, consulte los documentos aquí .