Hallo Habr! Heute setzen wir die Diskussion über die Möglichkeiten fort, die Amazon Web Services uns bietet, und wie diese Möglichkeiten zur Lösung von Anwendungsproblemen genutzt werden können.
In einem einfachen Beispiel werden wir in Betracht ziehen, in wenigen Minuten unsere eigene serverlose, automatisch skalierbare REST-API mit Fallanalyse zu erstellen - um eine Liste für eine Ressource zu erhalten.
Interessant? Dann geh unter den Schnitt!
(Quelle)Anstatt mitzumachen
Wir werden keine Datenbanken verwenden, um das Beispiel zu analysieren. Stattdessen ist unsere Informationsquelle eine Nur-Text-Datei in AWS S3.
- Angenommen, wir haben in AWS S3 eine Textdatei mit Headern und ein Prozess schreibt Informationen in diese.
- Wir werden eine Cloud-API erstellen, die eine JSON-Antwort als GET-Anforderung mit dem übergebenen Parameter zurückgibt.
- Gleichzeitig müssen Sie sich abhängig von der Komplexität der Aufgaben und damit den gestiegenen Anforderungen an die Verarbeitungsleistung von Ressourcen keine Sorgen machen, weil Der Dienst ist vollständig automatisch skalierbar. Dies bedeutet, dass Sie keine Verwaltung, Serverzuweisung und -verwaltung benötigen. Laden Sie einfach Ihren Code hoch und führen Sie ihn aus.
Architektur des in Entwicklung befindlichen Systems

Verwendete Amazon Web Services-Komponenten:
- Amazon S3 - Objektspeicher, mit dem Sie nahezu unbegrenzt viele Informationen speichern können;
- AWS Identity and Access Management (IAM) - Ein Service, mit dem der Zugriff auf AWS-Services und -Ressourcen sicher gesteuert werden kann. Mit IAM können Sie AWS-Benutzer und -Gruppen erstellen, verwalten, verwalten und mithilfe von Berechtigungen den Zugriff auf AWS-Ressourcen gewähren oder verweigern.
- AWS Lambda ist ein Dienst, mit dem Sie Code ausführen können, ohne Server zu sichern und zu konfigurieren. Die gesamte Rechenleistung wird für jeden Anruf automatisch skaliert. Die Gebühr wird basierend auf der Anzahl der Funktionsanforderungen und ihrer Dauer berechnet, d. H. Zeit, in der der Code ausgeführt wird.
Die Stufe des freien Zugriffs (Free Tier) impliziert 1 Million Anfragen pro Monat für kostenlosen und 400.000 Gbit / s. Unterstützte Sprachen: Node.js, Java, C #, Go, Python, Ruby, PowerShell
. Wir werden Python verwenden:
- Die boto3- Bibliothek ist ein AWS SDK für Python, mit dem Sie mit verschiedenen Amazon-Diensten interagieren können.
- Amazon API Gateway ist ein vollständig verwalteter Entwicklerdienst zum Erstellen, Veröffentlichen, Verwalten, Überwachen und Sichern von APIs in jeder Größenordnung. Zusätzlich zur Möglichkeit, mehrere Versionen derselben API (Stufen) zum Debuggen, Verfeinern und Testen zu verwenden, können Sie mit dem Dienst serverlose REST-APIs mit AWS Lambda erstellen. Lambda führt Code in einer leicht zugänglichen Computerinfrastruktur aus, sodass keine Serververteilung, -skalierung und -verwaltung erforderlich ist.
Die kostenlose Stufe für die HTTP / REST-API umfasst eine Million API-Aufrufe pro Monat für 12 Monate
Datenaufbereitung
Eine Textdatei mit einer Registerkarte wird als Feldtrennzeichen als Informationsquelle zum Generieren von Antworten auf eine GET REST-Anforderung verwendet. Die Informationen sind für dieses Beispiel jetzt nicht mehr wichtig, aber für die weitere Verwendung der API habe ich die Tabelle des aktuellen Handels mit auf russische Rubel lautenden Anleihen vom Quik-Handelsterminal heruntergeladen, in bonds.txt gespeichert und diese Datei in einem speziell erstellten AWS S3-Bucket abgelegt.
Ein Beispiel für die empfangenen Informationen ist in der folgenden Abbildung dargestellt:

