Tipps und Tricks für AWS SAM Serverless Applications implementieren und ausrollen

Autor / Redakteur: Sascha Möllering * / Stephan Augsten

„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

AWS SAM ermöglicht es, APIs, Lambda-Funktionen und DynamoDB-Tabellen für serverlose Applikationen bereitzustellen.
AWS SAM ermöglicht es, APIs, Lambda-Funktionen und DynamoDB-Tabellen für serverlose Applikationen bereitzustellen.
(Bild: Amazon Web Services)

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

Sascha Möllering
Sascha Möllering
(Bild: AWS Germany GmbH)

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)