lokale bestanden uploaden naar een Amazon EC2 instance met Terraform

Als we met EC2 instances werken, moeten we vaak een lokaal bestand naar de instance kopiëren. Dit is vooral nodig als het bestand meteen op de instantie beschikbaar moet zijn zodra die wordt aangemaakt. Een van de eisen van mijn Terraform project was bijvoorbeeld dat een configuratiebestand voor een Apache virtuele host beschikbaar moet zijn op de EC2 instantie zodra die wordt aangemaakt. Dit bestand werd gebruikt als sjabloon om twee virtuele host configuratiebestanden te maken. Om dit te doen gebruikte ik Terraform’s File Provisioner gereedschap om deze bestanden te kopiëren.

Je moet weten dat Terraform het gebruik van provisioners niet aanbeveelt en alternatieve technieken aanbeveelt voor gevallen waarin ze wel beschikbaar zijn. Er zijn veel redenen voor deze beperking, die op de Terraform website vermeld worden.

Wat zullen we behandelen?

In deze zelfstudie bekijken we hoe je een bestand kunt kopiëren van een lokale machine waarop Terraform draait naar een nieuw aangemaakte Amazon EC2 instance (Ubuntu) op AWS. Bij deze methode gebruiken we het File hulpprogramma dat Terraform biedt. We demonstreren het gebruik ervan door eenvoudig een bestand naar een EC2 instance te kopiëren.

Waar worden Provisioners voor gebruikt?

Provisioners worden meestal gebruikt voor het uitvoeren van scripts voor het aanmaken, vernietigen van verschillende middelen, en het gebruiksklaar maken van een machine in een productie- of ontwikkelomgeving. Provisioning operaties omvatten zaken als de onderstaande:

  1. Upgraden van het besturingssysteem.
  2. Accounts aanmaken, diensten configureren en andere systeembeheerstaken.
  3. Software installeren.
  4. Overbrengen van bestanden naar en beheren van bestanden op een systeem.
  5. Configureren van systeem IP adressen, poorten en andere taken.

Vereisten

  1. De grondbeginselen van Terraform.
  2. Terraform en AWS CLI geïnstalleerd op het lokale systeem.
  3. AWS CLI geconfigureerd voor toegang tot je AWS account.

Gebruik de ‘file’ Provisioner voor het kopiëren van de bestanden

De ‘File Provisioner’ wordt gebruikt om bestanden en mappen te kopiëren van de machine waarop Terraform draait naar dezelfde of een andere machine zoals EC2 instances. Provisioners kunnen zowel op lokale als op externe systemen worden toegepast. Hoewel Terraform geweldig is in uitroloperaties, is het niet zo bedreven in provisioning. Veel besturingssystemen en commando’s worden niet handig door Terraform ondersteund. Daarom stelt Terraform voor om Provisioners als laatste optie te gebruiken.

Praktische toepassing van ‘bestand’ Provisioner

In dit onderdeel zullen we een praktische manier zien om de ‘file’ provisioner te gebruiken. We zullen een EC2 instance resource aanmaken met Terraform en dan een bestand van het lokale systeem naar deze instance kopiëren. Laten we dat nu meteen doen:

Stap 1. Maak eerst het bestand dat we naar het externe systeem willen kopiëren. We maken het binnen de directory waarin al onze configuratie bestanden staan:

$ nano dummy.txt

Voeg ook wat inhoud aan dit bestand toe:

$ echo “Our dummy file” > dummy.txt

Stap 2. Maak een bestand met de naam ‘instance.tf’ of welke naam je maar wilt, maar met de extensie ‘.tf’:

$ sudo instance.tf

Vul dit bestand nu met de onderstaande inhoud:

provider "aws" {
region ="us-east-1"
}

resource "aws_instance" "webserver" {
ami ="ami-id-you-want-to-use"
instance_type = "t2.micro"
key_name = "Name-of-your- EC2-keypair"
vpc_security_group_ids = ["Use-an-existing-SG"]
associate_public_ip_address = true

  provisioner "file" {
       source      = "dummy.txt"
       destination = "/home/ubuntu/file1.txt"
      
connection {
     type        = "ssh"
     user        = "ubuntu"
     private_key = "${file("Path-to-EC2-keyPair-on-Local-system.pem")}"
     host        = "${self.public_ip}"
   }
  }


tags = {
   Name = "FileProvisionerDemo"
}
}

De bovenstaande code zal het ‘dummy.txt’ bestand naar de EC2 instantie kopiëren met de naam ‘file1.txt’. We hebben hier een bestaande beveiligingsgroep gebruikt, je kunt met Terraform een nieuwe aanmaken en die hier gebruiken. Laten we eens kijken naar een beschrijving van enkele van de argumenten die hier gebruikt worden:

  • source: Absolute locaties van bestanden en mappen of een relatieve die overeenkomt met de Terraform projectdirectory.
  • destination: Dit is het absolute pad op het doelsysteem.
  • verbindingsblok: Terraform leert hoe te communiceren met de server door het verbindingsblok te gebruiken. Verbindingen van het type ‘ssh’ en ‘winrm’ worden beide ondersteund door bestandsprovisioners.
  • type: Dit veld specificeert het type van een verbinding, dat ‘ssh’ of ‘winrm’ kan zijn. We hebben hier in dit lab een SSH verbinding gebruikt.
  • gebruiker: Specificeert de gebruiker die voor een verbinding gebruikt moet worden.
  • private_key: De inhoud van een SSH sleutel voor het maken van een verbinding.
  • host: Specificeer het adres van de bron waarmee we verbinding willen maken.
  • self: Een object dat de bovenliggende bron van een verbinding voorstelt en alle attributen van een bron bezit.

File provisioner ondersteunt ook andere argumenten zoals certificate, agent, host_key enzovoort.

Stap 3. Initialiseer de projectdirectory met:

$ terraform init

Initialiseren van de Terraform projectdirectory
Controleer ook op eventuele syntactische fouten door het commando uit te voeren:

$ terraform validate

Valideren van Terraform configuratie
Stap 4. Om deze infrastructuur in te stellen, voer je het ’terraform apply’ commando uit. Je kunt ook de aan te brengen veranderingen bekijken met het ’terraform plan’ commando:

$ terraform apply

Voorbeeld uitvoer:

Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # aws_instance.webserver will be created
  + resource "aws_instance" "webserver"

Stap 5. Onze instantie wordt nu aangemaakt zoals hieronder te zien is:

AWS EC2 console
SSH nu naar je instantie en controleer of het bestand met succes gekopieerd is:

De opstelling controleren

Conclusie

In deze gids hebben we gezien hoe we de ‘file’ provisioner kunnen gebruiken om een bestand naar een instantie te kopiëren.