Als Nächstes müssen Sie eine Funktion schreiben, die Informationen aus der Datei bonds.txt liest, analysiert und auf Anfrage ausgibt. AWS Lambda wird damit gut zurechtkommen. Zunächst müssen Sie jedoch eine neue Rolle erstellen, mit der die erstellte Lambda-Funktion Informationen aus dem in AWS S3 befindlichen Bucket lesen kann.
Erstellen Sie Rollen für AWS Lambda
- Wechseln Sie in der AWS-Verwaltungskonsole zum AWS IAM-Dienst und klicken Sie dann auf der Registerkarte "Rollen" auf die Schaltfläche "Rolle erstellen".
Hinzufügen einer neuen Rolle - Die Rolle, die wir jetzt erstellen, wird von AWS Lambda verwendet, um Informationen aus AWS S3 zu lesen. Wählen Sie daher im nächsten Schritt "Typ des vertrauenswürdigen Dienstes auswählen" -> "Aws-Dienst" und "Wählen Sie den Dienst aus, der diese Rolle verwendet" -> "Lambda" und klicken Sie auf die Schaltfläche "Weiter: Berechtigungen".
- Jetzt müssen Sie die Zugriffsrichtlinien für die AWS-Ressourcen festlegen, die in der neu erstellten Rolle verwendet werden. Weil Die Liste der Richtlinien ist sehr beeindruckend. Wenn Sie den Filter für Richtlinien verwenden, geben Sie "S3" an. Als Ergebnis erhalten wir eine gefilterte Liste für den S3-Dienst. Aktivieren Sie das Kontrollkästchen neben der Richtlinie "AmazonS3ReadOnlyAccess" und klicken Sie auf die Schaltfläche "Weiter: Tags".
- Der Schritt (Tags hinzufügen (optional)) ist optional, Sie können jedoch bei Bedarf Tags für Rollen angeben. Wir werden dies nicht tun und mit dem nächsten Schritt fortfahren - Vorschau. Hier müssen Sie den Rollennamen "ForLambdaS3-ReadOnly" festlegen, eine Beschreibung hinzufügen und auf die Schaltfläche "Rolle erstellen" klicken.
Alles, die Rolle wurde geschaffen und wir können sie für die weitere Arbeit verwenden.
Erstellen Sie eine neue Funktion in AWS Lambda
- Gehen Sie zum AWS Lambda-Service und klicken Sie auf die Schaltfläche "Funktion erstellen":
Füllen Sie alle Felder aus, wie im folgenden Screenshot gezeigt:
- Name - "getAllBondsList";
- Laufzeit - "Python 3.6"
- Rolle - "Wählen Sie eine vorhandene Rolle"
- Bestehende Rolle - hier wählen wir die Rolle aus, die wir oben erstellt haben - ForLambdaS3-ReadOnly
- Es bleibt nur, den Funktionscode zu schreiben und seine Leistung bei verschiedenen Testläufen zu überprüfen. Es ist zu beachten, dass die Hauptkomponente jeder Lambda-Funktion (wenn Sie Python verwenden) die boto3-Bibliothek ist:
import boto3 s3 = boto3.resource('s3') bucket = s3.Bucket('your-s3-bucket') obj = bucket.Object(key = 'bonds.txt') response = obj.get()
Die Grundidee unserer Python-Funktion lautet wie folgt:
- Öffnen Sie die Datei bonds.txt.
- Spaltenüberschriften lesen;
- Rekorde nach Seiten brechen (in unserem Fall 10 Sammlungen);
- Wählen Sie die gewünschte Seite aus.
- Ordnen Sie den Namen der Spalten und Datensätze zu.
- Geben Sie das Ergebnis in Form von Sammlungen an.
Wir werden nicht viel Zeit für den Funktionscode selbst und die technische Implementierung aufwenden, hier ist alles ziemlich einfach und der vollständige Code ist in meinem GitHub verfügbar.
for i in range(0, len(lines_proc)): d = dict((u''.join(key), u''.join(value)) for (key, value) in zip(headers, lines_proc[i].split("\t"))) response_body.append(d) return { 'statusCode': 200, 'page' : num_page, 'body': response_body }
Fügen Sie den Code (oder schreiben Sie Ihren eigenen :)) in den Block „Funktionscode“ ein und klicken Sie auf die Schaltfläche „Speichern“ in der oberen rechten Ecke des Bildschirms.
- Erstellen Sie Testereignisse. Nach dem Einfügen des Codes steht die Funktion zum Starten und Testen zur Verfügung. Klicken Sie auf die Schaltfläche „Test“ und erstellen Sie einige Testereignisse: Starten Sie die Funktion lambda_handler mit verschiedenen Parametern. Nämlich:
- Starten einer Funktion mit dem Parameter 'Seite': '100';
- Starten einer Funktion mit dem Parameter 'page': '1000000';
- Starten einer Funktion mit dem Parameter 'page': 'bla-bla-bla';
- Ausführen einer Funktion ohne den Parameter 'page'.
Starten der erstellten Funktion mit dem Senden der Testereignisseite == 100. Wie aus dem folgenden Screenshot ersichtlich, hat die Funktion erfolgreich funktioniert und den Status 200 (OK) sowie eine Sammlung von Sammlungen zurückgegeben, die der hundertsten Seite geteilter Daten mit Paginierung entsprechen.
Testereignis auslösen Seite 100
Für die Reinheit des Experiments werden wir ein weiteres Testereignis starten - "PageBlaBlaBla". In diesem Fall gibt die Funktion das Ergebnis mit dem Code 415 und einem Kommentar zurück, dass die Richtigkeit der übergebenen Parameter überprüft werden muss:
Testereignis PageBlaBlaBla
Auslösen des PageBlaBlaBla-Ereignisses
API-Erstellung
Nachdem alle anderen Fälle getestet wurden und das Verständnis besteht, dass die Lambda-Funktion wie erwartet funktioniert, erstellen wir die API. Erstellen Sie einen Zugriffspunkt auf die oben erstellte Lambda-Funktion und richten Sie zusätzlich den Schutz vor unerwünschten Starts mithilfe des API-Schlüssels ein.
- Wechseln Sie zum AWS API Gateway-Dienst. Klicken Sie auf die Schaltfläche API erstellen und legen Sie den API-Namen fest - getAllBondsList
Erstellen Sie eine neue API - Fügen Sie die GET-Methode zur neu erstellten API hinzu. Wählen Sie dazu Aktionen -> Methode erstellen, wählen Sie die GET-Methode in der Dropdown-Liste aus und klicken Sie auf das Häkchen
Als nächstes geben wir an, dass die GET-Methode unsere Lambda-Funktion getAllBondsList verwendet. Wählen Sie es aus und klicken Sie auf die Schaltfläche Speichern.
- Lassen Sie uns unsere API bereitstellen und dabei die URL zum Aufrufen der API erhalten.
Klicken Sie auf Aktionen -> API bereitstellen und dann auf Bereitstellungsphase -> Neue Phase
Es ist möglich, die API in verschiedenen Phasen bereitzustellen, und Sie können diese Phasen nach Belieben aufrufen (z. B. DEV / QA / PROD). Wir werden sofort auf PROD bereitstellen.
Nach der Bereitstellung ist ein Link zum Starten der neu erstellten API verfügbar. Wir werden zu dieser URL in der Adressleiste des Browsers gehen (oder den Befehl curl im Terminal ausführen) - wir erhalten einen API-Aufruf und starten als Ergebnis die Lambda-Funktion:
Ich werde die Postman- Anwendung verwenden, um das AWS API Gateway zu demonstrieren. Darin können Sie den Betrieb der API ganz bequem debuggen und testen.
Erster API-TestKopieren Sie die URL von der PROD-Phase zu Postman und senden Sie eine GET-Anfrage an unsere API:

