AWS Lambda und API Gateway, Teil 1

RestfulAPIs für AWS selbst gebaut

| Autor / Redakteur: Thomas Drilling / Stephan Augsten

Wer mit API-Aufrufen in AWS experimentieren will, für den empfiehlt sich zunächst eine einfache Hello-World-Ausgabe.
Wer mit API-Aufrufen in AWS experimentieren will, für den empfiehlt sich zunächst eine einfache Hello-World-Ausgabe. (Bild: Drilling / AWS)

Amazon API Gateway soll das Erstellen, Veröffentlichen, Pflegen, Überwachen und Sichern von APIs jeder beliebigen Größenordnung sehr einfach machen. In diesem Beitrag zeigen wir, wie man dem Service einen AWS-Zugang via HTTPS ermöglicht.

Kennen Sie Swagger? Swagger ist ein Open-Source-Software-Framework, das das Entwerfen, Erstellen, Dokumentieren und Verwenden von RESTful Webservices erlaubt. Das Open-Source-Framework wird von zahlreichen weiteren Tools erkannt und unterstützt.

Vielen Entwicklern kennen Swagger in Form des Swagger-UI-Tools. Das Swagger-Toolset bietet darüber hinaus Unterstützung für automatisierte Dokumentation, Code-Generierung und Testfallgenerierung. Damit gehört Swagger neben RAML und API Blueprint zu den am häufigsten benutzen API-Beschreibungssprachen und dient auch dem Dienst „Amazon API Gateway“ als Grundlage.

Mit Amazon API Gateway können Entwickler über die AWS-Managementkonsole mit wenigen Klicks eine API erstellen, die ihren Anwendungen quasi als „Haupteingang“ dient. Über die API ist es fortan möglich, auf Daten, Geschäftslogik oder Funktionen der auf AWS gehosteten Backend-Services zuzugreifen. Als Beispiel denke man an Anwendungen, die auf Amazon EC2 oder AWS Elastic Beanstalk laufen, unter AWS Lambda ausgeführter Code oder eine beliebige Webanwendung.

Amazon API Gateway kümmert sich dabei um sämtliche Aufgaben, die mit der Annahme und Verarbeitung zehntausender bis hunderttausender gleichzeitiger API-Aufrufe im Zusammenhang stehen. Man denke zum Beispiel an Datenverkehrsmanagement, Autorisierung/Zugriffssteuerung, Überwachung und API-Versionsmanagement.

Wie bei AWS üblich, berechnet das Unternehmen für Amazon API Gateway weder Mindestgebühren Vorabkosten. Der Kunde zahlt lediglich für eingehende API-Aufrufe und ausgehende Datenübertragungen. Zusätzlich zahlt er bei Websocket-APIs für Nachrichten, die gesendet und empfangen wurden sowie für die Zeit, die ein Benutzer/Gerät mit dem Websocket API verbunden ist.

Auch wenn API Gateway verschiedene Backend-Typen unterstützt, kommt der Dienst in der Praxis sehr häufig im Zusammenhang mit AWS Lambda zum Einsatz. Der Grund liegt nahe. Lambda ist ein rein Event-getriebener Compute Service, dessen Trigger in der Regel AWS-interne Services sind bzw. sein müssen. Einer der unterstützten Trigger für Lambda ist allerdings API Gateway.

Auf diese Weise ist es z. B. möglich, eine existierende Lambda-Funktion durch einen HTTPS-Aufruf von „außen“ auslösen zu lassen, die dann wiederrum mit anderen Backend-Systemen kommuniziert. Folgender Workshop zeigt anhand einer einfache Demo-Lambda-Function „HelloWorld“, wie ein Workflow zum Hosten einer passenden RestAPI aussehen könnte, um die Lambda-Function durch einen Nutzer Browser-basiert auflösen zu können.

Demo-Lambda-Funktion

Für die Anbindung ans API-Gateway ist es zunächst unerheblich, welche Logik die Lambda-Funktion ausführt. Wir begnügen aus daher mit einem einfache „Hello World“ in Node.Js. Dazu könnte man wahlweise das passende HelloWorld-Sample aus dem Lambda-Vorlagenkatalog verwenden oder eine Lambda-Funktion im Inline-Editor from scratch schreiben. In diesem Fall fügt das die Lambda-Konsole automatischen ein HelloWorld-Skeleton ein:

exports.handler = async (event) => {
   // TODO implement
   const response = {
      statusCode: 200,
      body: JSON.stringify('Hello from Lambda!'),
   };
   return response;
};

