All Articles

Optimale Szenarien für die Anwendung von Python in AWS Lambdas

feature.jpg

Serverless Architekturen und Anwendungen erfreuen sich zunehmender Beliebtheit, da sie kostengünstig, flexibel und effizient sind. Diese lassen sich mithilfe verschiedener synchroner und asynchroner Kommunikationswege implementieren. Dank ihrer Leichtgewichtigkeit und einfachen Ausführbarkeit entfällt die Notwendigkeit komplexer Infrastruktur-Setups. Zudem werden verschiedene Programmiersprachen, darunter Python, NodeJS und GoLang, unterstützt. Die Wahl der Sprache beeinflusst maßgeblich die Ausführungszeit, wobei Python und NodeJS als schnellste Sprachen gelten, wie in einem Artikel zur AWS Lambda Performance von Simform aufgezeigt.

NodeJS im Serverless Umfeld

Persönlich bevorzuge ich NodeJS beziehungsweise TypeScript als Entwickler, um effiziente Lambda-Funktionen zu erstellen. Dies entspricht auch dem Trend, da NodeJS laut einem Bericht von Data Dog die beliebteste Sprache im Serverless-Umfeld ist (Data Dog “State of Serverless” Artikel).

AWS SDK v3 und Boto3 Werkzeuge der Wahl

Für die Entwicklung von Lambda-Funktionen stellt AWS das SDK v3 bereit (AWS SDK v3 Dokumentation). Allerdings wird es bei Situationen, in denen die Infrastruktur Teil des Codes ist, schnell kompliziert. Hier erfordert das SDK mehr Zeilen als wünschenswert. Im Vergleich dazu bietet Python mit dem Boto3-Client (AWS Boto3 Client Dokumentation) eine elegantere Lösung, bei der einige Funktionen des SDKs entfallen oder unkomplizierter umgesetzt werden.

S3-Bucket leeren

Nachfolgend ein Code-Beispiel mit beiden Bibliotheken zum Leeren eines S3-Buckets, ohne den Bucket selbst zu löschen. Während der Python-Code praktisch auf einen Einzeiler reduziert werden kann, erfordert der SDK-Code das Lesen der Objekte im Bucket und die Ausführung eines DeleteObjectsCommand.

In vielen Szenarien bietet der Boto3-Client eine Funktion für eine Aufgabe, während im SDK mühsam mit dem Command-Pattern und den Clients der Code aufgebaut werden muss.

Boto3 Python Codesnippet: Einen S3-Bucket leeren

import boto3
import logging
from botocore.exceptions import ClientError

logger = logging.getLogger()
s3 = boto3.resource('s3')

try:
    bucket = s3.Bucket('test')
    bucket.object_versions.all().delete()
    logger.info('test bucket emptied')
except ClientError as error:
    logger.error(error)

AWS SDK v3 NodeJS Codesnippet: Einen S3-Bucket leeren

const client = new S3Client({});
const bucketName = "test";
let objectsToDelete = [];

// list bucket
const objects = await client.send(
  new ListObjectsCommand({
    Bucket: bucketName,
  }),
);

// check if bucket has content,
if (objects.Contents) {
  // create an array of objects which will be deleted
  objectsToDelete = objects.Contents.map((object) => {
    return {
      Key: object.Key,
    };
  });

  // send DeleteObjectsCommand
  await client.send(
    new DeleteObjectsCommand({
      Bucket: bucketName,
      Delete: {
        Objects: objects,
      },
    }),
  );
} else {
  console.info("bucket is already empty");
}

Meine Empfehlung

In Anbetracht dessen lautet meine klare Empfehlung: Bei der Entwicklung von Code für AWS-Infrastruktur setzt auf Python. Die Ausführungszeit sollte im Durchschnitt etwas schneller sein und der resultierende Code bleibt wesentlich weniger komplex, was die Erweiterung und Wartung erheblich erleichtert.

Zusätzlich bietet Python noch einen weiteren Vorteil: Die Power Tools für AWS Lambda sind äußerst leistungsfähig und stellen eine wertvolle Ergänzung dar, um die Effizienz Ihrer Lambda-Funktionen weiter zu steigern.

Published 27. Jan. 2024

Lukas Weiß
Lukas Weiß
Manager & Lead Consultant