Infrastruktur-Änderungen sichtbar machen mit CDK Pipelines

December 22, 2020

Das AWS Cloud Development Kit (kurz CDK) ist ein großartiges Werkzeug, um Infrastruktur mit Code zu beschreiben. Hier und hier haben wir uns schon eingehender mit dem CDK und seinen Vorzügen beschäftigt. Besonders das Construct CDK Pipelines ist eine enorme Erleichterung, da es das Erstellen von CI / CD Pipelines auch über AWS Account Grenzen hinweg ermöglicht.

Das Problem

Leider ist CDK Pipelines noch in einem sehr frühen Entwicklungsstadium und es fehlen noch einige essenzielle Funktionen. Es ist zum Beispiel nicht einfach möglich, den Befehl cdk diff zu verwenden, um sich die Auswirkungen einer Codeänderung auf einen via CDK Pipelines erstellten Stack anzeigen zu lassen. Gerade dies ist aber in der Infrastrukturentwicklung eine häufig benötigte Aktion. Nur so kann man sichergehen, dass die letzte Codeänderung nicht den gerade erstellten EKS Cluster wieder löscht.

Die Lösung

Um sich die Änderungen via cdk diff für einen bestimmten Stack anzeigen zu lassen, sind die folgen Schritte notwendig:

  1. Synthetisieren der CDK App mit den aktuellen Codeänderungen via cdk synth
  2. Im lokalen Ausgabeverzeichnis “cdk.out” nach dem Verzeichnis der Stage suchen, in der sich der Stack befindet, für den die Änderungen angezeigt werden sollen (“assembly-PIPELINE_STACK_NAME-STAGE_NAME”)
  3. In dem in Schritt 2 identifizierten Verzeichnis den gewünschten Stack finden
  4. Dann cdk diff mit den eben ermittelten Werten aufrufen: cdk diff -a cdk.out/assembly-PIPELINE_STACK_NAME-STAGE_NAME STACK_NAME

Hierbei ist zu beachten, dass der Befehl mit den jeweiligen Rechten des AWS Account ausgeführt werden muss, in dem sich der Stack befindet. Dies geht zum Beispiel sehr gut mit verschieden aws cli Profilen: cdk diff ... --profile devAccount

Ein wenig mehr Komfort

Um diese Schritte nicht immer wieder mühselig von Hand auszuführen, benutzen wir eine Shell-Funktion in Verbindung mit dem großartigen commandline fuzzy finder fzf:

function cdk-diff() {
  if ! [ -d "cdk.out" ]; then
    echo "no 'cdk.out' dir fount. Go to your apps root dir and run 'cdk synth'."
    return
  fi
  stage=$(ls cdk.out | grep 'assembly-' | fzf)
  stack=$(ls cdk.out/$stage/*.template.json | sed -E "s|cdk\.out\/${stage}\/(.+)\.template\.json|\1|" | fzf)
  npx cdk diff -a cdk.out/${stage} $stack $@
}

So können wir einfach in unserem CDK Projektverzeichnis den Befehl cdk-diff ausführen und erst die richtige Stage und dann den richtigen Stack auswählen.

cdk-diff in action