S3 Bucket mit Terraform deployen und als NFS an EC2 Instanz mounten

Cloud Computing

In diesem Artikel erkläre ich, wie du mit Terraform einen S3-Bucket erstellst und diesen mithilfe von AWS File Gateway als NFS-Freigabe auf einer EC2-Instanz einbindest.

Voraussetzungen

  • Ein funktionierendes AWS-Konto
  • Terraform ist lokal installiert
  • Eine EC2-Instanz mit Linux (z. B. Amazon Linux 2 oder Ubuntu)

Schritt 1: Terraform-Projekt vorbereiten

Erstelle ein neues Verzeichnis für das Terraform-Projekt und wechsle in dieses Verzeichnis:

mkdir terraform-s3-nfs && cd terraform-s3-nfs

Erstelle eine Datei main.tf mit folgendem Inhalt:

provider "aws" {
  region = "eu-central-1"
}

resource "aws_s3_bucket" "my_bucket" {
  bucket = "mein-terraform-s3-bucket"
  acl    = "private"
}

Initialisiere Terraform und wende die Konfiguration an:

terraform init
terraform apply -auto-approve

Nun ist der S3-Bucket erstellt.


Schritt 2: AWS File Gateway einrichten

Da S3 selbst kein direktes NFS unterstützt, nutzen wir AWS Storage Gateway. Erstelle zunächst das Gateway:

resource "aws_storagegateway_gateway" "nfs_gateway" {
  gateway_name     = "nfs-gateway"
  gateway_timezone = "GMT"
  gateway_type     = "FILE_S3"
  activation_key   = "${aws_storagegateway_gateway.nfs_gateway.activation_key}"
}

Nun definieren wir den File-Share:

resource "aws_storagegateway_nfs_file_share" "nfs_share" {
  gateway_arn  = aws_storagegateway_gateway.nfs_gateway.arn
  role_arn     = aws_iam_role.s3_access.arn
  location_arn = aws_s3_bucket.my_bucket.arn
  default_storage_class = "S3_STANDARD"
}

Vergiss nicht, eine IAM-Rolle (aws_iam_role.s3_access) zu definieren, die den Zugriff auf den S3-Bucket erlaubt.


Schritt 3: NFS-Freigabe auf der EC2-Instanz mounten

Nachdem das File Gateway eingerichtet ist, kannst du die Freigabe auf deiner EC2-Instanz als NFS mounten. Stelle sicher, dass der NFS-Client installiert ist:

sudo yum install -y nfs-utils   # Amazon Linux 2 / RHEL-basierte Systeme
sudo apt-get install -y nfs-common   # Debian/Ubuntu-basierte Systeme

Finde die NFS-Endpunkt-Adresse des File Gateways heraus (sie wird in der AWS-Konsole angezeigt oder kann mit Terraform ausgelesen werden) und mounte die Freigabe:

sudo mkdir -p /mnt/s3_nfs
sudo mount -t nfs4 <NFS_ENDPOINT>:/ /mnt/s3_nfs

Um das Mounten beim Booten zu automatisieren, füge folgende Zeile in die /etc/fstab ein:

<NFS_ENDPOINT>:/ /mnt/s3_nfs nfs4 defaults,_netdev 0 0

Häufige Fehler und deren Lösungen

1. Terraform-Fehler: „BucketAlreadyExists“

Problem: Die Bucket-Namen in AWS müssen global einzigartig sein. Lösung: Wähle einen anderen Namen oder nutze Variablen, um einen zufälligen Suffix hinzuzufügen:

bucket = "mein-terraform-s3-bucket-${random_id.bucket_id.hex}"

2. NFS-Fehler: „Permission denied“

Problem: Die IAM-Rolle hat nicht die erforderlichen Berechtigungen. Lösung: Stelle sicher, dass die Rolle folgende Berechtigungen hat:

policy = jsonencode({
  Statement = [
    {
      Effect   = "Allow"
      Action   = ["s3:GetObject", "s3:ListBucket"]
      Resource = "${aws_s3_bucket.my_bucket.arn}/*"
    }
  ]
})

3. EC2 kann das NFS nicht mounten

Problem: Das Storage Gateway ist nicht korrekt eingerichtet oder nicht erreichbar. Lösung:

  • Stelle sicher, dass das Gateway in der gleichen VPC ist.
  • Prüfe die Firewall-Regeln (Security Groups & NACLs).
  • Nutze telnet zum Testen des Ports 2049:
telnet <NFS_ENDPOINT> 2049

4. NFS-Performance ist langsam

Problem: Die Netzwerkverbindung oder S3-Klasse ist nicht optimal. Lösung:

  • Nutze S3-Intelligent-Tiering statt Standard-S3.
  • Stelle sicher, dass die EC2-Instanz und das Gateway in derselben Region sind.
  • Aktiviere nconnect für bessere Performance:
sudo mount -t nfs -o nconnect=4 <NFS_ENDPOINT>:/ /mnt/s3_nfs

Fazit

Nun hast du erfolgreich einen S3-Bucket mit Terraform erstellt, ein AWS Storage Gateway konfiguriert und die S3-Freigabe per NFS auf einer EC2-Instanz eingebunden. Dies ist eine effiziente Methode, um S3 als Netzwerkspeicher zu nutzen, ohne direkt auf die S3-API zugreifen zu müssen.

Siehe auch  Linux Mint SSH aktivieren leicht gemacht
Über Christian 323 Artikel
34 Jahre alt, gebürtig aus Cuxhaven und bekennender Kaffeejunkie :-). Ich interessiere mich schon seit meiner Kindheit für Technik. Dieses Interesse übertrage ich in meinem beruflichen Leben sowie im Privaten. Viel Spaß beim Stöbern!