Der Skeleton erklärt sich von selbst. Für den Datenaustausch mit einem Webserver kommt heute häufig das JSON-Format zum Einsatz. Allerdings müssen beim Senden von Daten an einen Webserver die Daten selbst als Zeichenfolge zur Verfügung stehen. Die Funktion JSON.stringify () konvertiert ein bestehendes JavaScript-Objekt in einen String.

Wie die Lambda-Funktion in usnerem Beispiel aussieht, ist weniger von Belang. Es empfiehlt sich aber die Richtlinienvorlage „Einfache Microservices-Berechtigungen“.
Wie die Lambda-Funktion in usnerem Beispiel aussieht, ist weniger von Belang. Es empfiehlt sich aber die Richtlinienvorlage „Einfache Microservices-Berechtigungen“. (Bild: Drilling / AWS)

Bevor man die Funktion im Inline-Editor einfügen kann, verlangt die Lambda-Konsole wie üblich einen Rollennamen, eine IAM-Rolle nebst Richtlinie und die gewünschte Laufzeitumgebung. Wir lassen in diesem Fall eine neue Rolle aus einer Vorlage erstellen und verwenden als Richtlinienvorlage „Einfache Microservices-Berechtigungen“.

Wir schreiben jedoch unserer Hello-World-Funktion für dieses Beispiel vollständig selbst, wobei wir es so einfach wie möglich halten, und überschreiben daher das Standard-Skeleton-Vorschlag wie folgt:

   exports.handler = (event, context, callback) => {
      callback(null,'Dies ist mein erstes ')
   };

Um die korrekte Ausführung der neuen Lambda-Funktion an Ort und Stelle testen zu können bietet die Lamda-Konsole bekanntlich die Möglichkeit, neue Funktionen lokal zu testen und dazu ein Test-Template auszuwählen. Dazu klickt man in der Lambda-Konsole oben rechts auf die Schaltfläche „Test“, wähl dann als „Ereignisvorlage“ den Eintrag „HelloWorld“ und vergeben einen beliebigen Ereignisnamen. Anschließend ersetzen wir den Key1 durch einen einprägsamen Value wie z. B. „Hallo Welt von NodeJS“

{
   "key1": "Hallo Welt von NodeJS",
   "key2": "value2",
   "key3": "value3"
}

Nun ergänzen wir unseren Beispiel-Code um die Ausgabe des Test-Events.

   exports.handler = (event, context, callback) => {
      callback(null,'Dies ist mein erstes ' + event.key1)
      };

Die Ausgabe für unser Test-Event.
Die Ausgabe für unser Test-Event. (Bild: Drilling / AWS)

… und klicken auf „Test“. Die Ausgabe sollte dann etwa so aussehen wie in der vorangestellten Abbildung. Man beachte auch die Anfrage-ID, die Ausführungszeit, die abgerechnete Dauer und die verbrauchten Ressourcen von 128 MB RAM. Im folgenden Teil erstellen wir als Trigger für unsere Lambda-Function eine Rest-API im API-Gateway

Kommentare werden geladen....

Kommentar zu diesem Artikel

Der Kommentar wird durch einen Redakteur geprüft und in Kürze freigeschaltet.

Anonym mitdiskutieren oder einloggen Anmelden

Avatar
Zur Wahrung unserer Interessen speichern wir zusätzlich zu den o.g. Informationen die IP-Adresse. Dies dient ausschließlich dem Zweck, dass Sie als Urheber des Kommentars identifiziert werden können. Rechtliche Grundlage ist die Wahrung berechtigter Interessen gem. Art 6 Abs 1 lit. f) DSGVO.
  1. Avatar
    Avatar
    Bearbeitet von am
    Bearbeitet von am
    1. Avatar
      Avatar
      Bearbeitet von am
      Bearbeitet von am

Kommentare werden geladen....

Kommentar melden

Melden Sie diesen Kommentar, wenn dieser nicht den Richtlinien entspricht.

Kommentar Freigeben

Der untenstehende Text wird an den Kommentator gesendet, falls dieser eine Email-hinterlegt hat.

Freigabe entfernen

Der untenstehende Text wird an den Kommentator gesendet, falls dieser eine Email-hinterlegt hat.

copyright

Dieser Beitrag ist urheberrechtlich geschützt. Sie wollen ihn für Ihre Zwecke verwenden? Infos finden Sie unter www.mycontentfactory.de (ID: 45838829 / Cloud & PaaS)