
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.