+++ title = "Infrastruktur als Code" chapter = false weight = 100 pre = "10. " +++ ### Themen - [Einleitung](#einleitung) - [Technische Konzepte](#technische-konzepte) - [Relevante AWS Services](#relevante-aws-services) - [Einführung in AWS CloudFormation](#einführung-in-aws-cloudformation) - [Anwendung](#anwendung) - [Bereitstellung der Vorlage](#bereitstellung-der-vorlage) - [Ausführung der Vorlage](#ausführung-der-vorlage) - [Test der ToDo-Liste](#test-der-todo-liste) - [Clean up](#clean-up) - [Zusammenfassung und nächste Schritte](#zusammenfassung-und-nächste-schritte) ### Einleitung In den letzten Kapiteln hast du kennengelernt wie man auf zwei unterschiedliche Arten die ToDo-Anwendung umsetzen kann. Durch CI/CD-Pipeline wurden einige Schritte bereits automatisiert, sodass nun Änderungen im Code einfacher vorgenommen werden können. Jedoch umfasst diese Lösung nur Teile der Ressourcen, die wir für die Anwendung genutzt haben. Manche davon haben wir noch manuell erstellt wie die Datenbank oder die VPC. Um das zu umgehen und nicht jedes Mal von neuem manuell erstellen zu müssen, kannst du eine Vorlage nutzen, die die Ressourcen in der Cloud für dich erstellt – der sogenannte Infrastructure-as-Code. ### Technische Konzepte **[Infrastructure as Code](https://containersonaws.com/introduction/infrastructure-as-code/)** ist ein Prozess, um Cloud Ressourcen zu provisionieren und zu managen. Dafür wird ein Template genutzt, welches einerseits lesbar für Menschen ist und andererseits von der Cloud genutzt werden kann, um die Ressourcen bereit zu stellen. Durch das Nutzen von Infrastructure as Code ist es übersichtlich was wie in der Cloud genutzt wird. Zusätzlich ist Vorlage wiederverwendbar und kann auch leicht mit anderen Nutzern geteilt werden. Dadurch ist die genutzte Infrastruktur leichter skalierbar, da bei Bedarf noch mehr Ressourcen durch die Vorlage provisioniert werden können. Falls die Provisionierung scheitert, gibt es einen Rollback, der dafür sorgt, dass die alte Version der Infrastruktur wieder da ist. ### Relevante AWS Services Für AWS Cloud Entwicklung gibt es einen bereits eingebauten Service für Infrastructure as Code **[AWS CloudFormation](https://aws.amazon.com/cloudformation/faqs/)**. Es nimmt die Vorlage den sogenannten Stack und provisioniert, updatet oder löscht Ressourcen, je nach dem was in der Vorlage definiert ist. Wenn eine Ressource geupdatet wird, dann wird CloudFormation diese entweder aktualisieren oder ersetzen. Um Infrastructure as Code in der AWS Cloud auch in anderen Programmiersprachen wie beispielsweise JavaScript, TypeScript, Python, Java, C#, and Go nutzen zu können, gibt es das **[AWS Cloud Development Kit](https://aws.amazon.com/cdk/faqs/)** (AWS CDK). CDK ist ein Open-Source-Framework für die Softwareentwicklung. Durch CDK kann die Infrastruktur definiert werden, sie wird dann synthetisiert in eine CloudFormation Vorlage und dann ausgeführt. Das CDK lässt sich einfach durch die Befehlszeile ausführen oder kann in einem Continuous-Delivery-System ausgeführt werden. ### Einführung in AWS CloudFormation Da Infrastructure-as-Code als Thema sehr umfangreich ist, beschäftigen wir uns mit einer kleinen Einführung in AWS CloudFormation, um die grundlegenden Methoden zu verstehen. #### Struktur der Vorlage Eine CloudFormation Vorlage (template) beschreibt AWS Ressourcen in einem Stack. Ein Stack enthält alle erstellten Ressourcen durch die Vorlage. Die Vorlage selbst kann entweder als Textdatei im JSON oder YAML Format gespeichert werden. Weil die Vorlage nur eine Textdatei ist, kann sie einfach in jedem beliebigen Texteditor verändert werden. Die Struktur dieser Textdatei enthält Abschnitte, die verpflichtend sind und welche die optional sind. - AWSTemplateFormatVersion (optional): Version der Vorlage - Description (optional): Beschreibung der Vorlage - Metadata (optional): Weitere Informationen über die Vorlage - Parameters (optional): Input, um die Vorlage zu personalisieren - Rules (optional): Regeln, um die Parameter zu validieren - Mappings (optional): Assoziierung von Schlüsseln und Werten - Conditions (optional): Bedingungen, wann Ressourcen erstellt werden sollen - Transform (optional): Für serverlose Anwendungen - `Resources (verpflichtend): Komponenten der Infrastruktur` - Hooks (optional): Nutzung für ECS Blue/Green Deployment - Outputs (optional): Werte, die in den Eigenschaften des Stacks angezeigt werden #### Erstellung der Netzwerkressourcen Die Ressourcen sind ein verpflichtender Teil der CloudFormation Vorlage und bestehen mindestens aus zwei Teilen: Type und Properties. Der Typ (Type) gibt an, welcher Art von Ressource erstellt werden soll und die Eigenschaften (Properties) spezifizieren die Ressource näher. Im Kapitel Netzwerk hast du eine VPC und verschiedene Subnetze erstellt. Diese werden nun durch die Vorlage **trainingCF_network.yaml**, welche im Ordner **src/cloudformation** zu finden ist, definiert. **Aufgabe:** Gehe die Vorlage durch und prüfe, ob du Stück für Stück nachvollziehen kannst, wie `SubnetPublicA`, `SubnetPublicB` und das Internet-Gateway definiert sind. 1. Welche CIDR nutzen beide? Wie ist diese definiert? 2. Wird das Internet-Gateway in der Vorlage mit der VPC verbunden? 3. Welche Route wird für das Internet-Gateway angelegt? {{%expand "Hinweise" %}} 1. Halte Ausschau nach `subpublicAcidr` und `subpublicBcidr`. 2. Das Internet Gateway heisst `IGW`. 3. Schau dir `PublicDefaultRoute` näher an. {{% /expand%}} {{%expand "Lösung" %}} 1. Subnetz `SubnetPublicA` erhält ihre CIDR-Range durch den Parameter `subpublicAcidr`. Das gleiche gilt für `SubnetPublicB` mit dem Parameter `subpublicBcidr`. 2. Unter `GatewayAttach` wird das Internet Gateway mit der VPC verbunden. 3. Das Internet Gateway halt als Ziel (Destination) `0.0.0.0/0`, was unter `PublicDefaultRoute` definiert. {{% /expand%}} #### Referenzieren der Eigenschaften Die Funktion **[`Ref`](https://docs.aws.amazon.com/de_de/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html)** gibt den Wert eines Parameters oder einer Ressource zurück. Wenn du einen Parameter referenzierst, dann erhältst du als Rückgabe den Wert des Parameters. Bei einer Ressource wird ebenfalls ein Wert zurückgegeben, der oft ein Verweis auf die Ressource ist z.B. eine ID. Bei der Nutzung einer YAML Vorlage, wird `!Ref Parameter` genutzt. **Aufgabe:** Bearbeite die Datei **training_rds.yaml**, welche im Ordner **cloudformation** zu finden ist. Referenziere in der Definition für die **Datenbank** `RDSMySQL` die Eigenschaft `AllocatedStorage` und bestimme mit Hilfe eines Parameters wie viel Kapazität der Datenbank zur Verfügung stehen soll. {{%expand "Hinweis" %}} Schaue bei den `ParameterGroups`in der Vorlage nach, ob du einen passenden Parameter findest. {{% /expand%}} {{%expand "Lösung" %}} So sollte deine Referenzierung aussehen: `AllocatedStorage: !Ref dbcapacity` {{% /expand%}} #### Aufbau der Ressourcen und Erstellung **Aufgabe:** Bearbeite in der Datei **training_rds.yaml**, welche im Ordner **cloudformation** zu finden ist, eine Security Group, wie du sie schon im Kapitel Netzwerke kennengelernt hast. Sie heisst **RDSMySQLDBSecurityGroup** und deine Aufgabe ist es die passenden Eigenschaften auszufüllen. Erstelle einen Eintrag für den Verkehr bzw. Anfragen, die zu der Instanz dürfen (Tipp: Ingress). **CIDR-Range** ist `172.100.0.0/16`, das Protokoll ist `tcp`und der Port ist `3306`, um auf die Amazon RDS Datenbank zuzugreifen. {{%expand "Hinweis" %}} In der **[Dokumentation](https://docs.aws.amazon.com/de_de/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html)** ist der Aufbau einer Security Group beschrieben und welche Eigenschaften benötigt werden, um diese zu definieren. {{% /expand%}} {{%expand "Lösung" %}} So sollte deine Security Group aussehen:
RDSMySQLDBSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: RDS SG group
Tags:
- Key: Name
Value: Workshop-RDS-SG
VpcId: !ImportValue VPC
SecurityGroupEgress:
- IpProtocol: tcp
FromPort: 3306
ToPort: 3306
CidrIp: 0.0.0.0/0
SecurityGroupIngress:
- CidrIp: 172.100.0.0/16
Description: Allow DB Access from Container Instances
IpProtocol: tcp
FromPort: 3306
ToPort: 3306