Tutorial: Hello World REST-API mit Lambda-Proxy-Integration erstellen
Lambda-Proxy-Integration ist ein einfacher, flexibler API Gateway API-Integrationstyp, der es Ihnen ermöglicht, eine API-Methode – oder eine ganze API – mit einer Lambda-Funktion zu integrieren. Die Lambda-Funktion kann in jeder Sprache, die Lambda unterstützt geschrieben werden. Da es sich um eine Proxy-Integration handelt, können Sie die Implementierung der Lambda-Funktion jederzeit ändern, ohne Ihre API erneut bereitstellen zu müssen.
In diesem Tutorial führen Sie folgende Aufgaben aus:
-
Erstellen Sie eine "Hello, World!"- Die Lambda-Funktion ist das Backend für die API.
-
Erstellen und testen Sie eine "Hello, World!"- API mit Lambda-Proxy-Integration.
Themen
Erstellen Sie eine "Hello, World!"- Lambda-Funktion
Diese Funktion gibt dem Aufrufer eine Antwort als JSON-Objekt im folgenden Format zurück:
{ "greeting": "Good
{time}
,{name}
of{city}
.[ Happy{day}
!]" }
Erstellen Sie eine "Hello, World!"- Lambda-Funktion in der Lambda-Konsole
Melden Sie sich bei der Lambda-Konsole unter https://console.aws.amazon.com/lambda
an. -
Wählen Sie in der AWS-Navigationsleiste eine Region (beispielsweise USA Ost (Nord-Virginia)) aus.
Anmerkung Notieren Sie die Region, in der Sie die Lambda-Funktion erstellen. Sie benötigen sie zum Erstellen der API.
-
Wählen Sie im Navigationsbereich Functions (Funktionen) aus.
-
Wählen Sie Create function (Funktion erstellen).
-
Wählen Sie Author from scratch aus.
-
Führen Sie unter Basic information (Grundlegende Informationen) die folgenden Schritte aus:
-
Geben Sie in Function name (Funktionsname)
GetStartedLambdaProxyIntegration
ein. -
Erweitern Sie unter Permissions (Berechtigungen) den Bereich Choose or create an execution role (Ausführungsrolle wählen oder erstellen). Wählen Sie aus der Dropdown-Liste Ausführungsrolle die Option Neue Rolle aus AWS-Richtlinienvorlagen erstellen aus.
-
Geben Sie in Role Name (Rollenname) den Namen
GetStartedLambdaBasicExecutionRole
ein. -
Lassen Sie das Feld Policy templates (Richtlinien-Vorlagen) leer.
-
Wählen Sie Create function (Funktion erstellen).
-
-
Fügen Sie im Inline-Code-Editor unter Function code (Funktionscode) den folgenden Code ein:
'use strict'; console.log('Loading hello world function'); export const handler = async (event) => { let name = "you"; let city = 'World'; let time = 'day'; let day = ''; let responseCode = 200; console.log("request: " + JSON.stringify(event)); if (event.queryStringParameters && event.queryStringParameters.name) { console.log("Received name: " + event.queryStringParameters.name); name = event.queryStringParameters.name; } if (event.queryStringParameters && event.queryStringParameters.city) { console.log("Received city: " + event.queryStringParameters.city); city = event.queryStringParameters.city; } if (event.headers && event.headers['day']) { console.log("Received day: " + event.headers.day); day = event.headers.day; } if (event.body) { let body = JSON.parse(event.body) if (body.time) time = body.time; } let greeting = `Good ${time}, ${name} of ${city}.`; if (day) greeting += ` Happy ${day}!`; let responseBody = { message: greeting, input: event }; // The output from a Lambda proxy integration must be // in the following JSON object. The 'headers' property // is for custom response headers in addition to standard // ones. The 'body' property must be a JSON string. For // base64-encoded payload, you must also set the 'isBase64Encoded' // property to 'true'. let response = { statusCode: responseCode, headers: { "x-custom-header" : "my custom header value" }, body: JSON.stringify(responseBody) }; console.log("response: " + JSON.stringify(response)) return response; };
-
Wählen Sie Deploy (Bereitstellen) aus.
Erstellen Sie eine "Hello, World!"- API
Erstellen Sie jetzt eine API für Ihre "Hello World" Lambda-Funktion unter Verwendung der API Gateway-Konsole.
Erstellen einer "Hello, World!"- API
Melden Sie sich bei der API Gateway-Konsole unter https://console.aws.amazon.com/apigateway
an. -
Wenn Sie API Gateway zum ersten Mal verwenden, sehen Sie eine Seite, die Sie mit den Funktionen des Service vertraut macht. Wählen Sie unter REST-API die Option Build (Erstellen) aus. Wenn das Popup-Fenster Create Exampe API (Beispiel-API erstellen) angezeigt wird, klicken Sie auf OK.
Wenn Sie API Gateway nicht zum ersten Mal verwenden, wählen Sie Create API (API erstellen). Wählen Sie unter REST-API die Option Build (Erstellen) aus.
-
Erstellen Sie eine leere API wie folgt:
-
Wählen Sie unter Create new API (Neue API erstellen) die Option New API (Neue API) aus.
-
Unter Settings (Einstellungen):
-
Geben Sie unter API name (API-Name)
LambdaSimpleProxy
ein. -
Geben Sie bei Bedarf eine Beschreibung in das Feld Description (Beschreibung) ein. Andernfalls lassen Sie es leer.
-
Lassen Sie die Einstellungen für Endpoint Type (Endpunkttyp) auf Regional.
-
-
Wählen Sie Create API (API erstellen) aus.
-
-
Erstellen Sie die
helloworld
-Ressource folgendermaßen:-
Wählen Sie eine Root-Ressource (/) in der Struktur Resources (Ressourcen) aus.
-
Wählen Sie im Dropdown-Menü Actions (Aktionen) die Option Create Resource (Ressource erstellen) aus.
-
Lassen Sie die Option Configure as proxy resource (Als Proxy-Ressource konfigurieren) deaktiviert.
-
Geben Sie für Resource Name (Ressourcenname)
helloworld
ein. -
Lassen Sie den Resource Path (Ressourcenpfad) auf /helloworld festgelegt.
-
Lassen Sie die Option Enable API Gateway CORS (API Gateway CORS aktivieren) deaktiviert.
-
Wählen Sie Create Resource (Ressource erstellen) aus.
-
-
In einer Proxy-Integration wird die gesamte Anfrage unverändert an die Backend-Lambda-Funktion gesendet. Dazu wird eine Catch-All-
ANY
-Methode verwendet, die eine HTTP-Methode repräsentiert. Der tatsächliche HTTP-Methode wird vom Client zur Laufzeit angegeben. Mit der MethodeANY
haben Sie die Möglichkeit, eine einzige API-Methodeneinrichtung für alle unterstützten HTTP-Methoden zu verwenden:DELETE
,GET
,HEAD
,OPTIONS
,PATCH
,POST
undPUT
.Gehen Sie zum Einrichten der
ANY
-Methode wie folgt vor:-
Wählen Sie in der Liste Resources (Ressourcen) /helloworld aus.
-
Wählen Sie im Menü Actions (Aktionen) die Option Create Method (Methode erstellen) aus.
-
Wählen Sie aus dem Dropdown-Menü ANY aus und aktivieren Sie das Häkchen-Symbol
-
Belassen Sie den Integration type (Integrationstyp) auf Lambda Function (Lambda-Funktion).
-
Wählen Sie die Option Use Lambda Proxy integration (Lambda-Proxy-Integration verwenden) aus.
-
Wählen Sie aus dem Dropdown-Menü Lambda Region die Region, in der Sie die
GetStartedLambdaProxyIntegration
-Lambda-Funktion erstellt haben. -
Geben Sie in das Feld Lambda Function (Lambda-Funktion) ein beliebiges Zeichen ein und wählen Sie
GetStartedLambdaProxyIntegration
aus dem Dropdown-Menü. -
Lassen Sie die Option Use default Timeout aktiviert.
-
Wählen Sie Save (Speichern) aus.
-
Wählen Sie OK aus, wenn Sie dazu mit Add Permission to Lambda Function (Berechtigung für Lambda-Funktion hinzufügen) aufgefordert werden.
-
Bereitstellen und Testen der API
API in der API Gateway-Konsole bereitstellen
-
Wählen Sie im Dropdown-Menü Actions (Aktionen) die Option Deploy API (API bereitstellen) aus.
-
Wählen Sie für Deployment stage (Bereitstellungsstufe) New Stage (Neue Stufe).
-
Geben Sie für Stage name (Stufenname)
test
ein. -
Geben Sie bei Bedarf eine Beschreibung für Stage description (Beschreibung der Stufe) ein.
-
Geben Sie bei Bedarf eine Beschreibung für Deployment description (Beschreibung der Bereitstellung) ein.
-
Wählen Sie Deploy (Bereitstellen) aus.
-
Notieren Sie den Wert Invoke URL (Aufruf-URL) der API.
Browser und cURL verwenden, um eine API mit Lambda-Proxy-Integration zu testen
Sie können einen Browser oder eine cURL
Um GET
-Anforderungen mit ausschließlich Abfragezeichenfolge-Parametern zu testen, können Sie die URL für die helloworld
-Ressource der API in eine Adressleiste des Browsers eingeben. Beispiel: https://r275xc9bmd
.execute-api.us-east-1
.amazonaws.com/test/helloworld?name=John&city=Seattle
Für andere Methoden müssen Sie erweiterte REST-API-Testtools wie POSTMAN
So testen Sie die bereitgestellte API mithilfe von cURL:
-
Öffnen Sie ein Terminal-Fenster.
-
Kopieren Sie den folgenden cURL-Befehl und fügen Sie ihn in das Terminalfenster ein. Ersetzen Sie dabei
mit der API-ID Ihrer API undr275xc9bmd
mit der Region, in der Ihre API bereitgestellt ist.us-east-1
curl -v -X POST \ 'https://
r275xc9bmd
.execute-api.us-east-1
.amazonaws.com/test/helloworld?name=John&city=Seattle' \ -H 'content-type: application/json' \ -H 'day: Thursday' \ -d '{ "time": "evening" }'Anmerkung Wenn Sie den Befehl unter Windows ausführen, verwenden Sie stattdessen die folgende Syntax:
curl -v -X POST "https://
r275xc9bmd
.execute-api.us-east-1
.amazonaws.com/test/helloworld?name=John&city=Seattle" -H "content-type: application/json" -H "day: Thursday" -d "{ \"time\": \"evening\" }"
Sie sollten eine positive Antwort mit einer Nutzlast erhalten, die in etwa so aussieht:
{ "message":"Good evening, John of Seattle. Happy Thursday!", "input":{ "resource":"/helloworld", "path":"/helloworld", "httpMethod":"POST", "headers":{"Accept":"*/*", "content-type":"application/json", "day":"Thursday", "Host":"r275xc9bmd.execute-api.us-east-1.amazonaws.com", "User-Agent":"curl/7.64.0", "X-Amzn-Trace-Id":"Root=1-1a2b3c4d-a1b2c3d4e5f6a1b2c3d4e5f6", "X-Forwarded-For":"72.21.198.64", "X-Forwarded-Port":"443", "X-Forwarded-Proto":"https"}, "multiValueHeaders":{"Accept":["*/*"], "content-type":["application/json"], "day":["Thursday"], "Host":["r275xc9bmd.execute-api.us-east-1.amazonaws.com"], "User-Agent":["curl/0.0.0"], "X-Amzn-Trace-Id":["Root=1-1a2b3c4d-a1b2c3d4e5f6a1b2c3d4e5f6"], "X-Forwarded-For":["11.22.333.44"], "X-Forwarded-Port":["443"], "X-Forwarded-Proto":["https"]}, "queryStringParameters":{"city":"Seattle", "name":"John" }, "multiValueQueryStringParameters":{ "city":["Seattle"], "name":["John"] }, "pathParameters":null, "stageVariables":null, "requestContext":{ "resourceId":"3htbry", "resourcePath":"/helloworld", "httpMethod":"POST", "extendedRequestId":"a1b2c3d4e5f6g7h=", "requestTime":"20/Mar/2019:20:38:30 +0000", "path":"/test/helloworld", "accountId":"123456789012", "protocol":"HTTP/1.1", "stage":"test", "domainPrefix":"r275xc9bmd", "requestTimeEpoch":1553114310423, "requestId":"test-invoke-request", "identity":{"cognitoIdentityPoolId":null, "accountId":null, "cognitoIdentityId":null, "caller":null, "sourceIp":"test-invoke-source-ip", "accessKey":null, "cognitoAuthenticationType":null, "cognitoAuthenticationProvider":null, "userArn":null, "userAgent":"curl/0.0.0","user":null }, "domainName":"r275xc9bmd.execute-api.us-east-1.amazonaws.com", "apiId":"r275xc9bmd" }, "body":"{ \"time\": \"evening\" }", "isBase64Encoded":false } }
Wenn Sie die vorherige Methode POST
zu PUT
ändern, sollten Sie dieselbe Antwort erhalten.
Um die Methode GET
zu testen, kopieren Sie den folgenden cURL
-Befehl und fügen Sie ihn in das Terminalfenster ein. Ersetzen Sie dabei
durch die API-ID Ihrer API und r275xc9bmd
durch die Region, in der Ihre API bereitgestellt wird.us-east-1
curl -X GET \ 'https://
r275xc9bmd
.execute-api.us-east-1
.amazonaws.com/test/helloworld?name=John&city=Seattle' \ -H 'content-type: application/json' \ -H 'day: Thursday'
Sie sollten eine ähnliche Antwort erhalten wie bei der vorherigen POST
-Anforderung (mit der Ausnahme, dass die GET
-Anforderung keine Nutzlast hat). Der body
-Parameter ist daher null
.