Serverless-Funktionen in TypeScript: Fortgeschrittenes Niveau in AWS Lambda
\n\nDie Serverless-Architektur ist zum De-facto-Standard für die Erstellung skalierbarer und kosteneffizienter Anwendungen geworden. AWS Lambda ist einer der beliebtesten Dienste zur Implementierung serverloser Funktionen. Wenn die grundlegende Syntax und Trigger (API Gateway, S3, DynamoDB) bereits beherrscht werden, ist es Zeit für fortgeschrittene Techniken. In diesem Artikel betrachten wir die wichtigsten Aspekte der professionellen Entwicklung von Lambda-Funktionen in TypeScript: von der Optimierung des Kaltstarts bis zur Integration mit VPC und der Verwendung komplexer Muster.
\n\n1. Optimierung des Kaltstarts und Speicherverwaltung
\n\nDer Kaltstart (Cold Start) ist der größte Feind der Leistung von Serverless-Anwendungen. In TypeScript wird dieses Problem durch die Kompilierungsphase verschärft. Wir betrachten drei Hauptmethoden zur Bekämpfung.
\n\n1.1. Reduzierung der Deployment-Paketgröße
\nVerwenden Sie esbuild zum Bauen anstelle des standardmäßigen tsc. Es führt Tree-Shaking und Minifizierung durch, was die Bündelgröße um das 5- bis 10-fache reduziert. Beispielkonfiguration für serverless.yml:
plugins:\n - serverless-esbuild\ncustom:\n esbuild:\n bundle: true\n minify: true\n sourcemap: false\n target: 'node18'\n exclude: ['aws-sdk'] # SDK ist bereits in der Lambda-Umgebung vorhanden\n\n1.2. Verwendung von Provisioned Concurrency
\nKonfigurieren Sie für latenzkritische Funktionen (z. B. solche, die API-Anfragen verarbeiten) Provisioned Concurrency. Dies hält eine bestimmte Anzahl "warmer" Container ständig am Laufen:
\n\nfunctions:\n apiHandler:\n handler: src/handler.apiHandler\n provisionedConcurrency: 5 # Immer 5 bereite Instanzen\n\n1.3. Optimierung von Importen und Code
\nVermeiden Sie "schwere" Bibliotheken innerhalb der Funktion. Importieren Sie beispielsweise anstelle des gesamten aws-sdk v3 nur die benötigten Clients:
// Schlecht: import * as AWS from 'aws-sdk';\n// Gut:\nimport { DynamoDBClient } from '@aws-sdk/client-dynamodb';\nimport { DynamoDBDocumentClient } from '@aws-sdk/lib-dynamodb';\n\n2. Arbeit mit Lambda Layers und Abhängigkeiten
\n\nLambda Layers ermöglichen es, gemeinsamen Code und Abhängigkeiten (z. B. ORM, Validatoren) außerhalb der Funktion auszulagern. Dies beschleunigt das Deployment und reduziert die Größe jedes einzelnen Pakets.
\n\n2.1. Erstellen einer Ebene mit gemeinsamen Hilfsprogrammen
\nDie Projektstruktur könnte wie folgt aussehen:
\n\nproject/\n├── layers/\n│ └── common/\n│ └── nodejs/\n│ ├── package.json\n│ └── node_modules/\n├── functions/\n│ ├── createUser.ts\n│ └── getUser.ts\n└── serverless.yml\n\nIn serverless.yml binden wir die Ebene ein:
layers:\n commonLibs:\n path: layers/common\n compatibleRuntimes:\n - nodejs18.x\nfunctions:\n createUser:\n handler: functions/createUser.handler\n layers:\n - { Ref: CommonLibsLambdaLayer }\n\n2.2. Typisierung für Ebenen
\nDamit TypeScript die Typen aus der Ebene "sieht", erstellen Sie eine tsconfig.json mit Pfaden:
{\n "compilerOptions": {\n "paths": {\n "@common/*": ["layers/common/nodejs/*"]\n }\n }\n}\n\nJetzt können Sie in der Funktion schreiben:
\nimport { validateEmail } from '@common/validators';\n\n3. Arbeit mit VPC und Sicherheit
\n\nLambda-Funktionen, die innerhalb einer VPC arbeiten, verlieren den Zugriff auf das öffentliche Internet (sofern kein NAT Gateway konfiguriert ist). Dies ist kritisch für die Verbindung zu RDS, ElastiCache oder privaten APIs.
\n\n3.1. Konfiguration von Lambda in einer VPC
\nKonfiguration über serverless.yml:
provider:\n vpc:\n securityGroupIds:\n - sg-12345\n subnetIds:\n - subnet-abc\n - subnet-def\n\nfunctions:\n dbHandler:\n handler: src/db.handler\n vpc: true # erbt die Einstellungen des Providers\n\n3.2. Muster "Thin Handler" für Verbindungen
\nLes