Blog

Implementierung von AWS CDK CI/CD mit CDK Pipelines

Laurens Knoll

Aktualisiert Oktober 21, 2025
3 Minuten

Mit dem AWS Cloud Development Kit (AWS CDK) können Sie ganz einfach eine Cloud-Infrastruktur aufbauen. Und CDK Pipelines machen die Bereitstellung der Cloud-Infrastruktur "mühelos". Lassen Sie uns also eine AWS CDK CI/CD-Pipeline erstellen und unsere Anwendung auf AWS erstellen und ausführen.

AWS CDK CI/CD Pipeline

AWS CDK CI/CD Pipeline Eine AWS CDK CI/CD-Pipeline lädt im Wesentlichen die Anwendungsquellen herunter, erstellt die CloudFormation-Vorlagen, aktualisiert sich selbst und stellt die Anwendung bereit. Beachten Sie, dass die Selbstaktualisierung das einfache Hinzufügen/Entfernen von Pipeline-Stages ermöglicht. Die gesamte Pipeline wird erstaunlicherweise durch zwei Konstrukte implementiert: CdkPipeline und Stage. CdkPipeline definiert die CodePipeline und die zugehörigen Phasen und Aktionen. Stage definiert den Stack-Satz der Anwendung.

CDK Pipelines ECS-Bereitstellung

Testen wir CDK Pipelines, indem wir auf AWS ECS bereitstellen. Da ECS von CDK und CloudFormation gut unterstützt wird, erwarte ich eine ziemlich problemlose Implementierung.

Der Quellcode der Anwendung, die Dockerdatei und die Cloud-Infrastruktur werden auf GitHub bereitgestellt.

ECS CDK CI/CD Pipeline Die ECS CI/CD-Pipeline enthält eine app build Stufe zur Erstellung von Container-Images. Da die Images nach den CloudFormation-Templates erstellt werden, müssen wir herausfinden, wie wir sie spezifizieren können. Da die CdkPipeline.addApplicationStagekeine parameterOverrides unterstützt, habe ich eine Tagging-Konvention eingeführt. Alle Bilder sind mit der GitHub Commit-ID gekennzeichnet. Und da der Anwendungs- und der Infrastrukturcode gemeinsam versioniert sind, erstellen wir gültige CloudFormation-Vorlagen.

Anmerkung Es ist möglich, parameterOverrides zu verwenden, indem Sie die CodePipeline-Stufen selbst erstellen. Da dies dem Zweck von CdkPipeline zuwiderläuft, empfehle ich dies nicht.Die Erstellung der Pipeline ist ziemlich einfach. Die gesamte CI/CD-Infrastruktur wird durch den folgenden Code definiert.

import * as cdk from '@aws-cdk/core';
import * as codepipeline from '@aws-cdk/aws-codepipeline';
import * as codepipeline_actions from '@aws-cdk/aws-codepipeline-actions';
import * as codebuild from '@aws-cdk/aws-codebuild';
import * as ecr from '@aws-cdk/aws-ecr'
import * as iam from '@aws-cdk/aws-iam';
import * as pipelines from '@aws-cdk/pipelines';
import { LocalDeploymentStage } from './local-deployment';

export class CicdInfraStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const sourceArtifact = new codepipeline.Artifact();
    const cdkOutputArtifact = new codepipeline.Artifact();

    // The core CdkPipeline is created and consists of DownloadSources, cdk synth and cdk deploy <this stack>
    const pipeline = new pipelines.CdkPipeline(this, 'CdkPipeline', {
      pipelineName: 'cdk-cdkpipeline',
      cloudAssemblyArtifact: cdkOutputArtifact,
      sourceAction: new codepipeline_actions.GitHubSourceAction({
        actionName: 'DownloadSources',
        owner: 'binxio',
        repo: 'blog-cdk-cicd-cdkpipeline',
        oauthToken: cdk.SecretValue.secretsManager('/github.com/binxio', {
          jsonField: 'token'
        }),
        output: sourceArtifact,
      }),
      synthAction: pipelines.SimpleSynthAction.standardNpmSynth({
        sourceArtifact: sourceArtifact,
        cloudAssemblyArtifact: cdkOutputArtifact,
        subdirectory: 'cdk',
      }),
    });

    const repository = new ecr.Repository(this, 'Repository', {
      repositoryName: 'cdk-cicd/app',
    });
    const buildRole = new iam.Role(this, 'DockerBuildRole', {
      assumedBy: new iam.ServicePrincipal('codebuild.amazonaws.com'),
    });
    repository.grantPullPush(buildRole);

    // The docker build stage is added
    const buildStage = pipeline.addStage('AppBuild')
    buildStage.addActions(new codepipeline_actions.CodeBuildAction({
      actionName: 'DockerBuild',
      input: sourceArtifact,
      project: new codebuild.Project(this, 'DockerBuild', {
        role: buildRole,
        environment: {
          buildImage: codebuild.LinuxBuildImage.STANDARD_4_0,
          privileged: true,
        },
        buildSpec: this.getDockerBuildSpec(repository.repositoryUri),
      }),
    }));

    // The deployment of Stage 'Local' is added
    const localStage = new LocalDeploymentStage(this, 'AppDeployLocal');
    pipeline.addApplicationStage(localStage);
  }

  getDockerBuildSpec(repositoryUri: string): codebuild.BuildSpec {
    return ...
  }
}

Und nach der Bereitstellung des CI/CD Pipeline-Stacks wird die Pipeline ausgeführt. Schmerzfrei. ECS CodePipeline Ausführung Diskussion


AWS CDK wird immer besser. Das Kompositionsmodell für Konstrukte ist leistungsstark und schafft beeindruckende Produkte wie CDK Pipelines. CDK Pipelines fehlt es jedoch noch an einigen Skalierungsoptionen. Derzeit erstellt zum Beispiel jede Pipeline ihren eigenen Artefakte-Bucket.In diesem Experiment habe ich den bekannten Pfad getestet. Es sind weitere Experimente erforderlich, um die Qualität von CDK Pipelines mit bestehenden Infra-Implementierungen, komplexen Stage-Implementierungen (Stack-Sets) und kontoübergreifenden Implementierungen zu ermitteln.

Fazit

Die Implementierung einer AWS CDK CI/CD-Pipeline ist mit CDK Pipelines nahezu mühelos. Starten Sie also mit AWS CDK, um Ihre Anwendung auf AWS zu erstellen und auszuführen.

Verfasst von

Laurens Knoll

As a cloud consultant I enjoy improving what your company does best. I enable your business using cloud technology and enable your engineers by applying software engineering practices to your infrastructure domain.

Contact

Let’s discuss how we can support your journey.