Aan de slag met Terraform Windows en Terraform EC2

In de ruimte van infrastructuur als code (IaC) is een van de meest nuttige tools die de afgelopen jaren is uitgekomen, HashiCorp’s Terraform voor Windows. De mogelijkheid om infrastructuur te versiebeheren, het automatiseren van het voorzien van resources en uitvoeren over verschillende cloudproviders is enorm waardevol voor alle DevOps- en automatiseringsworkflows.

Één gebruiksscenario voor Terraform is in CI/CD. Terraform stelt je in staat om:

Mijn Laatste Video’s

  • een testomgeving te creëren
  • een applicatie implementeren
  • integratietests uitvoeren
  • de testomgeving vernietigen

Alle stappen worden ook automatisch uitgevoerd. En er is geen datacenter nodig!

Vereisten

Dit artikel is een stapsgewijze handleiding voor het opzetten van Terraform Windows. Als je wilt volgen, zorg er dan voor dat je de volgende vereisten hebt:

  • A Windows 10 device
  • Een AWS-account
  • De AWS CLI geïnstalleerd en geconfigureerd op dat apparaat. Je kunt leren hoe je het installeert hier en hoe je het configureert hier.
  • (Optioneel) Visual Studio Code met de Terraform-extensie

Installeren van de Terraform Windows-applicatie

Om gebruik te maken van de kracht van Terraform, moet je het eerst installeren op het besturingssysteem van je keuze. In dit artikel ga ik me richten op Windows. Maar weet dat Terraform ook op andere besturingssystemen kan draaien. Als je niet op Windows zit, bekijk dan de installatiedocumentatie.

The Hard Way

Als je geen gebruik kunt maken van een pakketbeheerder of als je wilt begrijpen hoe het installatieproces werkt, kun je Terraform handmatig installeren. Je kunt Terraform installeren door het binair bestand te downloaden en toe te voegen aan het systeempad omgevingsvariabele. Als dit intimiderend lijkt, verzeker ik je dat er een eenvoudigere manier is om dit te doen, die je in de volgende sectie zult leren.

  1. Download de juiste versie van Terraform vanaf de downloadpagina van HashiCorp. In mijn geval is het de Windows 64-bits versie.
  2. Maak een map op je C:\ schijf waar je het Terraform uitvoerbare bestand kunt plaatsen. Ik geef er de voorkeur aan om installatieprogramma’s in een submap te plaatsen (bijv. C:\tools) waar je binair bestanden kunt plaatsen.
  3. Als het downloaden is voltooid, zoek het dan op in Bestandsverkenner. Pak het zipbestand uit naar de map die je hebt aangemaakt in stap 2.
  4. Open je Startmenu en typ “omgeving” in, en het eerste dat verschijnt, zou de Systeemomgevingsvariabelen bewerken-optie moeten zijn. Klik daarop en je zou dit venster moeten zien.
System Properties

5. Klik op Omgevingsvariabelen… onderaan en je ziet dit:

Windows environment variables

6. Onder het onderste gedeelte waar staat Systeemvariabelen, zoek er een genaamd Path en klik op bewerken. Je ziet dan een lijst met locaties waar Windows de binairbestanden zou kunnen vinden die het om welke reden dan ook nodig heeft.

7. Klik op Nieuw en voeg het map pad toe waar terraform.exe zich bevindt onderaan de lijst. Het zou er zo uit moeten zien als je klaar bent.

Editing the system path

8. Klik op OK op elk van de menu’s die je hebt geopend totdat er geen meer over is.

9. Om ervoor te zorgen dat Windows het nieuwe pad detecteert, open je een nieuwe CMD/PowerShell-prompt en typ je refreshenv.

10. Controleer of de installatie succesvol was door terraform --version in te voeren. Als het een versie teruggeeft, ben je klaar om te gaan.

De Makkelijke Manier

Phew, dat was veel werk! Het zou vreselijk zijn om dat elke keer te moeten doen als je nieuwe software op je apparaat moest installeren. Laten we in plaats daarvan een pakketbeheerder gebruiken. Er zijn een paar pakketbeheerders die je kunt gebruiken om Terraform op Windows te installeren. Voor Windows is mijn favoriet Chocolatey. Het maakt het installeren, verwijderen en bijwerken van software net zo eenvoudig als een opdracht van één regel, en Terraform is daarop geen uitzondering.

Om Terraform te installeren met Chocolatey, volg je de volgende stappen:

  1. Open een CMD/PowerShell-prompt als beheerder en installeer Chocolatey met het commando van hun installatiepagina.
  2. Als dat is voltooid, voer dan choco install terraform uit. Als je wilt, kun je ook -y aan het einde toevoegen om automatisch akkoord te gaan met de installatie op je apparaat.

Nadat dat commando is uitgevoerd, krijg je zoiets als dit:

