Wie man lokale Dateien mit Terraform auf eine Amazon EC2-Instanz hochlädt

Wenn wir mit EC2-Instanzen arbeiten, müssen wir oft eine lokale Datei auf die Instanz kopieren. Das ist vor allem dann notwendig, wenn die Datei sofort auf der Instanz verfügbar sein soll, sobald sie erstellt wird. Eine der Anforderungen meines Terraform-Projekts war zum Beispiel, dass eine Konfigurationsdatei für einen virtuellen Apache-Host auf der EC2-Instanz verfügbar sein muss, sobald sie erstellt wird. Diese Datei wurde als Vorlage für die Erstellung von zwei Konfigurationsdateien für virtuelle Hosts verwendet. Dazu habe ich das Tool File Provisioner von Terraform verwendet, um diese Dateien zu kopieren.

Du solltest wissen, dass Terraform die Verwendung von Provisionern nicht empfiehlt und für Fälle, in denen sie verfügbar sind, alternative Techniken empfiehlt. Es gibt viele Gründe für diese Einschränkung, die auf der Terraform-Website aufgeführt sind.

Was werden wir behandeln?

In diesem Lernprogramm sehen wir uns an, wie man eine Datei von einem lokalen Rechner, auf dem Terraform läuft, auf eine neu erstellte Amazon EC2-Instanz (Ubuntu) auf AWS kopiert. Bei dieser Methode verwenden wir das von Terraform bereitgestellte Dienstprogramm File. Wir demonstrieren seine Verwendung, indem wir einfach eine Datei auf eine EC2-Instanz kopieren.

Wofür werden Provisioner verwendet?

Provisioner werden in der Regel für die Ausführung von Skripten verwendet, um verschiedene Ressourcen zu erstellen und zu zerstören und eine Maschine für den Einsatz in einer Produktions- oder Entwicklungsumgebung vorzubereiten. Zu den Provisioning-Vorgängen gehören u. a. die folgenden:

  1. Upgrade des Betriebssystems.
  2. Erstellen von Konten, Konfigurieren von Diensten und andere Systemverwaltungsaufgaben.
  3. Software-Installation.
  4. Übertragen von Dateien auf ein System und Verwalten von Dateien auf dem System.
  5. Konfigurieren von System-IP-Adressen, Ports und anderen Aufgaben.

Vorraussetzungen

  1. Die Grundlagen von Terraform.
  2. Terraform und AWS CLI sind auf dem lokalen System installiert.
  3. AWS CLI für den Zugriff auf dein AWS-Konto konfiguriert.

Verwendung des ‚File‘ Provisioners zum Kopieren der Dateien

Der ‚File Provisioner‘ wird verwendet, um Dateien und Verzeichnisse von dem Rechner, auf dem Terraform läuft, auf denselben oder einen anderen Rechner wie EC2-Instanzen zu kopieren. Provisioner können sowohl auf lokalen als auch auf entfernten Systemen angewendet werden. Terraform eignet sich zwar hervorragend für die Bereitstellung, aber nicht für das Provisioning. Viele Betriebssysteme und Befehle werden von Terraform nicht richtig unterstützt. Deshalb schlägt Terraform die Verwendung von Provisionern als letzte Option vor.

Praktische Anwendung des ‚file‘ Provisioners

In diesem Abschnitt sehen wir uns eine praktische Anwendung des „file“-Provisioners an. Wir werden eine EC2-Instanzressource mit Terraform erstellen und dann eine Datei vom lokalen System in diese Instanz kopieren. Lass uns gleich loslegen:

Schritt 1. Erstelle zunächst die Datei, die wir auf das entfernte System kopieren wollen. Wir erstellen sie in dem Verzeichnis, das alle unsere Konfigurationsdateien enthält:

$ nano dummy.txt

Füge außerdem einige Inhalte zu dieser Datei hinzu:

$ echo “Our dummy file” > dummy.txt

Schritt 2. Erstelle eine Datei mit dem Namen „instance.tf“ oder einem beliebigen Namen, aber mit der Erweiterung „.tf“:

$ sudo instance.tf

Nun füllst du diese Datei mit dem folgenden Inhalt:

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“
}
}

Der obige Code kopiert die Datei „dummy.txt“ in die EC2-Instanz mit dem Namen „file1.txt“. Wir haben hier eine bestehende Sicherheitsgruppe verwendet. Du kannst mit Terraform eine neue Gruppe erstellen und sie hier verwenden. Schauen wir uns eine Beschreibung einiger der hier verwendeten Argumente an:

  • Quelle: Absolute Speicherorte von Dateien und Verzeichnissen oder ein relativer Speicherort, der dem Terraform-Projektverzeichnis entspricht.
  • destination: Das ist der absolute Pfad auf dem Zielsystem.
  • Verbindungsblock: Terraform lernt mit Hilfe des Verbindungsblocks, wie es mit dem Server kommunizieren kann. Verbindungen vom Typ ’ssh‘ und ‚winrm‘ werden beide von File Provisionern unterstützt.
  • Typ: Dieses Feld gibt den Typ einer Verbindung an, der „ssh“ oder „winrm“ sein kann. Wir haben in diesem Labor eine SSH-Verbindung verwendet.
  • Benutzer: Gibt den Benutzer an, der für eine Verbindung verwendet werden soll.
  • private_key: Der Inhalt eines SSH-Schlüssels für den Aufbau einer Verbindung.
  • host: Gib die Adresse der Ressource an, mit der wir uns verbinden wollen.
  • self: Ein Objekt, das die übergeordnete Ressource einer Verbindung darstellt und alle Attribute einer Ressource enthält.

File Provisioner unterstützt auch andere Argumente wie Zertifikat, Agent, host_key usw.

Schritt 3. Initialisiere das Projektverzeichnis mit:

$ terraform init

Terraform Projektverzeichnis initialisieren
Überprüfe außerdem, ob ein syntaktischer Fehler vorliegt, indem du den Befehl ausführst:

$ terraform validate

Validierung der Terraform-Konfiguration
Schritt 4. Um diese Infrastruktur einzurichten, führe den Befehl „terraform apply“ aus. Du kannst die vorzunehmenden Änderungen auch mit dem Befehl „terraform plan“ überprüfen:

$ terraform apply

Beispielhafte Ausgabe:

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“

Schritt 5. Unsere Instanz wird nun wie unten dargestellt erstellt:

AWS EC2-Konsole
Gehe jetzt per SSH zu deiner Instanz und prüfe, ob die Datei erfolgreich kopiert wurde:

Überprüfen der Einrichtung

Fazit

In dieser Anleitung haben wir gesehen, wie wir mit dem Provisioner „Datei“ eine Datei in eine Instanz kopieren können.

Das könnte dich auch interessieren …