Infrastructure as Code definieren und bereitstellen IaC mit dem AWS Cloud Development Kit

Von Luis Morales * |

Anbieter zum Thema

In Cloud-Architekturen interagieren viele Komponenten miteinander: Anwendungen wollen bereitgestellt und automatisch skaliert, Datenbanken und Integrationsdienste wie Load Balancer verwaltet werden. Das AWS Cloud Development Kit hilft dabei, das komplexe Szenario zu bewältigen.

Mit dem Cloud Development Kit können Entwickler benötigte Cloud-Resourcen mit ihnen bekannten Programmiersprachen definieren.
Mit dem Cloud Development Kit können Entwickler benötigte Cloud-Resourcen mit ihnen bekannten Programmiersprachen definieren.
(Bild: geralt / Pixabay)

Über die Zeit haben sich verschiedene Ansätze herausgebildet, um die Infrastrukturverwaltung automatisierbar zu machen. Diese Vorgänge sollten dann vor allem auch wiederholbar sein, damit nicht jedes Team die Komponenten manuell neu aufsetzen muss.

Von initialen Bash-Skripten über Playbooks (um einzelne virtuelle Maschinen zu provisionieren) haben sich IaC-, sprich „Infrastructure as Code“-Technologien entwickelt. Im Falle der AWS Cloud lässt sich dabei mit Hilfe von YAML oder JSON die entsprechende Infrastruktur beschreiben und dann mit dem AWS CloudFormation Service ausrollen.

CloudFormation kümmert sich dann um die konsistente Bereitstellung der Infrastruktur. Hier ein YAML-Template zur Bereitstellung eines Amazon Simple Storage Service Buckets:

AWSTemplateFormatVersion: '2010-09-09'Parameters:
   S3BucketNameParameter:
      Type: String
      Default: my-default-bucket-name
      Description: Name for your AWS S3 bucket
      MinLength: 5
      MaxLength: 30
Resources:
   S3Bucket:
      Type: AWS::S3::Bucket
      Properties:
         BucketName:
            Ref: S3BucketNameParameter
      DeletionPolicy: Retain
Outputs:
   Bucketname:
      Description: Name of AWS S3 Bucket

Cloud-Architekturen verwalten mit dem Cloud Development Kit

Basierend auf CloudFormation hat sich jedoch eine weitere Möglichkeit etabliert, um Infrastruktur zu modellieren: das Cloud Development Kit (CDK). Das CDK erlaubt es, die Cloud-Ressourcen mit Hilfe von gängigen Programmiersprachen zu definieren.

Neben TypeScript und Python werden auch Java und .NET unterstützt. Dadurch bietet das CDK die Freiheit alle gängigen Sprachspezifischen Bordmittel zu verwenden, um beispielsweise wiederkehrende Konstrukte in der Form von NPM-Modulen oder Maven-Artefakten zu definieren und in anderen Projekten zu importieren.

Entwickler können ihre Erfahrung mit diesen Sprachen also auch für die Verwaltung von Cloud-Ressourcen zu nutzen. Das CDK erfreut sich dabei einer wachsenden aktiven Community, dedizierter Entwickler-Teams und einer Vielzahl an Lösungen und wiederverwendbaren Modulen die auf CDK basieren. Das CDK ist dabei Open Source und die entsprechende CDK-Roadmap ist öffentlich verfügbar.

Ablaufdiagramm für das Cloud Devleopment Kit.
Ablaufdiagramm für das Cloud Devleopment Kit.
(Bild: Amazon Web Services)

Im CDK wird die benötigte Infrastruktur in einer der unterstützten Programmiersprachen definiert. Diese besteht aus einzelnen Konstrukten. Für das Deployment werden die Konstrukte validiert und danach in CloudFormation Templates synthetisiert. Dieses Template wird dann mittels CloudFormation deployed.

Code-Beispiel für AWS CDK

Als Beispiel soll hier eine Serverless Anwendung dienen. Mit dem Serverless-Ausführungsmodell werden sämtliche Infrastruktur-Verwaltungsaufgaben – wie beispielsweise die Bereitstellung, der Betrieb, aber auch die Skalierung der Anwendung – an den Cloud-Anbieter ausgelagert. Der Kunde bezahlt dabei die Ressourcen nur solange, wie sie zur Ausführung seines Codes benötigt werden.

Übersicht der genutzten AWS Ressourcen.
Übersicht der genutzten AWS Ressourcen.
(Bild: Amazon Web Services)

Konkret soll uns eine Serverless Lambda Funktion dienen, die für wiederkehrende Verwaltungsaufgaben eingesetzt werden kann, beispielsweise das Erstellen von Backups, Statusprüfungen oder das Löschen von nicht mehr benötigten Ressourcen. Diese Funktion wird basierend auf einem Cron-Job alle 5 Minuten aufgerufen.

Im CDK Code wird dafür zuerst der Stack definiert. Der Stack bildet dabei die Einheit aller Ressourcen die gemeinsam bereitgestellt werden sollen. Innerhalb des Konstruktors des Stacks wird eine Lambda-Funktion, in der unsere Anwendung läuft, konfiguriert.