Chocolatey v0.10.13
2 validations performed. 1 success(es), 1 warning(s), and 0 error(s).

Installing the following packages:
terraform
By installing you accept licenses for the packages.
Progress: Downloading terraform 0.12.6... 100%

terraform v0.12.6 [Approved]
Downloading terraform 64 bit
  from 'https://releases.hashicorp.com/terraform/0.12.6/terraform_0.12.6_windows
Download of terraform_0.12.6_windows_amd64.zip (15.32 MB) completed.
--SNIP--

3. Controleer of de installatie succesvol was door terraform --version in te voeren.

De Linux-methode

I can almost hear what you’re thinking. Wait a minute Chris, didn’t you say this was going to cover installing Terraform on Windows?

Ja, en dat is het nog steeds. Maar een van de functies op Windows 10 is het Windows Subsysteem voor Linux, of WSL. Hiermee kun je Linux-commando’s uitvoeren op Windows.

  1. Installeer WSL. Ik ga hier niet diep in op hoe je WSL installeert en configureert, maar als je wilt volgen en het nog niet hebt ingesteld. Een TechSnips-snippet die ik over dit onderwerp heb gedaan, is hieronder te vinden.

2. Voer in je WSL-shell apt-get install unzip uit. Je hebt dit nodig om de Terraform-binaries later uit te pakken.

3. Download Terraform door wget https://releases.hashicorp.com/terraform/0.12.6/terraform_0.12.6_linux_amd64.zip uit te voeren. Vergeet niet de versie en architectuur te vervangen door degene die het beste bij je apparaat past. Je kunt de volledige lijst met Terraform-releases hier vinden.

4. Voer unzip terraform_0.12.6_linux_amd64.zip terraform uit om de inhoud van het zipbestand uit te pakken naar een map genaamd terraform.

5. Zodra het ZIP-bestand is uitgepakt, moet je het ergens verplaatsen dat toegankelijk is via het systeempad. Gelukkig heeft Linux standaard een map waar gebruikers binaries aan kunnen toevoegen. Verplaats de Terraform-binary daarheen door mv terraform /usr/local/bin/ uit te voeren. De /usr/local/bin-map staat al ingesteld in je systeempad.

6. Controleer of de installatie succesvol was door terraform --version uit te voeren.

Automatiseren van een AWS Terraform EC2-instantie

Nu je Terraform hebt geïnstalleerd, kun je ermee beginnen. In dit bericht ga ik demonstreren hoe je een eenvoudige AWS Terraform EC2-instantie kunt bouwen. Maar weet dat Terraform honderden verschillende soorten infrastructuur kan voorzien.

Om te beginnen heb je eerst een directory nodig om de Terraform EC2-scripts vanuit uit te voeren. Het is belangrijk om voor elk omgeving een aparte directory te hebben. Op het moment dat ik dit schrijf, heeft Terraform geen manier om te filteren wat het uitvoert. Het zal elk script in je huidige werkmap uitvoeren.

TF-script instellen

  1. In je cmd- of PowerShell-console die als beheerder wordt uitgevoerd, voer je mkdir hello-terraform uit en vervolgens cd ./hello-terraform
  2. Zodra je een directory hebt, heb je een Terraform-script nodig. Hieronder staat een voorbeeld dat je kunt gebruiken. Dit is een typisch Terraform-script dat de AWS provider gebruikt om een AWS-instantie resource te maken.

Als je het volledige script wilt, kopieer het dan hieronder. Als je wilt begrijpen wat dit script doet, lees dan verder hieronder.

# Terraform HCL

provider "aws" {
  region = "us-east-1"
  shared_credentials_file = "~/.aws/credentials"
  profile = "default"
}

resource "aws_instance" "ubuntu" {
  ami           = "ami-07d0cf3af28718ef8"
  instance_type = "t2.micro"

  tags = {
    Name = "HelloTerraform"
  }
}

# Terraform HCL

3. Sla het bovenstaande script op als main.tf in je werkmap.

TF-scripts begrijpen

#Terraform HCL

provider "aws" {
  region = "us-east-1"
  shared_credentials_file = "~/.aws/credentials"
  profile = "default"
}

Voordat je verder gaat, kijk naar het onderstaande blok en wat het verklaart.

#Terraform HCL

Dit blok vertelt Terraform EC2 welke provider moet worden gebruikt. Er zijn providers voor alle belangrijke cloudleveranciers, evenals enkele on-prem-leveranciers. Als je geavanceerder bent en weet hoe je Golang moet schrijven, kun je ook je eigen provider schrijven.

Dit blok vertelt Terraform om de AWS-provider te gebruiken en toegangssleutels in het ~/.aws/credentials-bestand onder de profielnaam default te gebruiken. Dit bestand wordt aangemaakt wanneer je de AWS CLI instelt met het aws config-commando zoals vermeld in de vereisten.

