Zugriffssteuerung für HTTP-APIs mit AWS Lambda-Genehmigern
Sie verwenden einen Lambda-Genehmiger, um den Zugriff auf Ihre HTTP-API mit einer Lambda-Funktion zu steuern. Wenn dann ein Client Ihre API aufruft, ruft API Gateway Ihre Lambda-Funktion auf. API Gateway verwendet die Antwort Ihrer Lambda-Funktion, um festzustellen, ob der Client auf Ihre API zugreifen kann.
Nutzlastformatversion
Die Nutzlastformatversion des Genehmigers gibt das Format der Daten an, die API Gateway an einen Lambda-Genehmiger sendet, und wie API Gateway die Antwort von Lambda interpretiert. Wenn Sie keine Nutzlastformatversion angeben, verwendet die AWS Management Console standardmäßig die neueste Version. Wenn Sie einen Lambda-Genehmiger mithilfe der AWS CLI, AWS CloudFormation oder eines SDK erstellen, müssen Sie eine authorizerPayloadFormatVersion angeben. Die unterstützten Werte sind 1.0 und 2.0.
Wenn Sie Kompatibilität mit REST-APIs benötigen, verwenden Sie Version 1.0.
Die folgenden Beispiele zeigen die Struktur jeder Nutzlastformatversion.
Antwortformat des Lambda-Genehmigers
Die Nutzlastformatversion bestimmt auch die Struktur der Antwort, die von Ihrer Lambda-Funktion zurückgeben werden muss.
Lambda-Funktionsantwort für Format 1.0
Wenn Sie Formatversion 1.0 auswählen, müssen Lambda-Genehmiger eine IAM-Richtlinie zurückgeben, die den Zugriff auf Ihre API-Route zulässt oder verweigert. Sie können die IAM-Standardrichtliniensyntax in der Richtlinie verwenden. Beispiele für IAM-Richtlinien finden Sie unter Kontrollieren des Zugriffs für den API-Aufruf. Mit $context.authorizer. können Sie Kontexteigenschaften an Lambda-Integrationen oder -Zugriffsprotokolle übergeben. Das propertycontext-Objekt ist optional und claims ist ein reservierter Platzhalter, der nicht als Kontextobjekt verwendet werden kann. Weitere Informationen hierzu finden Sie unter HTTP-API-Zugriffsprotokolle anpassen.
Lambda-Funktionsantwort für Format 2.0
Wenn Sie Formatversion 2.0 auswählen, können Sie einen booleschen Wert oder eine IAM-Richtlinie zurückgeben, die die IAM-Standardrichtliniensyntax Ihrer Lambda-Funktion verwendet. Um einen booleschen Wert zurückzugeben, aktivieren Sie einfache Antworten für den Genehmiger. Die folgenden Beispiele veranschaulichen das Format, das Sie für die Rückgabe Ihrer Lambda-Funktion codieren müssen. Das Objekt context ist optional. Mit $context.authorizer. können Sie Kontexteigenschaften an Lambda-Integrationen oder -Zugriffsprotokolle übergeben. Weitere Informationen hierzu finden Sie unter HTTP-API-Zugriffsprotokolle anpassen.property
Beispiel für Lambda-Genehmiger-Funktionen
Die Lambda-Funktionen des folgenden Node.js-Beispiels veranschaulichen die erforderlichen Antwortformate, die Sie von Ihrer Lambda-Funktion für Formatversion 2.0 der Nutzlast zurückgeben müssen.
Identitätsquellen
Sie können optional Identitätsquellen für einen Lambda-Genehmiger angeben. Identitätsquellen geben den Speicherort der Daten an, die für die Autorisierung einer Anforderung erforderlich sind. Beispielsweise können Sie Header- oder Abfragezeichenfolgenwerte als Identitätsquellen angeben. Wenn Sie Identitätsquellen angeben, müssen Clients diese in die Anforderung aufnehmen. Wenn die Anforderung des Clients die Identitätsquellen nicht enthält, ruft API Gateway Ihren Lambda-Genehmiger nicht auf, und der Client erhält einen 401-Fehler.
In der folgenden Tabelle werden die unterstützten Identitätsquellen für einen Lambda-Genehmiger beschrieben.
Typ |
Beispiel |
Hinweise |
|---|---|---|
| Header-Wert | $request.header.Name |
Bei Header-Namen wird nicht zwischen Groß- und Kleinschreibung unterschieden. |
| Abfragezeichenfolgenwert | $request.querystring.Name |
Abfragezeichenfolgennamen unterscheiden zwischen Groß- und Kleinschreibung. |
| Kontextvariable | $context.Variablenname |
Der Wert einer unterstützten Kontextvariablen. |
| Stufenvariable | $stageVariables.Variablenname |
Der Wert einer Stufenvariablen. |
Sie können auch direkt {"errorMessage" : "Unauthorized"} aus Ihrer Lambda-Funktion zurückgeben, um einen 401-Fehler an die Clients zurückzugeben. Wenn Sie einen 401-Fehler direkt aus Ihrer Lambda-Funktion an die Clients zurückgeben, geben Sie beim Erstellen Ihres Lambda-Genehmigers keine Identitätsquellen an.
Zwischenspeichern der Antworten des Genehmigers
Sie können die Zwischenspeicherung für einen Lambda-Genehmiger aktivieren, indem Sie eine Wert für authorizerResultTtlInSeconds angeben. Wenn für einen Genehmiger Zwischenspeicherung aktiviert ist, verwendet API Gateway die Identitätsquellen des Genehmigers als Cache-Schlüssel. Wenn ein Client dieselben Parameter in Identitätsquellen innerhalb der konfigurierten TTL angibt, verwendet API Gateway das zwischengespeicherte Genehmiger-Ergebnis, anstatt Ihre Lambda-Funktion aufzurufen.
Um das Caching zu aktivieren, muss der Genehmiger über mindestens eine Identitätsquelle verfügen.
Wenn Sie einfache Antworten für einen Genehmiger aktivieren, erlaubt oder verweigert die Antwort des Genehmigers alle API-Anforderungen, die mit den zwischengespeicherten Identitätsquellwerten übereinstimmen, vollständig. Um detailliertere Berechtigungen zu erhalten, deaktivieren Sie einfache Antworten und geben Sie eine IAM-Richtlinie zurück. Je nach Genehmiger muss Ihre IAM-Richtlinie möglicherweise den Zugriff auf mehrere Ressourcen steuern.
Standardmäßig verwendet API Gateway die zwischengespeicherte Genehmiger-Antwort für alle Routen einer API, die den Genehmiger verwenden. Um Antworten pro Route zwischenzuspeichern, fügen Sie den Identitätsquellen Ihres Genehmigers $context.routeKey hinzu.
Erstellen eines Lambda-Genehmigers
Wenn Sie einen Lambda-Genehmiger erstellen, geben Sie die Lambda-Funktion an, die API Gateway verwenden soll. Sie müssen API Gateway die Berechtigung zum Aufrufen der Lambda-Funktion erteilen, indem Sie entweder die Ressourcenrichtlinie der Funktion oder eine IAM-Rolle verwenden. Der create-authorizer-Befehl erstellt einen Lambda-Genehmiger:
aws apigatewayv2 create-authorizer \ --api-idabcdef123\ --authorizer-type REQUEST \ --identity-source '$request.header.Authorization' \ --name lambda-authorizer \ --authorizer-uri 'arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:123456789012:function:my-function/invocations' \ --authorizer-payload-format-version '2.0' \ --enable-simple-responses
Der folgende add-permission-Befehl aktualisiert die Ressourcenrichtlinie der Lambda-Funktion, um API Gateway die Berechtigung zum Aufrufen der Funktion zu erteilen. Wenn API Gateway nicht zum Aufrufen Ihrer Funktion berechtigt ist, erhalten Clients einen 500 Internal Server Error.
aws lambda add-permission \ --function-namemy-authorizer-function\ --statement-id apigateway-invoke-permissions-abc123 \ --action lambda:InvokeFunction \ --principal apigateway.amazonaws.com \ --source-arn "arn:aws:execute-api:us-west-2:123456789012:api-id/authorizers/authorizer-id"
Nachdem Sie einen Genehmiger erstellt und API Gateway die Berechtigung zum Aufrufen erteilt haben, aktualisieren Sie Ihre Route, um den Genehmiger zu verwenden. Der folgende update-route-Befehl fügt der Route den Lambda-Genehmiger hinzu. Wenn Ihr Lambda-Genehmiger eine Richtlinienspeicherung verwendet, stellen Sie sicher, dass Sie die Richtlinie aktualisieren, um den Zugriff für die zusätzliche Route zu steuern.
aws apigatewayv2 update-route \ --api-idabcdef123\ --route-idabc123\ --authorization-type CUSTOM \ --authorizer-iddef123
Fehlerbehebung für Lambda-Genehmiger
Wenn API Gateway Ihren Lambda-Genehmiger nicht aufrufen kann oder Ihr Lambda-Genehmiger eine Antwort in einem ungültigen Format zurückgibt, erhalten Clients einen 500 Internal Server
Error.
Um Fehler zu beheben, aktivieren Sie die Zugriffsprotokollierung für Ihre API-Stufe. Fügen Sie die $context.authorizer.error-Protokollierungsvariable in Ihr Protokollformat ein.
Wenn die Protokolle darauf hinweisen, dass API Gateway keine Berechtigung zum Aufrufen Ihrer Funktion besitzt, aktualisieren Sie die Ressourcenrichtlinie Ihrer Funktion oder stellen Sie eine IAM-Rolle bereit, um die API Gateway-Berechtigung zum Aufrufen des Genehmigers zu erteilen.
Wenn die Protokolle darauf hinweisen, dass Ihre Lambda-Funktion eine ungültige Antwort zurückgibt, überprüfen Sie, ob Ihre Lambda-Funktion eine Antwort im erforderlichen Format zurückgibt.