AWS Bits: Node18-Runtime und JS AWS SDK v3

AWS Bits: Node18-Runtime und JS AWS SDK v3

Avatar von Max Tharr

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.

Weitere News aus dem AWS-Universum


Avatar von Max Tharr

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert


Für das Handling unseres Newsletters nutzen wir den Dienst HubSpot. Mehr Informationen, insbesondere auch zu Deinem Widerrufsrecht, kannst Du jederzeit unserer Datenschutzerklärung entnehmen.