Wenn Sie Lambda-Funktionen mit CDK und einem testgesteuerten Ansatz bereitstellen, haben Sie vielleicht bemerkt, dass das Test-Feedback jedes Mal länger dauert, wenn Sie eine neue Funktion hinzufügen. Das liegt daran, dass jede Funktion mit einem eigenen Satz von Abhängigkeiten gebündelt wird. Diese Abhängigkeiten müssen heruntergeladen werden, bevor CDK sie in einem einzigen Paket bündeln kann.
CDK Synth
Bevor Sie Ihre Infrastruktur bereitstellen können, müssen Sie Ihren Code synthetisieren. Dabei wird Ihr Code in eine CloudFormation-Vorlage plus einige Assets umgewandelt. Wenn Sie eine Lambda-Funktion haben, wird der Inhalt dieser Funktion in einem dieser Assets gebündelt.
Das alles macht Sinn, wenn Sie Ihren Code bereitstellen. Sie müssen den eigentlichen Lambda-Code im richtigen Format und mit den richtigen Abhängigkeiten an AWS senden. Andernfalls wird Ihre Lösung nicht funktionieren.
Aber der Synth-Schritt wird auch verwendet, wenn Sie Ihren Infrastrukturcode testen. Der Prozess ist ähnlich wie der Schritt Deployment. Anstatt Ihre Vorlagen bereitzustellen, überprüfen Sie das Ergebnis. Sie erwarten zum Beispiel eine Lambda-Funktion. Diese Funktion wird eine bestimmte Laufzeit verwenden. Und für Produktionsumgebungen möchten Sie bestätigen, dass die Backup-Tags angewendet werden.
Überspringen Sie die Bündelung, wenn Sie die Tests durchführen!
Die Antwort könnte offensichtlich sein. Überspringen Sie die Bündelung, wenn Sie die Tests durchführen! Nehmen wir an, wir verwenden den folgenden Code, um eine Lambda-Funktion zu erstellen:
const sampleFunction = new lambda.Function(this, 'SampleFunction', {
code: lambda.Code.fromAsset('./sample_function/', {
bundling: {
command: ['bash', '-c', 'pip install --target /asset-output -r ./requirements.txt && cp -au . /asset-output'],
image: lambda.Runtime.PYTHON_3_12.bundlingImage,
},
}),
runtime: lambda.Runtime.PYTHON_3_12,
handler: 'index.handler',
timeout: cdk.Duration.seconds(60),
memorySize: 1024,
});
Sie sehen, dass wir den Code aus einem Ordner namens sample_function laden. Dann übergeben wir die Optionen, wie CDK die Funktion bündeln soll:
- Zunächst werden die Abhängigkeiten heruntergeladen und installiert.
- Als nächstes wird der Inhalt von
sample_functionkopiert. - Der Inhalt des Ordners
asset_outputwird die gebündelte Funktion sein.
Jetzt werden diese Schritte Teil des Tests. Sie können die Bündelung überspringen, indem Sie den Test wie folgt definieren:
import * as cdk from 'aws-cdk-lib';
import { Template } from 'aws-cdk-lib/assertions';
import { AppStack } from './AppStack';
test('Sample unit test on how to skip bundling', () => {
// Setup the application
const app = new cdk.App({
context: {
'aws:cdk:bundling-stacks': [],
},
});
// Setup the CDK stack
const stack = new AppStack(app, 'MyTestStack', {
backups: true, // For production we enable backups
});
// Synth the code
const template = Template.fromStack(stack);
// Confirm that the Lambda function uses python 3.12 runtime
template.hasResourceProperties('AWS::Lambda::Function', {
Runtime: 'python3.12',
});
// Confirm that the DynamoDB table has the Backup tag
template.hasResourceProperties('AWS::DynamoDB::Table', {
Tags: [
{
Key: 'Backup',
Value: 'YES',
},
],
});
});
In diesem Beispiel geschehen einige Dinge:
- Bei der Erstellung des App-Objekts wird ein bestimmter Kontext angegeben. Dieser Kontext überschreibt die Option
. Das bedeutet, dass die Bündelungsoptionen mit nichts überschrieben werden. - Dann wird das Stack-Objekt erstellt und eine Vorlage synthetisiert.
- Wir werden bestätigen, dass wir eine Lambda-Funktion mit der Python 3.12-Laufzeitumgebung haben.
- Wir werden auch bestätigen, dass die DynamoDB-Tabelle das Tag Backup mit dem Wert YES hat.
Da wir die Bündelung übersprungen haben, wird der Test sofort ausgeführt. So erhalten Sie sofortige Rückmeldung über den Code, den Sie geschrieben haben. Sie können den Test jetzt nach jeder Änderung ausführen. So können Sie einen schönen Entwicklungszyklus erstellen:
- Hinzufügen einer Testimplementierung.
- Hinzufügen der Geschäftslogik.
- Durchführung der Tests zur Bestätigung der Implementierung.
- Wiederholen Sie
Warum ist es in Ordnung, die Bündelung zu überspringen?
Wenn Sie Tests schreiben, sollten Sie Ihre Geschäftslogik bestätigen. Die Bündelungslogik wurde bereits von dem Team, das CDK pflegt, getestet. Sie brauchen sie also nicht zu testen und können die Bündelung getrost auslassen.
Sie könnten argumentieren, dass auch die Optionen in der Bündelung validiert werden müssen. Und ja, das wird jetzt übersprungen. Doch die Bündelung dieser Funktionen ist in der Regel für jede Laufzeit immer gleich. Und beim Deployment fallen Ihnen Fehler bei der Bündelung sowieso auf. Darüber hinaus haben Sie auch Tests für Ihren Lambda-Code. Diese Tests werden nicht gegen die gebündelte Version Ihres Codes ausgeführt. Sie werden gegen die Quellversion Ihres Codes ausgeführt. Aus Sicht der Tests besteht also keine Notwendigkeit, sie zu bündeln.
Fazit
Wenn es zu lange dauert, Tests auszuführen, werden Sie sie seltener durchführen. Das wirkt sich negativ auf Ihre Qualität und Effizienz aus. Sie können dieses Problem lösen, indem Sie schwere Operationen ausschließen. Operationen wie das Herunterladen von Abhängigkeiten und das Bündeln Ihrer Lambda-Funktionen. Dies hilft auch dabei, sich auf die Tests zu konzentrieren, die wichtig sind. Die Tests, die Ihren Geschäftswert tatsächlich bestätigen.
Folgen Sie mir, wenn Sie mehr über die Verbesserung Ihrer Effizienz und Codequalität erfahren möchten.
Foto von Pixabay
Verfasst von

Joris Conijn
Joris is the AWS Practise CTO of the Xebia Cloud service line and has been working with the AWS cloud since 2009 and focussing on building event-driven architectures. While working with the cloud from (almost) the start, he has seen most of the services being launched. Joris strongly believes in automation and infrastructure as code and is open to learning new things and experimenting with them because that is the way to learn and grow.
Unsere Ideen
Weitere Blogs
Contact