Het is ook vermeldenswaardig dat ~/ een verkorte notatie is voor de huidige gebruikersmap. Als je vanuit een Windows-achtergrond komt, komt dit overeen met $env:USERPROFILE of %USERPROFILE%. Maar Terraform ondersteunt die notatie niet op het moment van schrijven.

#Terraform HCL

resource "aws_instance" "ubuntu" {
  ami           = "ami-07d0cf3af28718ef8"
  instance_type = "t2.micro"

  tags = {
    Name = "HelloTerraform"
  }
}

De volgende blok hieronder beschrijft een Terraform EC2-instantie en hoe deze moet worden gebouwd. Als je naar de Terraform-documentatie voor aws_instance kijkt, zie je dat sommige parameters verplicht zijn en sommige optioneel zijn. In dit geval zijn de verplichte parameters de AMI ID (ami-07d0cf3af28718ef8) voor Ubuntu 18.04 LTS en t2.micro voor het instantietype.

Door een tag-blok door te geven met de sleutel Name en de waarde HelloTerraform, wordt deze tag ook toegewezen aan de gemaakte instantie. Dit is optioneel.

terraform init

# Terraform HCL

Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.

------------------------------------------------------------------------

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

   Bouw de AWS Terraform EC2-instantie: Testen
  + resource "aws_instance" "ubuntu" {
      + ami                          = "ami-07d0cf3af28718ef8"
      + arn                          = (known after apply)
      + associate_public_ip_address  = (known after apply)
      + availability_zone            = (known after apply)
      + cpu_core_count               = (known after apply)
      + cpu_threads_per_core         = (known after apply)
      + get_password_data            = false
...
--SNIP--

Plan: 1 to add, 0 to change, 0 to destroy.

------------------------------------------------------------------------

Note: You didn't specify an "-out" parameter to save this plan, so Terraform
can't guarantee that exactly these actions will be performed if
"terraform apply" is subsequently run.

Nu het script is ingesteld, roep het aan door terraform init uit te voeren vanuit je werkmap. Dit zal alle afhankelijkheden en providers ophalen in een map met de naam .terraform. Als alles goed gaat, zou je iets moeten zien zoals dit:

Voordat je wijzigingen aanbrengt, stelt Terraform EC2 je in staat te zien wat er zal worden gemaakt door terraform plan uit te voeren. Hier is wat dat zal opleveren:

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value:    

# aws_instance.ubuntu wordt aangemaakt

aws_instance.ubuntu: Creating...
aws_instance.ubuntu: Still creating... [10s elapsed]
aws_instance.ubuntu: Still creating... [20s elapsed]
aws_instance.ubuntu: Still creating... [30s elapsed]
aws_instance.ubuntu: Creation complete after 33s [id=i-07cefd2a426a179b5]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Het bouwen van de AWS EC2-instantie: Aanmaken

Nu ben je klaar om het zelf uit te voeren door terraform apply te gebruiken. Hieronder zie je output vergelijkbaar met terraform plan, maar met een extra prompt om te bevestigen dat je deze wijzigingen daadwerkelijk wilt toepassen.

Zodra je ‘ja’ typt, zal Terraform EC2 beginnen met het voorzien van de Terraform EC2-instantie door de AWS API’s aan te roepen met de toegangssleutel in je referentiebestand. Dit kan enige tijd duren. Zodra het klaar is, zie je iets als het volgende:

Plan: 0 to add, 0 to change, 1 to destroy.

Do you really want to destroy all resources?
  Terraform will destroy all your managed infrastructure, as shown above.
  There is no undo. Only 'yes' will be accepted to confirm.

  Enter a value: 

Het vernietigen van de AWS EC2-instantie

aws_instance.ubuntu: Destroying... [id=i-07cefd2a426a179b5]
aws_instance.ubuntu: Still destroying... [id=i-07cefd2a426a179b5, 10s elapsed]
aws_instance.ubuntu: Still destroying... [id=i-07cefd2a426a179b5, 20s elapsed]
aws_instance.ubuntu: Still destroying... [id=i-07cefd2a426a179b5, 30s elapsed]
aws_instance.ubuntu: Destruction complete after 30s

Destroy complete! Resources: 1 destroyed.

Zodra je klaar bent met de testomgeving, kun je de instantie vernietigen.

Typ in je cmd/PowerShell-console terraform destroy. Net als bij het apply-commando, zie je een lijst van bronnen die Terraform gaat vernietigen en vervolgens een prompt voordat ze daadwerkelijk worden vernietigd.

Zodra je ‘ja’ typt, zal Terraform EC2 beginnen met het vernietigen van de instantie en bevestigen wanneer het klaar is.

Source:
https://adamtheautomator.com/terraform-windows/