420 EC2 Autoscaling und Loadbalancing mit Terraform provisionieren [3 PT]

Updated . Posted . Visible to the public.

Ziele

  • Erfülle die Aufgaben
  • Zeige deinem Mentor in einer Live-Demo was du umgesetzt hast.
  • Wenn du Aufgabe 4 betrachtest: Gibt es andere Wege die Daten aus dem S3 Bucket auf die Instanzen zu bekommen? Welche Nachteile hat die vorgestellte Methode? Was passiert z.B. wenn die Daten im S3 Bucket aktualisiert werden?
  • Was wäre ein besserer Weg Nginx auf den Instanzen verfügbar zu haben als diesen jedes mal beim starten zu installieren?

Aufgaben

Für diese Aufgaben baust du auf deinem Modul aus 415 auf.
Erstelle auch wieder für die einzelnen Aufgaben jeweils einen Merge Request.

Note

Die Beispiele hier dienen nicht unbedingt einem praxisrelevantem Setup, sondern sind dazu da, damit du einige Features verwenden kannst und einige der Probleme siehst, die beim Erstellen von Setups mit ASG auftreten können.

  1. Ersetze deine "statisch" erstellten EC2 Instanzen durch eine Autoscaling Group. Auch hier soll die Amazon Linux 2 AMI verwendet werden und die zuvor erstellte Role assigned werden. Die Autoscaling Group soll spot instances verwenden. Die ec2_instances variable wird obsolet und durch asg_min, asg_max, asg_desired und asg_instance_types (list) parameter ersetzt. Die asg_instance_types list soll daraufhin geprüft werden, dass nur valide t3 und t3a Instanztypen erlaubt werden.

  2. Erstelle dir ein public Github Repository mit Ansible Code. Das Repository soll ein Playbook enthalten, dass Nginx installiert. Das Playbook soll via cloudinit Show archive.org snapshot angewendet werden.

  3. Füge einen ALB zu deinem Modul hinzu. Erstelle eine Targetgroup, die den Traffic auf Port 80 zu deinen EC2 Instanzen forwarded. Die Targetgroup soll an deinem ALB verwendet werden. Konfiguriere die Security Groups so, dass der Traffic funktioniert. Du solltest nun deinen Nginx über den ALB erreichen können.

  4. Erweitere dein Ansible Playbook so, dass beim ausführen Dateien aus deinem S3 Bucket in das Webroot von deinem Nginx default vhost kopiert werden. Der Name des S3 Buckets darf natürlich nicht direkt im Ansible Code vermerkt sein, sondern muss beim Aufruf übergeben werden. Wenn es in dem S3 Bucket noch keine index.html gibt, soll Ansible diese erstellen.

  5. Füge eine RDS Instanz mit PostgreSQL hinzu. Konfiguriere die Security Groups so, dass von deinen EC2 Instanzen in der ASG darauf zugegriffen werden kann. Teste die Verbindung manuell.

  6. Entferne die asg_instance_types und ersetze sie durch eine variable, die ein object zur Beschreibung von Instanzen enthält, die anschließend automatisch ausgewählt werden sollen. Das Objekt soll folgende Felder enthalten:

    • vcpu_count: Objekt mit einem min und max key für die Anzahl der CPUs der Instanz.
    • memory_mib: Objekt mit min und max key für den Speicher der VM in Megabyte.
    • excluded_instance_types: List aus allen Instanzen, die bei der Auswahl nicht verwendet werden sollen.

    Verwende das Instance Requirements Show archive.org snapshot Feature vom Lauch Template um die Instanzen auszuwählen. Es müssen weiterhin Spot Instances in der ASG verwendet werden.
    Tipp: Wenn du Probleme hast das umzusetzen, versuche dir das ganze mal in der AWS Console (UI) anzusehen. Das gibt dir vielleicht einen wertvollen Hinweis.

Claus-Theodor Riegg
Last edit
Claus-Theodor Riegg
License
Source code in this card is licensed under the MIT License.
Posted by Claus-Theodor Riegg to DevOps Curriculum (2022-12-02 11:32)