Tipps und Tricks für AWS SAM Serverless Applications implementieren und ausrollen
„Wir würden gerne eine Architektur ohne Server implementieren, um die Wartungsaufwände zu minimieren. Welche Empfehlungen und Entwurfsmuster existieren für serverlose Applikationen?“
Anbieter zum Thema
In den vorangehenden Teilen dieser Blog-Serie haben wir einzelne Bestandteile einer serverlosen Applikation mit Frontend (Amazon S3), RESTful API (Amazon API Gateway), Geschäftslogik (AWS Lambda) und Datenbank (Amazon DynamoDB) vorgestellt. In diesem Blogpost wollen wir zeigen, wie sich mit Hilfe dieser Services eine serverlose Applikation implementieren und durch AWS SAM ausrollen lässt.
Das AWS Serverless Application Model, kurz AWS SAM, ist eine Erweiterung von AWS CloudFormation, die es auf einfache Weise ermöglicht, Amazon API Gateway APIs, AWS Lambda-Funktionen und Amazon DynamoDB-Tabellen bereitzustellen, die von serverlosen Applikationen genutzt werden.
Die Infrastruktur einer serverlosen Anwendung kann als SAM-Template in Form einer JSON- oder YAML-Datei beschrieben werden. Die vollständige Spezifikation von AWS SAM mit den nutzbaren Ressourcentypen ist bei Github zu finden. Folgender Ausschnitt aus einem Template beschreibt eine CRUD-Applikation (Create, Read, Update, Delete), die Amazon API Gateway, AWS Lambda und Amazon DynamoDB nutzt.
AWSTemplateFormatVersion: 2010-09-09
Transform:
- AWS::Serverless-2016-10-31
- AWS::CodeStar
Parameters:
ProjectId:
Type: String
Description: AWS SAM example application
Resources:
getUsers:
Type: AWS::Serverless::Function
Properties:
Handler: com.aws.codestar.projecttemplates.handler.GetUsersHandler
Runtime: java8
Timeout: 60
CodeUri: codeStarCrud.jar
MemorySize: 256
Policies: AmazonDynamoDBReadOnlyAccess
Environment:
Variables:
TABLE_NAME: !Ref MySimpleTable
Role:
Fn::ImportValue:
!Join ['-', [!Ref 'ProjectId', !Ref 'AWS::Region', 'LambdaTrustRole']]
Events:
GetEvent:
Type: Api
Properties:
Path: /users/{id}
Method: get
createUsers:
Type: AWS::Serverless::Function
Properties:
Handler: com.aws.codestar.projecttemplates.handler.CreateUsersHandler
Runtime: java8
Timeout: 60
CodeUri: codeStarCrud.jar
MemorySize: 256
Policies: AmazonDynamoDBFullAccess
Environment:
Variables:
TABLE_NAME: !Ref MySimpleTable
Role:
Fn::ImportValue:
!Join ['-', [!Ref 'ProjectId', !Ref 'AWS::Region', 'LambdaTrustRole']]
Events:
GetEvent:
Type: Api
Properties:
Path: /users
Method: post
MySimpleTable:
Type: 'AWS::Serverless::SimpleTable'
PrimaryKey:
Name: id
Type: String
ProvisionedThroughput:
ReadCapacityUnits: 5
WriteCapacityUnits: 5
Unter Resources finden sich die auszurollenden Bestandteile der Gesamtapplikation; in dem Beispiel werden zwei REST-Ressourcen mit den entsprechenden HTTP-Verben definiert sowie die Lambda-Funktionen, die durch diese Ressourcen aufgerufen werden. Für die Lambda-Funktionen sind die Handler und zusätzliche Parameter wie beispielsweise die Runtime und die Speichergröße spezifiziert.
In dem SAM-Template kann darüber hinaus angegeben werden, welche IAM-Policies für die Ausführungsrolle der Lambda-Funktion genutzt werden, um zu steuern, welche Zugriffsrechte die jeweilige Lambda-Funktion besitzt. In diesem Beispiel werden für die Lambda-Funktionen minimale Zugriffsrechte vergeben: die Funktion zum Lesen der Daten auf der Tabelle erhält lediglich die Berechtigung zum Lesen.
Im unteren Abschnitt des AWS-SAM-Templates wird die für Anwendung notwendige DynamoDB-Tabelle mit jeweils fünf Read- und Write-Capacity Units mit Hilfe der Ressource AWS::Serverless::SimpleTable definiert. SimpleTable erzeugt eine einfach DynamoDB-Tabelle mit einem einzelnen Primärschlüssel. In diesem Fall wird als Primärschlüssel das Attribut „id“ genutzt, das eine Zeichenkette enthält. Falls eine komplexere Tabelle genutzt werden soll, eignet sich der Ressourcentyp AWS::DynamoDB::Table.
Um eine auf AWS SAM basierende Anwendung zu paketieren und auszurollen, kann die AWS CLI folgendermaßen genutzt werden:
aws cloudformation package \
--template-file sam_template.yaml \
--output-template-file serverless-output.yaml \
--s3-bucket s3-bucket-name
Dieses package-Kommando generiert ein AWS SAM-Template mit dem Namen serverless-output.yaml, das eine CodeUri enthält, die auf die auszurollende ZIP-Datei im spezifizierten S3-Bucket zeigt. Nun kann die Anwendung mit dem deploy-Kommando ausgerollt werden:
aws cloudformation deploy \
--template-file serverless-output.yaml \
--stack-name new-stack-name \
--capabilities CAPABILITY_IAM
Um die Ergebnisse nach dem Deployment zu verifizieren, lässt sich AWS CloudFormation in der AWS-Konsole öffnen, um den neu erzeugten CloudFormation Stack überprüfen zu können.
* Sascha Möllering arbeitet als Solutions Architect bei der Amazon Web Services Germany GmbH. Seine Interessen liegen in den Bereichen Automation, Infrastructure as Code, Distributed Computing, Container und JVM.
(ID:44831652)