Blog

Reparieren übergroßer Artefakte AWS CDK Pipelines

Joris Conijn

Aktualisiert Oktober 14, 2025
4 Minuten

Ich habe eine Arbeitslast mit AWS CDK erstellt, und die CodePipeline hat im ungünstigsten Moment aufgehört zu funktionieren. Es war genau am Ende des Sprints; wir hatten zuvor mehrere Bereitstellungen durchgeführt. Aber in diesem Moment, dem Moment, den Sie vielleicht wiedererkennen. Wenn dieser letzte PR veröffentlicht wird, haben wir unsere Frist eingehalten! Kabumm, die Pipeline funktioniert nicht mehr, und der Grund für den Ausfall hat nichts mit den Änderungen zu tun, die Sie vorgenommen haben.

CodePipeline-Fehler Maximale Artefaktgröße

Einige Hintergründe

Wenn Sie CDK verwenden, können Sie die Infrastruktur als Code in Ihrer bevorzugten Programmiersprache schreiben. CDK enthält bestimmte Konstrukte, die Ihnen das Leben leichter machen. Sie können zum Beispiel ganz einfach eine CodePipeline erstellen, die den Code aus Ihrem Repository abruft. Sie synthetisiert dann den CDK-Code in CloudFormation. Die CodePipeline lädt dann alle Assets in einen S3-Bucket hoch, und die CloudFormation-Vorlagen werden auf den Zielkonten bereitgestellt. Diese CloudFormation-Vorlage enthält Verweise auf die Assets in S3. Wenn die Vorlage bereitgestellt wird, werden die Assets aus dem S3-Bucket abgerufen.

Was ist geschehen?

Ich bin auf das Problem gestoßen, dass CodePipeline ein Artefakt von Schritt zu Schritt weitergibt. Bei diesem Artefakt handelt es sich um eine einzelne gezippte Datei, die sich leicht in der Pipeline weitergeben lässt.

Wenn CodePipeline die CloudFormation-Vorlagen bereitstellen möchte. Es lädt die gezippte Datei hoch und weiß, wo in der gezippten Datei die Vorlage zu finden ist. Allerdings befinden sich auch alle anderen Assets in der Zip-Datei. Das könnte der Code sein, den Sie in Lambda-Funktionen oder sogar Lambda-Layern ausführen möchten. Sie können sich vorstellen, dass, wenn Ihre Arbeitslast reifer wird, mehr Assets in dieser Zip-Datei zu finden sein werden.

Warum ist das ein Problem?

Nun, das Artefakt hat die maximale Größe überschritten! Bei CDK-Projekten werden Sie früher oder später auf dieses Problem stoßen. Normalerweise fügen Sie nur Dinge zu Ihren Projekten hinzu und entfernen nur selten etwas. Und wie Sie bereits gelernt haben, passiert dies immer zu einem Zeitpunkt, den Sie überhaupt nicht erwarten. Und in meinem Fall zum denkbar ungünstigsten Zeitpunkt, nämlich kurz vor meinem Abgabetermin.

Wie können wir das beheben?

Die Antwort ist ganz einfach. Wie ich bereits erklärt habe, liegt das Problem in der Größe des Artefakts, das an die CloudFormation-Bereitstellungsaktion übergeben wird. Wir müssen nur die Größe reduzieren, nachdem alle Assets des Artefakts in S3 hochgeladen wurden.

private stripAssets(pipeline: pipelines.CodePipeline) {
 const policies = [
   new iam.PolicyStatement({
     effect: iam.Effect.ALLOW,
     resources: [arn:aws:s3:::${this.artifactBucket.bucketName}/*],
     actions: ['s3:PutObject'],
   }),
 ];

 if (this.artifactBucket.encryptionKey) {
   policies.push(
     new iam.PolicyStatement({
       effect: iam.Effect.ALLOW,
       resources: [this.artifactBucket.encryptionKey.keyArn],
       actions: ['kms:GenerateDataKey'],
     }),
   );
 }
 pipeline.addWave('BeforeStageDeploy', {
   pre: [
     new pipelines.CodeBuildStep('StripAssetsFromAssembly', {
       input: pipeline.cloudAssemblyFileSet,
       commands: [
         'S3_PATH=${CODEBUILD_SOURCE_VERSION#"arn:aws:s3:::"}',
         'ZIP_ARCHIVE=$(basename $S3_PATH)',
         'echo $S3_PATH',
         'echo $ZIP_ARCHIVE',
         'ls',
         'rm -rfv asset.*',
         'zip -r -q -A $ZIP_ARCHIVE *',
         'ls',
         'aws s3 cp $ZIP_ARCHIVE s3://$S3_PATH',
       ],
       rolePolicyStatements: policies,
     }),
   ],
 });
}

Was passiert in dem Codebeispiel?

  • Wir stellen sicher, dass wir die Rechte s3:PutObject für den Artefakt-Bucket haben. (Wir müssen das vorhandene Artefakt überschreiben.)
  • Wir benötigen die Rechte kms:GenerateDataKey. (Optional, ich verwende KMS-Verschlüsselung für den Bucket.)
  • Wir fügen eine CodeBuildStep hinzu, die das Artefakt verbraucht.
  • Das Artefakt wird von CodeBuild heruntergeladen und entpackt.
  • Wir finden den Ursprung des Artefakts heraus.
  • Wir entfernen alle Vermögenswerte.
  • Wir werden das Artefakt zippen.
  • Wir werden das Artefakt über das Original hochladen.

Da wir die CodeBuildStep in der Pre-Sektion platziert haben, wird sie direkt vor der Bereitstellung der CloudFormation Deploy-Aktion platziert.

Fazit

Wenn Sie das Artefaktlimit von CodePipeline erreichen, kann Ihr Sprint im schlimmsten Moment ins Stocken geraten. Indem Sie einen CodeBuildStep vor der Bereitstellung einfügen, der die sperrigen Assets entfernt, nachdem sie sicher in S3 hochgeladen wurden, verkleinern Sie das Artefakt, ohne Ihren Arbeitsablauf zu ändern. Mit dieser schnellen Lösung bleibt Ihre CDK-Pipeline im Fluss, Ihre CloudFormation-Stacks werden bereitgestellt und Ihre Veröffentlichungsfristen bleiben gewahrt.

Foto von Ellie Burgin

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.

Contact

Let’s discuss how we can support your journey.