Es scheint etwas schiefgegangen zu sein ... Die GET-Anforderung gab eine JSON-Antwort mit Code 400 und einen Hinweis zurück, dass der Page-Parameter in der API-Aufrufanforderung nicht festgelegt wurde. Unterstützung für Anforderungsparameter zur API hinzufügen.
- Unterstützung für übergebene Parameter in der Anfrage.
Wir kehren zu den Einstellungen der GET-Anforderung zurück und gehen zum Schritt Methodenanforderung.
In den detaillierten Einstellungen der Methodenanforderung müssen Sie den Block URL Query String Parameters erweitern, einen neuen Parameter "page" hinzufügen und erforderlich machen:
Hinzufügen eines Parameters
Wir kehren zur Seite Methodenausführung zurück und gehen zur Integrationsanforderung. Wir gehen zum Ende der Seite und öffnen den Block "Mapping Templates". Wählen Sie "Wenn keine Vorlagen definiert sind (empfohlen)" aus, geben Sie im Feld "Inhaltstyp" application / json an und klicken Sie auf das Häkchen. Wir scrollen die Seite unten nach unten und geben den Code in das Textfeld ein, wie im Bild unten gezeigt. Klicken Sie anschließend auf die Schaltfläche Speichern.
Nachdem wir zuvor die API-Bereitstellung durchgeführt haben, überprüfen wir sie erneut, wobei jedoch der Parameter "page" übergeben wird:

