abshoff.dev: Web, Mobile & Cloud!

Terraform und SAM

Landschaft mit Baum

Das AWS Serverless Application Model (SAM) stellt eine lokale Umgebung und Kommandozeilenwerkzeuge bereit, mit der sich Anwendungen auf Basis von AWS Lambda entwickeln und verteilen lassen. In SAM-Templates können serverlose Anwendungen definiert und modelliert werden. Dabei baut SAM auf AWS CloudFormation auf, womit alle möglichen Cloud-Ressourcen innerhalb der AWS-Cloud beschrieben werden können. Intern werden dazu die speziellen SAM-Templates in allgemeinere CloudFormation-Templates überführt, die im Vergleich etwas umfangreicher ausfallen.

Neben AWS CloudFormation gibt es universellere Infrastructure-as-Code-Werkzeuge wie Terraform, die auch mehr als einen Cloud-Anbieter unterstützen. Terraform ist derzeit leider nicht in der Lage mit SAM definierte Anwendungen zu aufzusetzen. Jedoch ist es möglich, CloudFormation-Templates zu auszuführen.

Um innerhalb einer CI/CD-Pipeline ein SAM-Template in ein CloudFormation-Template umzuwandeln und dieses zusammen mit dem Quelltext als Build-Artefakt bereitzustellen, bedarf es eines kleinen Umweges, denn die AWS SAM CLI kann es nicht, ohne die Anwendung in ein Amazon S3 hochzuladen.

Eine Bibliothek der AWS SAM CLI, der AWS SAM Translator, kann die Umwandung vornehmen.

SAM, CloudFormation und Terraform

Dafür sind zunächst einige abhängige Python-Bibliotheken zu installieren:

/usr/bin/pip3 install --user aws-sam-translator docopt pyyaml

Dann kann das mit dem AWS SAM Translator ausgelieferte Skript sam-translate.py heruntergeladen werden:

/usr/local/bin/wget https://raw.githubusercontent.com/awslabs/serverless-application-model/develop/bin/sam-translate.py

Und schließlich kann die Transformation durchgeführt werden:

/usr/bin/python3 sam-translate.py --template-file=./template.yml --output-template=./cloudformation-template.json

SAM Translate greift dabei auf die Konfiguration unter ~/.aws/config und ~/.aws/credentials zurück. Damit die Umwandlung funktioniert, müssen die Quelltexte der Lambdas bereits in ein Amazon S3 hochgeladen worden sein und im SAM-Template unter CodeUri referenziert werden.

Tags: