Blog

Reparieren übergroßer Artefakte AWS CDK Pipelines

Aktualisiert Oktober 28, 2026
4 Minuten

Ich habe mithilfe des AWS Cloud Development Kit (AWS CDK) eine Workload erstellt, und die AWS CodePipeline hat genau im ungünstigsten Moment den Dienst eingestellt. Es war genau am Ende des Sprints; zuvor hatten wir bereits mehrere Deployments durchgeführt. Doch genau in diesem Moment – einem Moment, den Sie vielleicht kennen – als dieser letzte PR veröffentlicht wurde, hätten wir unsere Frist eingehalten! Bumm – die Pipeline funktioniert nicht mehr, und der Grund für den Fehler hat nichts mit den von Ihnen vorgenommenen Änderungen zu tun.

CodePipeline-Fehler Maximale Artefaktgröße

Einige Hintergründe

Wenn Sie AWS CDK verwenden, können Sie Infrastruktur als Code in Ihrer bevorzugten Programmiersprache schreiben. AWS CDK verfügt über bestimmte Konstrukte, die Ihnen die Arbeit erleichtern. So können Sie beispielsweise ganz einfach eine CodePipeline erstellen, die den Code aus Ihrem Repository abruft. Diese wandelt den CDK-Code anschließend in AWS CloudFormation um. Anschließend lädt die CodePipeline alle Assets in einen Amazon S3-Bucket hoch, und die CloudFormation-Vorlagen werden in den Zielkonten bereitgestellt. Diese CloudFormation-Vorlage enthält Verweise auf die Assets in S3. Bei der Bereitstellung der Vorlage 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, lädt es die ZIP-Datei hoch und weiß, an welcher Stelle in der ZIP-Datei sich die Vorlage befindet. Allerdings befinden sich auch alle anderen Assets in der ZIP-Datei; dabei kann es sich um den Code handeln, den Sie in AWS-Lambda-Funktionen oder sogar in Lambda-Layern ausführen möchten. Sie können sich vorstellen, dass diese ZIP-Datei mit zunehmender Reife Ihrer Workload immer mehr Assets enthalten wird.

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 Berechtigung „ kms:GenerateDataKey “. (Optional: Ich verwende den AWS Key Management Service zur Verschlüsselung des Buckets.)
  • 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: Ellie Burgin


Tags:

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.

‌
‌
‌
‌
‌
‌
‌
‌
‌