Hierbei definieren wir das lauffähige Artefakt und die JavaScript-Funktion die beim Aufruf ausgeführt werden soll, die Laufzeitkonfiguration, sprich Node.JS 14, und die RAM-Konfiguration von 128 MB, die der Anwendung zur Verfügung steht. Zuletzt wird noch die maximale Laufzeit der Funktion von 30 Sekunden angegeben. Außerdem konfigurieren wir eine Regel, die zeitbasiert (alle 5 Minuten) aufgerufen wird und wiederum die Lambda-Funktion aufruft.

Nach der Klassendefinition konfigurieren wir noch den entsprechenden Stack. Dabei wird die gewünschte AWS Region Frankfurt (eu-central-1) hartkodiert, in der dieser Stack ausgeführt werden soll. Im Folgenden der CDK Code zur Bereitstellung einer Lambda-Funktion, die basierend auf einem Cron-Job getriggert wird.

import { App, Duration, Stack, StackProps } from '@aws-cdk/core';
import * as lambda from '@aws-cdk/aws-lambda';
import * as events from '@aws-cdk/aws-events';
import * as targets from '@aws-cdk/aws-events-targets'
import fs = require('fs');export class LambdaCronStack extends Stack {
   constructor(app: App, id: string, props?: StackProps) {
      super(app, id, props);
      // Erstellung der Lambda Funktion
      const lambdaFn = new lambda.Function(this, 'Beispiel-Funktion', {
         code: new lambda.InlineCode(
            fs.readFileSync('lambda-handler.js', { encoding: 'utf-8' })),
         handler: 'index.handler',
         runtime: lambda.Runtime.NODEJS_14_X,
         memorySize: 128,
         timeout: Duration.seconds(30)
      });
      // Erstellung des Cron Jobs
      const rule = new events.Rule(this, 'Beispiel-Cron-Job', {
         schedule: events.Schedule.rate(Duration.minutes(5))
      });
      // Verbindung des Cron Jobs mit der Lambda Funktion
      rule.addTarget(new targets.LambdaFunction(lambdaFn));
   }
}
const app = new App();
new LambdaCronStack(app, 'LambdaCronExample', {
   env: {
      region: 'eu-central-1'
}});

Mit den folgenden Kommandos lässt sich die Infrastruktur bereitstellen:

$ npm install -g aws-cdk // Installiert das AWS CDK
$ npm install            // Installiert benötigte Abhängigkeiten
$ cdk bootstrap          // Setzt CDK in Region/Account auf
$ cdk deploy             // Deployed den CDK Stack

Der folgende Befehl dient dazu, sich das entsprechend generierte Template anzeigen zu lassen.

$ cdk synth // Synthetisiert den CDK Code in ein CloudFormation template

Sobald der Stack nicht mehr benötigt wird, können alle diese Ressourcen mit einem Befehl bereinigt werden, um Kosten zu sparen:

$ cdk destroy

Diese und weitere Beispiele sind in folgendem CDK-Beispiele-Repository bei GitHub zu finden. Für eine detaillierte Dokumentation zur Verwendung einzelner Services sei hier auf die CDK-Dokumentation verwiesen.

Jetzt Newsletter abonnieren

Täglich die wichtigsten Infos zu Softwareentwicklung und DevOps

Mit Klick auf „Newsletter abonnieren“ erkläre ich mich mit der Verarbeitung und Nutzung meiner Daten gemäß Einwilligungserklärung (bitte aufklappen für Details) einverstanden und akzeptiere die Nutzungsbedingungen. Weitere Informationen finde ich in unserer Datenschutzerklärung.

Aufklappen für Details zu Ihrer Einwilligung

Fazit

Neben den erwähnten Punkten bietet der Infrastructure as Code Ansatz auch den Vorteil, dass Infrastrukturbeschreibungen mit in der existierenden Codebasis verwaltet werden können. Das gleiche gilt auch für automatisierte Unit-Tests: mit diesen lässt sich sicherstellen, dass die Infrastruktur-Definition weiterhin valide bleibt und keine essenziellen Aspekte verloren gehen.

Luis Morales
Luis Morales
(Bild: Amazon Web Services)

Wie wir in unserer Demo-Anwendung gesehen haben, ist es einfach, in das Infrastrukturmanagement mit CDK einzusteigen. Wir können AWS Cloud-Services definieren, konfigurieren und Laufzeitinformationen übergeben. Das entsprechende Beispiel kann an entsprechende Verwaltungs-Usecases mit minimalem Aufwand angepasst werden. Alternativ kann der Code mit nur wenigen Anpassungen als Konstrukt herausgelöst werden und somit für wiederkehrende Verwaltungsaufgaben eingesetzt werden.

* Luis Morales arbeitet als Solutions Architect bei AWS. Er ist spezialisiert auf die Themen Software-Engineering, testgetriebene Entwicklung, verteilte Systeme, Everything as Code und Sicherheit.

(ID:47266691)