Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Schreiben von Lambda-Funktionen für S3 Object Lambda Access Points
In diesem Abschnitt wird beschrieben, wie AWS Lambda Funktionen für die Verwendung mit Amazon S3 Object Lambda Access Points geschrieben werden.
Informationen zu den vollständigen end-to-end Verfahren für einige S3 Object Lambda-Aufgaben finden Sie im Folgenden:
Themen
Arbeiten mit GetObject
-Anforderungen in Lambda
In diesem Abschnitt wird davon ausgegangen, dass Ihr Object Lambda Access Point für den Aufruf der Lambda-Funktion für GetObject
konfiguriert ist. S3 Objekt Lambda enthält die Amazon-S3-API-Operation WriteGetObjectResponse
, mit der die Lambda-Funktion dem GetObject
-Aufrufer benutzerdefinierte Daten und Antwort-Header bereitstellen kann.
WriteGetObjectResponse
bietet Ihnen eine umfassende Kontrolle über den Statuscode, die Antwort-Header und den Antworttext, basierend auf Ihren Verarbeitungsanforderungen. Sie können WriteGetObjectResponse
verwenden, um mit dem gesamten transformierten Objekt, Teilen des transformierten Objekts oder anderen Antworten basierend auf dem Kontext Ihrer Anwendung zu antworten. Der folgende Abschnitt zeigt eindeutige Beispiele für die Verwendung des WriteGetObjectResponse
-API-Vorgangs.
-
Beispiel 1: Mit einem HTTP-Statuscode 403 (Forbidden) antworten
-
Beispiel 2: Reagieren Sie mit einem transformierten Bild
-
Beispiel 3: Komprimierte Inhalte streamen
Beispiel 1: Mit einem HTTP-Statuscode 403 (Forbidden) antworten
Sie können WriteGetObjectResponse
verwenden, um basierend auf dem Inhalt des Objekts mit dem HTTP-Statuscode 403 (Forbidden) zu antworten.
Beispiel 2: Reagieren Sie mit einem transformierten Bild
Wenn Sie eine Bildtransformation durchführen, stellen Sie möglicherweise fest, dass Sie alle Bytes des Quellobjekts benötigen, bevor Sie mit der Verarbeitung beginnen können. In diesem Fall gibt Ihre WriteGetObjectResponse
-Anforderung das gesamte Objekt in einem Aufruf an die anfragende Anwendung zurück.
Beispiel 3: Komprimierte Inhalte streamen
Beim Komprimieren von Objekten werden komprimierte Daten inkrementell erzeugt. Folglich können Sie Ihre WriteGetObjectResponse
-Anforderung verwenden, um die komprimierten Daten zurückzugeben, sobald sie bereit sind. Wie in diesem Beispiel gezeigt, ist es nicht notwendig, die Länge der abgeschlossenen Transformation zu kennen.
Anmerkung
Obwohl S3 Object Lambda ermöglicht, bis zu 60 Sekunden eine vollständige Antwort an den Aufrufer über die WriteGetObjectResponse
-Anforderung zu senden, ist die tatsächlich verfügbare Zeit möglicherweise geringer. Zum Beispiel kann Ihr Timeout für Lambda-Funktionen weniger als 60 Sekunden betragen. In anderen Fällen kann der Aufrufer strengere Zeitbeschränkungen haben.
Damit der ursprüngliche Aufrufer eine andere Antwort als einen HTTP-Statuscode 500 (Interner Serverfehler) erhält, muss der WriteGetObjectResponse
-Aufruf abgeschlossen sein. Wenn die Lambda-Funktion mit einer Ausnahme oder anderweitig Ergebnisse zurückgibt, bevor die API-Operation WriteGetObjectResponse
aufgerufen wird, erhält der ursprüngliche Aufrufer eine 500-Antwort (Interner Serverfehler). Ausnahmen, die während der Zeit ausgelöst werden, die zum Abschließen der Antwort benötigt wird, führen zu verkürzten Antworten an den Aufrufer. Wenn die Lambda-Funktion eine HTTP-Statuscode 200 (OK)-Antwort vom WriteGetObjectResponse
-API-Aufruf erhält, hat der ursprüngliche Aufrufer die vollständige Anforderung gesendet. Die Antwort der Lambda-Funktion, wird von S3 Object Lambda, unabhängig davon, ob eine Ausnahme ausgelöst wird oder nicht, ignoriert.
Beim Aufruf der API-Operation WriteGetObjectResponse
benötigt Amazon S3 den Routen- und Anforderungstoken aus dem Ereigniskontext. Weitere Informationen finden Sie unter Format und Verwendung des Ereigniskontexts.
Die Routen- und Anforderungstokenparameter sind erforderlich, um die WriteGetObjectResult
-Antwort mit dem ursprünglichen Aufrufer zu verbinden. Obwohl es immer angemessen ist, 500-Antworten (Interner Serverfehler) zu wiederholen, beachten Sie, dass es sich bei dem Anforderungstoken um ein einmaliges Verwendungstoken handelt und nachfolgende Verwendungsversuche zu HTTP-Statuscode 400 (Bad Request)-Antworten führen können. Obwohl der Aufruf an WriteGetObjectResponse
mit den Routen- und Anforderungstoken nicht von der aufgerufenen Lambda-Funktion erfolgen muss, ist hierfür eine Identität im selben Konto erforderlich. Der Aufruf muss außerdem abgeschlossen sein, bevor die Lambda-Funktion die Ausführung beendet.
Arbeiten mit HeadObject
-Anforderungen in Lambda
In diesem Abschnitt wird davon ausgegangen, dass Ihr Object Lambda Access Point für den Aufruf der Lambda-Funktion für HeadObject
konfiguriert ist. Lambda erhält eine JSON-Nutzlast, die einen Schlüssel namens headObjectContext
enthält. Innerhalb des Kontexts gibt es eine einzelne Eigenschaft namens inputS3Url
, bei der es sich um eine vorsignierte URL für den unterstützenden Zugriffspunkt für HeadObject
handelt.
Die vorsignierte URL enthält die folgenden Eigenschaften, wenn sie angegeben sind:
-
versionId
(in den Abfrageparametern) -
requestPayer
(imx-amz-request-payer
-Header) -
expectedBucketOwner
(imx-amz-expected-bucket-owner
-Header)
Andere Eigenschaften werden nicht vorsigniert und daher nicht berücksichtigt. Nicht signierte Optionen, die als Header gesendet werden, können manuell zur Anforderung hinzugefügt werden, wenn die vorsignierte URL aufgerufen wird, die sich in den userRequest
-Headern befindet. Serverseitige Verschlüsselungsoptionen werden für HeadObject
nicht unterstützt.
Informationen zu den URI-Parametern der Anforderungssyntax finden Sie unter HeadObject
in der API-Referenz für Amazon Simple Storage Service.
Das folgende Beispiel zeigt eine Lambda-JSON-Eingabe-Nutzlast für HeadObject
.
{ "xAmzRequestId": "
requestId
", "**headObjectContext**": { "**inputS3Url**": "https://my-s3-ap-111122223333
.s3-accesspoint.us-east-1
.amazonaws.com/example?X-Amz-Security-Token=<snip>" }, "configuration": { "accessPointArn": "arn:aws:s3-object-lambda:us-east-1
:111122223333
:accesspoint/example-object-lambda-ap
", "supportingAccessPointArn": "arn:aws:s3:us-east-1
:111122223333
:accesspoint/example-ap
", "payload": "{}" }, "userRequest": { "url": "https://object-lambda-111122223333
.s3-object-lambda.us-east-1
.amazonaws.com/example
", "headers": { "Host": "object-lambda-111122223333
.s3-object-lambda.us-east-1
.amazonaws.com", "Accept-Encoding": "identity", "X-Amz-Content-SHA256": "e3b0c44298fc1example
" } }, "userIdentity": { "type": "AssumedRole", "principalId": "principalId
", "arn": "arn:aws:sts::111122223333
:assumed-role/Admin/example
", "accountId": "111122223333
", "accessKeyId": "accessKeyId
", "sessionContext": { "attributes": { "mfaAuthenticated": "false", "creationDate": "Wed Mar 10 23:41:52 UTC 2021" }, "sessionIssuer": { "type": "Role", "principalId": "principalId
", "arn": "arn:aws:iam::111122223333
:role/Admin", "accountId": "111122223333
", "userName": "Admin" } } }, "protocolVersion": "1.00" }
Ihre Lambda-Funktion sollte ein JSON-Objekt zurückgeben, das die Header und Werte enthält, die für den HeadObject
-Aufruf zurückgegeben werden.
Das folgende Beispiel zeigt die Struktur der JSON-Nachricht der Lambda-Antwort für HeadObject
.
{ "statusCode": <number>; // Required "errorCode": <string>; "errorMessage": <string>; "headers": { "Accept-Ranges": <string>, "x-amz-archive-status": <string>, "x-amz-server-side-encryption-bucket-key-enabled": <boolean>, "Cache-Control": <string>, "Content-Disposition": <string>, "Content-Encoding": <string>, "Content-Language": <string>, "Content-Length": <number>, // Required "Content-Type": <string>, "x-amz-delete-marker": <boolean>, "ETag": <string>, "Expires": <string>, "x-amz-expiration": <string>, "Last-Modified": <string>, "x-amz-missing-meta": <number>, "x-amz-object-lock-mode": <string>, "x-amz-object-lock-legal-hold": <string>, "x-amz-object-lock-retain-until-date": <string>, "x-amz-mp-parts-count": <number>, "x-amz-replication-status": <string>, "x-amz-request-charged": <string>, "x-amz-restore": <string>, "x-amz-server-side-encryption": <string>, "x-amz-server-side-encryption-customer-algorithm": <string>, "x-amz-server-side-encryption-aws-kms-key-id": <string>, "x-amz-server-side-encryption-customer-key-MD5": <string>, "x-amz-storage-class": <string>, "x-amz-tagging-count": <number>, "x-amz-version-id": <string>, <x-amz-meta-headers>: <string>, // user-defined metadata "x-amz-meta-meta1": <string>, // example of the user-defined metadata header, it will need the x-amz-meta prefix "x-amz-meta-meta2": <string> ... }; }
Das folgende Beispiel zeigt, wie Sie die vorsignierte URL verwenden, um Ihre Antwort aufzufüllen, indem Sie die Header-Werte nach Bedarf ändern, bevor das JSON-Objekt zurückgegeben wird.
Arbeiten mit ListObjects
-Anforderungen in Lambda
In diesem Abschnitt wird davon ausgegangen, dass Ihr Object Lambda Access Point für den Aufruf der Lambda-Funktion für ListObjects
konfiguriert ist. Lambda erhält die JSON-Nutzlast mit einem neuen Objekt namens listObjectsContext
. listObjectsContext
enthält eine einzelne Eigenschaft, inputS3Url
, bei der es sich um eine vorsignierte URL für den unterstützenden Zugriffspunkt ListObjects
handelt.
Im Gegensatz zu GetObject
und HeadObject
enthält die vorsignierte URL die folgenden Eigenschaften, wenn sie angegeben sind:
-
Alle Abfrageparameter
-
requestPayer
(imx-amz-request-payer
-Header) -
expectedBucketOwner
(imx-amz-expected-bucket-owner
-Header)
Informationen zu den URI-Parametern der Anforderungssyntax finden Sie unter ListObjects
in der API-Referenz für Amazon Simple Storage Service.
Wichtig
Wir empfehlen, bei der Entwicklung von Anwendungen die neuere Version ListObjectsV2 zu verwenden. Aus Gründen der Abwärtskompatibilität unterstützt Amazon S3 weiterhin ListObjects
.
Das folgende Beispiel zeigt die Lambda-JSON-Eingabe-Nutzlast für ListObjects
.
{ "xAmzRequestId": "
requestId
", "**listObjectsContext**": { "**inputS3Url**": "https://my-s3-ap-111122223333
.s3-accesspoint.us-east-1
.amazonaws.com/?X-Amz-Security-Token=<snip>", }, "configuration": { "accessPointArn": "arn:aws:s3-object-lambda:us-east-1
:111122223333
:accesspoint/example-object-lambda-ap
", "supportingAccessPointArn": "arn:aws:s3:us-east-1
:111122223333
:accesspoint/example-ap
", "payload": "{}" }, "userRequest": { "url": "https://object-lambda-111122223333
.s3-object-lambda.us-east-1
.amazonaws.com/example
", "headers": { "Host": "object-lambda-111122223333
.s3-object-lambda.us-east-1
.amazonaws.com", "Accept-Encoding": "identity", "X-Amz-Content-SHA256": "e3b0c44298fc1example
" } }, "userIdentity": { "type": "AssumedRole", "principalId": "principalId
", "arn": "arn:aws:sts::111122223333
:assumed-role/Admin/example
", "accountId": "111122223333
", "accessKeyId": "accessKeyId
", "sessionContext": { "attributes": { "mfaAuthenticated": "false", "creationDate": "Wed Mar 10 23:41:52 UTC 2021" }, "sessionIssuer": { "type": "Role", "principalId": "principalId
", "arn": "arn:aws:iam::111122223333
:role/Admin", "accountId": "111122223333
", "userName": "Admin" } } }, "protocolVersion": "1.00" }
Ihre Lambda-Funktion sollte ein JSON-Objekt zurückgeben, das den Statuscode, das Listen-XML-Ergebnis oder die Fehlerinformationen enthält, die von S3 Object Lambda zurückgegeben werden.
S3 Object Lambda verarbeitet oder validiert listResultXml
nicht, sondern leitet es an den ListObjects
-Aufrufer weiter. Für listBucketResult
erwartet S3 Object Lambda, dass bestimmte Eigenschaften von einem speziellen Typ sind, und löst Ausnahmen aus, wenn es sie nicht analysieren kann. listResultXml
und listBucketResult
können nicht gleichzeitig bereitgestellt werden.
Das folgende Beispiel zeigt, wie die vorsignierte URL verwendet wird, um Amazon S3 aufzurufen und das Ergebnis zum Auffüllen einer Antwort einschließlich der Fehlerprüfung zu nutzen.
Das folgende Beispiel zeigt die Struktur der JSON-Nachricht der Lambda-Antwort für ListObjects
.
{ "statusCode": <number>; // Required "errorCode": <string>; "errorMessage": <string>; "listResultXml": <string>; // This can also be Error XML string in case S3 returned error response when calling the pre-signed URL "listBucketResult": { // listBucketResult can be provided instead of listResultXml, however they can not both be provided in the JSON response "name": <string>, // Required for 'listBucketResult' "prefix": <string>, "marker": <string>, "nextMarker": <string>, "maxKeys": <int>, // Required for 'listBucketResult' "delimiter": <string>, "encodingType": <string> "isTruncated": <boolean>, // Required for 'listBucketResult' "contents": [ { "key": <string>, // Required for 'content' "lastModified": <string>, "eTag": <string>, "checksumAlgorithm": <string>, // CRC32, CRC32C, SHA1, SHA256 "size": <int>, // Required for 'content' "owner": { "displayName": <string>, // Required for 'owner' "id": <string>, // Required for 'owner' }, "storageClass": <string> }, ... ], "commonPrefixes": [ { "prefix": <string> // Required for 'commonPrefix' }, ... ], } }
Arbeiten mit ListObjectsV2
-Anforderungen in Lambda
In diesem Abschnitt wird davon ausgegangen, dass Ihr Object Lambda Access Point für den Aufruf der Lambda-Funktion für ListObjectsV2
konfiguriert ist. Lambda erhält die JSON-Nutzlast mit einem neuen Objekt namens listObjectsV2Context
. listObjectsV2Context
enthält eine einzelne Eigenschaft, inputS3Url
, bei der es sich um eine vorsignierte URL für den unterstützenden Zugriffspunkt ListObjectsV2
handelt.
Im Gegensatz zu GetObject
und HeadObject
enthält die vorsignierte URL die folgenden Eigenschaften, wenn sie angegeben sind:
-
Alle Abfrageparameter
-
requestPayer
(imx-amz-request-payer
-Header) -
expectedBucketOwner
(imx-amz-expected-bucket-owner
-Header)
Informationen zu den URI-Parametern der Anforderungssyntax finden Sie unter ListObjectsV2
in der API-Referenz für Amazon Simple Storage Service.
Das folgende Beispiel zeigt die Lambda-JSON-Eingabe-Nutzlast für ListObjectsV2
.
{ "xAmzRequestId": "
requestId
", "**listObjectsV2Context**": { "**inputS3Url**": "https://my-s3-ap-111122223333
.s3-accesspoint.us-east-1
.amazonaws.com/?list-type=2&X-Amz-Security-Token=<snip>", }, "configuration": { "accessPointArn": "arn:aws:s3-object-lambda:us-east-1
:111122223333
:accesspoint/example-object-lambda-ap
", "supportingAccessPointArn": "arn:aws:s3:us-east-1
:111122223333
:accesspoint/example-ap
", "payload": "{}" }, "userRequest": { "url": "https://object-lambda-111122223333
.s3-object-lambda.us-east-1
.amazonaws.com/example
", "headers": { "Host": "object-lambda-111122223333
.s3-object-lambda.us-east-1
.amazonaws.com", "Accept-Encoding": "identity", "X-Amz-Content-SHA256": "e3b0c44298fc1example
" } }, "userIdentity": { "type": "AssumedRole", "principalId": "principalId
", "arn": "arn:aws:sts::111122223333
:assumed-role/Admin/example
", "accountId": "111122223333
", "accessKeyId": "accessKeyId
", "sessionContext": { "attributes": { "mfaAuthenticated": "false", "creationDate": "Wed Mar 10 23:41:52 UTC 2021" }, "sessionIssuer": { "type": "Role", "principalId": "principalId
", "arn": "arn:aws:iam::111122223333
:role/Admin", "accountId": "111122223333
", "userName": "Admin" } } }, "protocolVersion": "1.00" }
Ihre Lambda-Funktion sollte ein JSON-Objekt zurückgeben, das den Statuscode, das Listen-XML-Ergebnis oder die Fehlerinformationen enthält, die von S3 Object Lambda zurückgegeben werden.
S3 Object Lambda verarbeitet oder validiert listResultXml
nicht, sondern leitet es an den ListObjectsV2
-Aufrufer weiter. Für listBucketResult
erwartet S3 Object Lambda, dass bestimmte Eigenschaften von einem speziellen Typ sind, und löst Ausnahmen aus, wenn es sie nicht analysieren kann. listResultXml
und listBucketResult
können nicht gleichzeitig bereitgestellt werden.
Das folgende Beispiel zeigt, wie die vorsignierte URL verwendet wird, um Amazon S3 aufzurufen und das Ergebnis zum Auffüllen einer Antwort einschließlich der Fehlerprüfung zu nutzen.
Das folgende Beispiel zeigt die Struktur der JSON-Nachricht der Lambda-Antwort für ListObjectsV2
.
{ "statusCode": <number>; // Required "errorCode": <string>; "errorMessage": <string>; "listResultXml": <string>; // This can also be Error XML string in case S3 returned error response when calling the pre-signed URL "listBucketResult": { // listBucketResult can be provided instead of listResultXml, however they can not both be provided in the JSON response "name": <string>, // Required for 'listBucketResult' "prefix": <string>, "startAfter": <string>, "continuationToken": <string>, "nextContinuationToken": <string>, "keyCount": <int>, // Required for 'listBucketResult' "maxKeys": <int>, // Required for 'listBucketResult' "delimiter": <string>, "encodingType": <string> "isTruncated": <boolean>, // Required for 'listBucketResult' "contents": [ { "key": <string>, // Required for 'content' "lastModified": <string>, "eTag": <string>, "checksumAlgorithm": <string>, // CRC32, CRC32C, SHA1, SHA256 "size": <int>, // Required for 'content' "owner": { "displayName": <string>, // Required for 'owner' "id": <string>, // Required for 'owner' }, "storageClass": <string> }, ... ], "commonPrefixes": [ { "prefix": <string> // Required for 'commonPrefix' }, ... ], } }