Es ist ein Erfolg! Jetzt hat die Anfrage erfolgreich geklappt und uns die auf der zehnten Seite enthaltenen Sammlungen zurückgegeben! Hurra! - Es bleibt nur, um unsere API vor unerwünschten Angriffen von außen zu schützen.
Dazu müssen Sie die API so konfigurieren, dass beim Zugriff ein geheimer Schlüssel erforderlich ist, der an den Header übergeben wird.
Gehen Sie zu den API-Schlüsseln und erstellen Sie eine neue Reihe von API-Schlüsseln - KeyForBondsList.
Nachdem der API-Schlüssel erfolgreich erstellt wurde, müssen Sie angeben, dass für die getAllBondsList-API der API-Schlüssel im Anforderungsheader übergeben werden muss. Binden Sie eine bestimmte KeyForBondsList an die getAllBondsList-API.
Kehren wir zu den Einstellungen für die GET-Anforderung in Method Request zurück und ändern Sie den Parameter API Key Required von false in true. Jetzt erfordert die API die Übertragung des API-Schlüssels.
API-Schlüssel erforderlich
Gehen Sie zu Nutzungsplan und erstellen Sie einen neuen Plan für die Verwendung der API.
Erstens geben wir ihm einen Namen und eine Beschreibung, und zweitens können Sie hier Grenzen für den Start der API festlegen, z. B. nicht mehr als einen Start pro Sekunde usw.
Klicken Sie auf Weiter und gehen Sie zur nächsten Seite, auf der Sie die Stufen der API mit dem Nutzungsplan verbinden müssen:
Eine Phase an einen Nutzungsplan binden
Auf der nächsten Seite binden wir die API-Schlüssel an den Plan zur Verwendung der API. Klicken Sie auf die Schaltfläche API-Schlüssel zum Nutzungsplan hinzufügen und suchen Sie die erstellten API-Schlüssel in den vorherigen Schritten nach Namen:
API-Schlüssel an Nutzungsplan binden
Nachdem wir die Bereitstellung durchgeführt und den GET-Aufruf unserer API erneut ausgeführt haben, erhalten wir die Antwort: "Verboten", weil Dem Anforderungsheader fehlt der API-Schlüssel:

Versuchen wir, es durch Kopieren von den API-Schlüsseln -> KeyForBondsList -> API-Schlüssel -> Anzeigen und Einfügen in den entsprechenden Abschnitt der Anforderung mit dem Schlüssel "x-api-key" hinzuzufügen:

Alles hat geklappt! Diesmal gibt die Anforderung problemlos Daten zurück. Der API-Aufruf ist sicher und durch den geheimen API-Schlüssel vor Eindringlingen geschützt.
Schlussfolgerungen und Zusammenfassung
In diesem Artikel haben wir uns mit der Erstellung einer serverlosen, automatisch skalierbaren REST-API mithilfe von Amazon Cloud-Diensten befasst. Der Artikel war nicht der kleinste, aber ich habe versucht, den gesamten Prozess der Erstellung der API so weit wie möglich zu erklären und die gesamte Abfolge von Aktionen zu erstellen.
Ich bin sicher, dass Sie nach ein oder zwei Wiederholungen der im Artikel beschriebenen Schritte Ihre Cloud-APIs in 5 Minuten oder noch schneller erhöhen können.
Aufgrund seiner relativen Einfachheit, Preisgünstigkeit und Leistung bietet der AWS API Gateway-Service Entwicklern zahlreiche Möglichkeiten zur Verwendung in der Arbeit und in kommerziellen Projekten. Um das theoretische Material in diesem Artikel zu konsolidieren, melden Sie sich für ein kostenloses Jahresabonnement für Amazon Web Services an und führen Sie die oben genannten Schritte aus, um eine REST-API zu erstellen.
Bei Fragen und Anregungen stehe ich Ihnen gerne zur Verfügung. Ich freue mich auf Ihre Kommentare zum Artikel und wünsche Ihnen viel Erfolg!