Terraform verwendet cloud infrastructure cli's, wie z.B. aws um die Infrastruktur via Code zu erstellen.
Dabei verwendet Terraform eine eigene, Scriptsprache die JSON nachempfunden wurde.
Das Ziel des Moduls ist es, in einer für DevOps ausgelegte Infrastruktur Erfahrung zu sammeln. Terraform ist dazu zum einen eine super Technologie, welche Ihr auch im Geschäft verwenden könnt, zum anderen ermöglicht es jedoch für jeden eine Umgebung auf Amazon aufzusetzen, ohne dass die einzelne Person AWS komplett verstanden hat!
Mit Terraform versuche ich den Unterricht für alle spannend zu machen, während direkt "best-practices" von DevOps zu vermitteln.
Dieses Modul erweitert "DevOps" mit "GitOps", was soviel bedeutet, dass alle Konfiguration in Git vorliegt und somit einfach für neue Team-Mitglieder ersichtlich und anwendbar ist.
Tip
- In diesem Projekt befindet sich die ganze Konfiguration in der Datei
main.tf. - deployed wird durch das script
deploy.sh
Hierzu braucht ihr Folgendes:
-
Den Ordner
../local-templateduplizieren und inlocalumbenennen. -
Die AWS credentials nach
./local/aws/credentialskopieren. -
Den Ssh-Key vom AWS nach
./local/ssh/id_rsa.pemkopieren. -
Den VSCode DevContainer vom Projekt starten oder neu bauen.
-
In den Container einloggen via VSCode DevContainer Terminal.
-
Folgenden Befehl im Ordner
./terraformausführen.sh deploy.sh
Dies bedeutet, dass es durch bash ausgeführt werden soll
#!/bin/bashDann wird lokal der Terraform Status gelöscht. Dies kann sonst zu Inkonsistenzen führen. Der Status wird später nochmals live von AWS importiert.
echo "**cleanup state**"
rm -rf .terraform || true
rm terraform.tfstate || true
rm terraform.tfstate.backup || trueEs wird Terraform initialisiert und validiert, ob das main.tf Script korrekt ist.
echo "** Running Terraform Init**"
terraform init
echo "** Running Terraform Validate**"
terraform validateNun werden existierende Ressourcen importiert.
Caution
Wird dieser Schritt ausgelassen werden Ressourcen mehrfach erstellt! Das gibt ein Durcheinander.
echo "** Running Terraform import for existing resources**"
sh scripts/terraform_import_existing_aws_vpc.sh
sh scripts/terraform_import_existing_aws_subnet.sh
sh scripts/terraform_import_existing_aws_internet_gateways.sh
sh scripts/terraform_import_existing_aws_route_table.sh
sh scripts/terraform_import_existing_aws_security_group.sh
sh scripts/terraform_import_existing_ec2_instances.sh
sh scripts/terraform_import_existing_aws_ecr_repositories.shMit terraform plan wird geprüft, was das Script auf AWS für einen Effekt hätte.
echo "** Running Terraform plan**"
terraform planMit terraform apply führten wir das Script auf AWS aus. Ohne dies würde es nichts machen.
echo "** Running Terraform Apply**"
terraform apply -auto-approve
sleep 20 # HACK: let it warm up to be ready for later ssh connectionsNun wird die öffentliche IP der erstellten ubuntu Instanz abgerufen und in eine Environment-Variable geschrieben.
# write ServerIP as enviroment variable to be used in step "Set up Kamal"
echo "SERVER_IP=$(sh scripts/get_public_ip.sh ubuntu2404)" >>$GITHUB_ENV