Einführung
Eine Anwendung kann eine laufende Instanz und eine öffentliche Adresse haben und trotzdem unerreichbar sein. Sie definieren die fehlende Route und eine eng begrenzte Sicherheitsgruppenregel mit Terraform und testen anschließend sowohl erlaubte als auch blockierte Verbindungen.
Sie sollten Terraform-Ressourcenreferenzen, VPCs, Subnetze, Internet-Routen und Sicherheitsgruppen verstehen. Diese unabhängige Umgebung stellt eine Zielanwendung, eine separate funktionierende Referenzanwendung und vorbereitete Terraform-Eingabewerte bereit. Sie verwalten ausschließlich die neuen Verbindungsressourcen.
Bezug zu Zertifizierungen
| Zertifizierung | Prüfungsaufgabe | Übung |
|---|---|---|
| Solutions Architect – Associate (SAA-C03) | Task 1.2 | Ein VPC-Subnetz über ein Internet-Gateway anbinden und den Netzwerkzugriff auf eine Anwendung nach Quelle und Port einschränken. |
Lab-Überblick

Die Internet-Route einrichten
In diesem Schritt verbinden Sie ein Internet-Gateway mit der Anwendungs-VPC und ordnen ihrem Subnetz ausdrücklich eine Routing-Tabelle zu.
Öffnen Sie Terminal und AWS View. Anwendungs- und Referenznetzwerk sind unabhängig voneinander. Der application-server hat bereits eine öffentliche Adresse, weil sein Subnetz beim Start öffentliche IP-Adressen zuweist. Eine öffentliche Adresse allein erstellt weder eine Internet-Route noch eine Berechtigung für eingehende Verbindungen.
Wählen Sie in AWS View application-server, User · 198.51.100.10 und Application · 8081 aus und klicken Sie auf Send request. Erwarten Sie Blocked. Wählen Sie reference-server mit demselben Client und Anwendungsport aus, senden Sie eine weitere Anfrage und bestätigen Sie, dass die Referenzanwendung antwortet. Halten Sie diese Referenzanwendung während des gesamten Labs funktionsfähig.
Wechseln Sie in das vorbereitete Arbeitsverzeichnis:
cd /home/labex/project/application-access
Die bereitgestellte Datei terraform.tfvars.json enthält die IDs der VPC, des Subnetzes und der Sicherheitsgruppe dieser frischen Umgebung. Terraform lädt diese Eingabewerte automatisch. Lesen Sie sie, bevor Sie die entsprechenden Variablen verwenden:
cat terraform.tfvars.json
Die vorbereitete Provider-Konfiguration wählt die Kursumgebung aus. Sie müssen keine IDs aus einer früheren VM kopieren oder persönliche Zugangsdaten eingeben. Speichern Sie die ID der bereitgestellten Zielinstanz für eine spätere Untersuchung und zeigen Sie sie an. $(...) erfasst die Befehlsausgabe, und --output text gibt die ID als einfachen Text zurück.
TARGET_ID=$(aws ec2 \
describe-instances \
--filters Name=tag:Name,Values=application-server Name=instance-state-name,Values=running \
--query 'Reservations[0].Instances[0].InstanceId' \
--output text)
echo "$TARGET_ID"
Ein Internet-Gateway wird mit einer VPC verbunden. Eine Routing-Tabelle sendet den Datenverkehr für ein Ziel an dessen Gateway, und eine Subnetzzuordnung legt fest, welche Tabelle für das Subnetz gilt. Ohne explizite Zuordnung verwendet ein Subnetz die Haupt-Routing-Tabelle seiner VPC. Lassen Sie diese bereitgestellte Haupttabelle unverändert. Das Ziel 0.0.0.0/0 erfasst IPv4-Adressen, für die keine spezifischere Route vorliegt; es erteilt keine Berechtigung durch eine Sicherheitsgruppe.
Erstellen Sie routing.tf. Das Heredoc mit Anführungszeichen schreibt den HCL-Inhalt unverändert. Ressourcenreferenzen verbinden die Route mit ihrer Tabelle und ihrem Gateway und die Subnetzzuordnung mit derselben Tabelle.
cat > routing.tf <<'HCL'
resource "aws_internet_gateway" "application" {
vpc_id = var.vpc_id
}
resource "aws_route_table" "application" {
vpc_id = var.vpc_id
}
resource "aws_route" "internet" {
route_table_id = aws_route_table.application.id
destination_cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.application.id
}
resource "aws_route_table_association" "application" {
subnet_id = var.subnet_id
route_table_id = aws_route_table.application.id
}
output "route_table_id" {
value = aws_route_table.application.id
}
output "subnet_id" {
value = var.subnet_id
}
HCL
Initialisieren, formatieren und validieren Sie die Konfiguration:
terraform init
terraform fmt
terraform validate
Wenn init die Meldung Incomplete lock file information for providers ausgibt, betrifft dies Prüfsummen für andere Plattformen. Diese vorbereitete VM verwendet linux_amd64; fahren Sie fort, nachdem Initialisierung und Validierung erfolgreich abgeschlossen wurden.
Prüfen Sie die vier Erstellungen: Gateway, Tabelle, Route und Zuordnung. Die bereitgestellte Instanz und das Referenznetzwerk dürfen nicht als zu ersetzende oder zu löschende Ressourcen erscheinen.
terraform plan
Wenden Sie die Konfiguration an und geben Sie auf Nachfrage yes ein:
terraform apply
Speichern Sie die ID der neuen Tabelle und die ID des bereitgestellten Subnetzes und zeigen Sie beide an:
TABLE_ID=$(terraform output -raw route_table_id)
echo "$TABLE_ID"
SUBNET_ID=$(terraform output -raw subnet_id)
echo "$SUBNET_ID"
Fragen Sie die Routing-Tabelle unabhängig davon ab. Suchen Sie nach dem Standardziel, dem Gateway igw-... und der Zuordnung zu Ihrer Subnetz-ID. Die lokale VPC-Route bleibt ebenfalls erhalten.
aws ec2 \
describe-route-tables \
--route-table-ids "$TABLE_ID" \
--query 'RouteTables[].{Routes:Routes[].{Destination:DestinationCidrBlock,Gateway:GatewayId},Subnets:Associations[].SubnetId}'
Bestätigen Sie die Zuweisung öffentlicher Adressen im bereitgestellten Subnetz:
aws ec2 \
describe-subnets \
--subnet-ids "$SUBNET_ID" \
--query 'Subnets[].{CIDR:CidrBlock,PublicIPOnLaunch:MapPublicIpOnLaunch}'
PublicIPOnLaunch ist true. Diese Einstellung steuert neu gestartete Instanzen; durch ihre Änderung lässt sich einer vorhandenen Instanz nicht nachträglich eine Adresse zuweisen. AWS View zeigt jetzt das tatsächliche Gateway und die wirksame Routing-Tabelle. Senden Sie die User/8081-Anfrage an die Anwendung erneut: Sie bleibt Blocked, weil noch keine Eingangsregel sie erlaubt.
Den vorgesehenen Client zulassen und die Zugriffsgrenze testen
In diesem Schritt erlauben Sie dem User-Client den Zugriff auf den Anwendungsport und überprüfen, dass ein anderer Client und ein anderer Port weiterhin blockiert bleiben.
Eine Sicherheitsgruppe bildet eine zustandsbehaftete Netzwerkgrenze an der Netzwerkschnittstelle einer Instanz. Routing stellt einen Pfad bereit; die Gruppe entscheidet weiterhin, welche eingehenden Verbindungen erlaubt sind. Die bereitgestellte Anwendungssicherheitsgruppe hat derzeit keine Eingangsregeln.
Erstellen Sie eine eigenständige Ressource für eine Eingangsregel dieser Gruppe. cidr_ipv4 = "198.51.100.10/32" wählt die einzelne IPv4-Adresse des User-Clients aus. Wenn beide Portgrenzen auf 8081 gesetzt werden, ist nur der Anwendungs-Listener erlaubt. Die Referenzanwendung verwendet ihre eigene Sicherheitsgruppe.
cat > access.tf <<'HCL'
resource "aws_vpc_security_group_ingress_rule" "application" {
security_group_id = var.security_group_id
ip_protocol = "tcp"
from_port = 8081
to_port = 8081
cidr_ipv4 = "198.51.100.10/32"
}
output "security_group_id" {
value = var.security_group_id
}
HCL
Formatieren und validieren Sie die Konfiguration und prüfen Sie anschließend den Plan. Es sollte eine Eingangsregel hinzugefügt und keine Instanz ersetzt werden.
terraform fmt
terraform validate
terraform plan
Wenden Sie die Regel an und bestätigen Sie mit yes:
terraform apply
Speichern Sie die ID der vorhandenen Gruppe, zeigen Sie sie an und lesen Sie anschließend ihre tatsächliche Eingangsberechtigung:
GROUP_ID=$(terraform output -raw security_group_id)
echo "$GROUP_ID"
aws ec2 \
describe-security-groups \
--group-ids "$GROUP_ID" \
--query 'SecurityGroups[].{Group:GroupId,Ingress:IpPermissions}'
Die Berechtigung muss den TCP-Port 8081 mit der Quelle 198.51.100.10/32 beschreiben. Bestätigen Sie, dass die Terraform-Konfiguration einen übereinstimmenden Zustand erreicht hat:
terraform plan
Erwarten Sie No changes. Führen Sie jetzt alle drei Tests in AWS View aus und wählen Sie dabei jedes Mal application-server aus:
Wählen Sie User · 198.51.100.10 und Application · 8081 aus. Klicken Sie auf Send request. Erwarten Sie Connected · 200 und die Meldung Application network connected.
Ändern Sie die Quelle in Unrelated · 198.51.100.20, behalten Sie Port 8081 bei und senden Sie eine weitere Anfrage. Erwarten Sie Blocked.
Wechseln Sie zurück zur Quelle User, wählen Sie SSH · 22 aus und senden Sie eine weitere Anfrage. Erwarten Sie Blocked. Eine erfolgreiche Anwendungsanfrage berechtigt nicht zum Zugriff auf den separaten SSH-Listener des Gastsystems.
Das Ergebnis kennzeichnet die tatsächliche Quelle, die Zielinstanz und den Port. Request service unavailable ist ein Umgebungsfehler und kein Nachweis einer beabsichtigten Netzwerkblockierung. Erweitern Sie die Regel nicht auf 0.0.0.0/0: Dadurch würde derselbe Anwendungs-Listener für den nicht vorgesehenen Client zugänglich.
Die Dokumentation zur Eingangsregel des AWS-Providers beschreibt die Felder der Ressource. Ihre CLI-Abfragen, die Terraform-Zuordnung und die tatsächlichen Anfrageergebnisse sollten übereinstimmen.
Die Verbindungsressourcen entfernen und die Anwendungen erhalten
In diesem Schritt entfernen Sie ausschließlich die von Terraform verwalteten Verbindungsressourcen und bestätigen, dass die bereitgestellten Anwendungen unversehrt bleiben.
Dieses Arbeitsverzeichnis verwaltet fünf Ressourcen: ein Internet-Gateway, eine Routing-Tabelle, eine Standardroute, eine Subnetzzuordnung und eine Eingangsregel. VPC, Subnetz, Haupt-Routing-Tabelle, Zielinstanz und Referenzanwendung wurden unabhängig davon bereitgestellt. Sie liegen außerhalb dieses States und müssen erhalten bleiben.
Prüfen Sie den Löschplan:
terraform plan -destroy
Erwarten Sie fünf zu löschende Ressourcen. Führen Sie anschließend die Löschung aus und geben Sie yes ein:
terraform destroy
Bestätigen Sie, dass der State keine verwalteten Ressourcenadressen mehr enthält:
terraform state list
Die bereitgestellte Zielinstanz sollte weiterhin mit derselben ID laufen:
aws ec2 \
describe-instances \
--instance-ids "$TARGET_ID" \
--query 'Reservations[].Instances[].{ID:InstanceId,State:State.Name,Subnet:SubnetId}'
Senden Sie in AWS View erneut die User/8081-Anfrage an die Zielinstanz. Sie sollte Blocked sein, weil Sie ihre Verbindungsressourcen entfernt haben. Wählen Sie anschließend reference-server, User und Port 8081 aus und senden Sie eine Anfrage. Die Referenzanwendung muss weiterhin Connected · 200 und Reference application zurückgeben.
Ihre HCL-Dateien bleiben zur Durchsicht verfügbar. Ein späterer gewöhnlicher Plan würde die Neuerstellung der entfernten Ressourcen vorschlagen; das Beibehalten dieser Konfiguration ist nach terraform destroy normal.
Zusammenfassung
Sie haben mit Terraform-Referenzen ein Internet-Gateway angebunden, eine Standardroute definiert und einem Anwendungssubnetz eine Routing-Tabelle zugeordnet. Anschließend haben Sie eine eng begrenzte Eingangsregel hinzugefügt, tatsächliche Zugriffsgrenzen für Quelle und Port getestet, einen übereinstimmenden Zustand bestätigt und ausschließlich Ihre Verbindungsressourcen entfernt, während die bereitgestellten Anwendungen erhalten blieben.



