Seit letztem November steht für JavaScript/TypeScript-Lambdas eine Node18-Runtime zur Verfügung. Doch aufgepasst, denn in der Mitteilung versteckt sich der Hinweis, dass die Node18-Runtime als erste Node-Runtime das JavaScript AWS SDK v3 im Gepäck hat; frühere Runtimes nutzen das SDK v2. Das wird bei vielen, die ihre Runtime updaten, dank Breaking Changes zu folgendem Fehler führen:
"Runtime.ImportModuleError: Error: Cannot find module 'aws-sdk'
… bzw. hinter einem API-Gateway (von einer Serverless-Anwendung) ein {"message": "Internal server error"}
.
Da die Node14-Runtime am 30. April 2023 ihr End-of-life erreicht, wird das sicher in nächster Zeit bei vielen der Fall sein.
Ein schneller Fix
Der schnelle Fix ist, die Imports zu ändern; ein Beispiel dazu findet ihr hier:
const AWS = require('aws-sdk'); const S3 = new AWS.S3();
const { S3Client, ListObjectsV2Command, GetObjectCommand, PutObjectCommand, DeleteObjectCommand, } = require("@aws-sdk/client-s3"); const S3 = new S3Client({});
Damit wird auch automatisch die Bundle-Größe des Lambdas reduziert, da nicht mehr das komplette AWS SDK gebundlet werden muss.
Hier kommt der erste Pitfall: Wer nur ein einzelnes JS-File hat, sollte nicht den Fehler machen und auf die import
-Syntax wechseln. Denn ohne package.json
oder .mjs
-Files kompiliert folgender Code nicht (alten JavaScript-Hasen ist das sicherlich klar).
import { S3Client, ListObjectsV2Command, GetObjectCommand, PutObjectCommand, DeleteObjectCommand } from '@aws-sdk/client-s3';
Und noch ein Pitfall
Ein weiterer Pitfall: Selbst im v2-Kompatibilitätsmodus reagieren die APIs der einzelnen AWS-Services anders als in v2, deshalb werdet ihr wahrscheinlich noch ein paar andere Stellen anpassen müssen. Bei mir war das z. B.:
<<<<<<< HEAD const data = await S3.listObjectsV2({ Bucket: bucketName }).promise(); // Sogar der .promise()-Operator existiert in der v3-Version im v2-compatibility-Modus nicht var body = { widgets: data.Contents.map(function(e) { return e.Key }) }; ======= const data = await S3.send( new ListObjectsV2Command({ Bucket: bucketName }) ); var body = { widgets: data.KeyCount > 0 // Richtig beobachtet, in v2 gibt bei einem leeren Bucket die Property Contents ein leeres Array zurück, in v3 existiert sie nicht, wenn der Bucket leer ist ? data.Contents.map(function (e) { return e.Key; }) : [], }; >>>>>>> v3-version
Also plant besser ein bisschen Zeit für eine Migration eurer Lambdas ein. Es lohnt sich aber auch, da das SDK v3 viele neue Features und ein modulareres, performanteres Bundling enthält.
Schreibe einen Kommentar