Seien wir ehrlich: Eine dreiteilige Serie über etwas Technisches wie IaC kann eine Herausforderung sein. Ich bin mir sicher, dass Sie schon ein paar Mal davon abgehalten wurden. Es ist aufregend, Teil 3 zu erreichen – dann beginnt der spaßige Teil. Es ist der Moment, in dem das Gummi auf die Straße kommt. Wenn Sie das Gefühl haben, dass Sie kaum noch durchhalten können und daran zweifeln, dass Sie diesen Teil zu Ende bringen können, ist es wahrscheinlich gut zu wissen, dass es den meisten Menschen auch so geht. Nur sehr wenige wagen sich an etwas so Abstraktes und schaffen es gleich beim ersten (oder dritten) Versuch. Kommen wir zur Sache!
Für diese erste Bereitstellung verwenden wir etwas, das wir alle mit Namen kennen: Splunk. In diesem Skript stellen wir einen einzelnen Server bereit, auf dem Splunk bereits installiert und konfiguriert ist. Dabei wird ein Amazon Machine Image (AMI) verwendet. Es stehen viele AMIs zur Auswahl. Einige sind unterschiedliche Betriebssysteme, wie Windows oder Linux; Bei einigen handelt es sich um verschiedene Linux-Distributionen wie Ubuntu, CentOS usw., bei anderen handelt es sich um vorgefertigte Anwendungen wie diese.
Wir werden den Splunk EC2- Server (die „Splunk-Instanz“) hochfahren, einen Netzwerkzugriff erstellen, damit nur Ihre öffentliche IP-Adresse ihn am TCP-Port 8000 (dem Standard-Splunk-UI-Port) erreichen kann, und dann alles mit einem einfachen Terraform zerstören Befehl, wenn wir fertig sind.
Ich werde die einzelne Terraform- Datei (main.tf) in ein paar kleine Teile aufteilen, damit wir jeden Teil einfacher durchgehen können. Am Ende werde ich dann alles zusammenfügen, damit wir es umsetzen können.
Bevor wir beginnen, ist es wichtig, dass Sie wissen, wo Sie Antworten auf Fragen finden können, die ich hier nicht berücksichtigt habe. Als ich beispielsweise anfing, in Terraform zu bauen, fragte ich mich: „Woher weiß ich, welche Argumente (so definieren Sie die Ressourcen, wie den Typ der virtuellen Maschine in einer EC2-Instanz oder die in einer Sicherheitsgruppe zulässigen Eingangsprotokolle)“ . In diesem Beispiel und für VIELE andere Fragen, die hier nicht beantwortet werden, können Sie in der Terraform-Registrierung mehr über verfügbare Anbieter, Ressourcen, Argumente und Syntax erfahren.
Beispielsweise kann ich in der Registrierung nach der Ressource „Sicherheitsgruppe“ suchen (die wir in diesem Tutorial verwenden werden) und dann zur Registerkarte „Eingaben“ gehen, um alle verfügbaren Argumente anzuzeigen (zu Ihrer Information werden sie Variablen genannt). zulässig, wenn wir die Ressource konfigurieren. Okay...Umweg abgeschlossen, zur Konfiguration Ihrer ersten TF-Bereitstellung!
Im ersten Schritt müssen wir den Anbieter definieren, den wir verwenden möchten. Wir arbeiten in AWS, daher wird der Anbieter „AWS“ sein. Auch hier definieren wir die Region, die wir bearbeiten wollen.
provider "aws" { region = "us-west-1" }
Wenn Sie sich erinnern, habe ich gesagt, dass wir ein Amazing Machine Image (AMI) für eine virtuelle Maschine (EC2) verwenden würden. Hier verwenden wir das Terraform-Schlüsselwort „data“, um nach der Ressource „aws_ami“ zu suchen. Darüber hinaus geben wir allen Daten, die im Rahmen dieser Suche zurückgegeben werden, einen Namen – „Splunk“. Dies dient dazu, dass wir an anderer Stelle in unserem Code auf diese Daten verweisen können (bedenken Sie dies später) ...
Da die Suche nach irgendetwas eine Möglichkeit erfordert, die Suchergebnisse nur auf das zu beschränken, was wir finden möchten, verwenden wir das Filterschlüsselwort und übergeben ihm dann zwei Argumente, „Name“ und „Werte“. Hier weisen wir die Suche nach „aws_ami“ an, das Feld „Name“ nach allem zu durchsuchen, was mit „Splunk“ beginnt. Obwohl dies möglicherweise genauer abgestimmt werden muss, ist dieser Filter in diesem Fall gut.
data "aws_ami" "splunk" { most_recent = true filter { name = "name" values = ["splunk*"] } }
In AWS wird der Netzwerkzugriff auf Ressourcen häufig über eine Ressource namens „ Sicherheitsgruppe “ gesteuert. In unserem Beispiel verwenden wir eine Sicherheitsgruppe, die eingehenden TCP-Port 8000 („Ingress“) von meiner IP-Adresse (oder Ihrer, wenn Sie dieses Skript erstellen) zulässt. Da wir Splunk in einem privaten Konto mit nicht vertraulichen Informationen verwenden, Ich erlaube ihm, nach außen zu kommunizieren („Egress“). Wenn es sich jedoch um eine Produktionsumgebung handelte, müssten Sie die erforderlichen IP- und Portbereiche identifizieren und den Zugriff nur auf diese beschränken, um Best Practices zu befolgen.
Beachten Sie, dass ich die Eingangsparameter definiere, einschließlich des Protokolls und „cidr_blocks“. Dies ist wichtig, da hier Fehlkonfigurationen eine Umgebung versehentlich für das breitere Internet öffnen können. Wenn Sie daran interessiert sind, mehr über die Bereitstellung zusätzlicher Netzwerksicherheit für Ihre AWS-Umgebung zu erfahren, lassen Sie es mich wissen – ich kann ein Tutorial zum Hinzufügen eines Application Load Balancers erstellen ( ALB) zu dieser Konfiguration hinzufügen, um zusätzliche Sicherheitsfunktionen bereitzustellen.
resource "aws_security_group" "splunksg" { name = "SplunkSecGroup" description = "Allow-on-port-8000" ingress { from_port = 8000 to_port = 8000 protocol = "tcp" cidr_blocks = ["YOUR_IP_HERE"] # Replace 'YOUR_PUBLIC_HERE' with your public IP address } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } }
Schließlich der Grund, warum wir alle hier sind: die virtuelle Maschine, auf der Splunk ausgeführt wird. Wie bei allen anderen Teilen des Terraform-Codes definieren wir zunächst eine Ressource, in diesem Fall „aws_instance“, und benennen sie „splunk_ec2“. Anschließend definieren wir mithilfe von Argumenten weitere Parameter darunter.
Erinnern Sie sich an das Schlüsselwort „data“, das wir oben verwendet haben, um „aws_ami“ nach dem neuesten „Splunk*“-AMI zu durchsuchen? Wir haben den Namen „Splunk“. Hier können wir in der EC2-Instanzkonfiguration auf die in dieser Abfrage enthaltenen Daten verweisen. Wir verweisen darauf, indem wir das Argument „ami“ verwenden und sagen, dass es dem entspricht, was in „data.aws_ami.splunk.id“ steht. Es ist wirklich wichtig, dieses Konzept zu verstehen. Lassen Sie uns also zwei Minuten damit verbringen, es aufzuschlüsseln:
Im Folgenden sagen wir, dass die security_group für dieses EC2 die oben definierte Sicherheitsgruppe „splunksg“ ist. Dabei wird die gleiche Logik wie bei der AMI-„Daten“-Benennung verwendet. IE, es beginnt mit dem Ressourcennamen, dem von uns definierten Objektnamen und dann der Variablen „.name“, die wir auch als „ SplunkSecGroup “ definiert haben. Beachten Sie auch, dass Sie dafür den Instanztyp von t2.micro verwenden können funktioniert – es ist nur sehr langsam, also entscheide ich mich für ein t2.medium.
Zuletzt wenden wir Tags auf diese Instanz an, was hilfreich ist, wenn ein AWS-Konto wächst und es schwieriger wird, den Überblick über Assets zu behalten.
resource "aws_instance" "splunk_ec2" { ami = data.aws_ami.splunk.id instance_type = "t2.medium" security_groups = [aws_security_group.splunksg.name] tags = { Name = "SplunkInstance" } }
Nun, ich weiß, Sie hätten einfach zu diesem Teil springen und dies in das Dateisystem einfügen und ausführen können, und Sie hätten sich in Frieden mit der Welt gefühlt, seit Sie das Tutorial „abgeschlossen“ haben, aber tun Sie das nicht. Sei nicht so faul. Der Wert, mir die Zeit zu nehmen, mit mir zu lesen und aufzubauen, liegt im Schmerz, Fehler zu machen, und in der Freude, diese Fehler zu beheben.
Alles in allem sollten wir ein Terraform-Skript haben, das so aussieht:
provider "aws" { region = "us-west-1" } data "aws_ami" "splunk" { most_recent = true filter { name = "name" values = ["splunk*"] } } resource "aws_security_group" "splunksg" { name = "SplunkSecGroup" description = "Allow-on-port-8000" ingress { from_port = 8000 to_port = 8000 protocol = "tcp" cidr_blocks = ["YOUR_PUBLIC_HERE/32"] # Replace 'YOUR_PUBLIC_HERE' with your public IP address } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } } resource "aws_instance" "splunk_ec2" { ami = data.aws_ami.splunk.id instance_type = "t2.medium" security_groups = [aws_security_group.splunksg.name] tags = { Name = "SplunkInstance" } }
Wow, schau dir das an, 43 Zeilen Code! Das hört sich nach viel an, aber Sie sind damit fertig – Sie können es aktualisieren, etwas damit erstellen, zerstören oder teilen!
Da wir zu diesem Zeitpunkt in Teil 2 von Unlocking IaC bereits alle erforderlichen Teile eingerichtet haben, damit dies funktioniert, müssen Sie die Datei nur mit der richtigen Erweiterung speichern (verwenden wir main.tf).
Öffnen Sie CMD oder PowerShell als Administrator (STRG+UMSCHALT+KLICK oder Rechtsklick und „Ausführen als…“), „CD“ oder ändern Sie das Verzeichnis in den gleichen Speicherort wie die gerade erstellte Datei (main.tf) und geben Sie Folgendes ein Befehle:
c:\Users\Chris\Documents\Projects\terraform\YT single server arch AWS>terraform init Initializing the backend... Initializing provider plugins... - Reusing previous version of hashicorp/aws from the dependency lock file - Using previously-installed hashicorp/aws v5.1.0 Terraform has been successfully initialized! You may now begin working with Terraform. Try running "terraform plan" to see any changes that are required for your infrastructure. All Terraform commands should now work. If you ever set or change modules or backend configuration for Terraform, rerun this command to reinitialize your working directory. If you forget, other commands will detect it and remind you to do so if necessary.
Terraform init
initialisiert Terraform in diesem Verzeichnis. Dies ist im Wesentlichen der Start von Terraform.
c:\Users\Chris\Documents\Projects\terraform\YT single server arch AWS>terraform plan 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.splunk_server will be created + resource "aws_instance" "splunk_server" { + ami = "ami-0b5cb59327b8d7e1f" + arn = (known after apply) + associate_public_ip_address = true + availability_zone = (known after apply) + cpu_core_count = (known after apply) + cpu_threads_per_core = (known after apply) + disable_api_stop = (known after apply) + disable_api_termination = (known after apply) + ebs_optimized = (known after apply) + get_password_data = false + host_id = (known after apply) + host_resource_group_arn = (known after apply) + iam_instance_profile = (known after apply) + id = (known after apply) + instance_initiated_shutdown_behavior = (known after apply) + instance_state = (known after apply) + instance_type = "t3.large" + ipv6_address_count = (known after apply) + ipv6_addresses = (known after apply) + key_name = (known after apply) + monitoring = (known after apply) + outpost_arn = (known after apply) + password_data = (known after apply) + placement_group = (known after apply) + placement_partition_number = (known after apply) + primary_network_interface_id = (known after apply) + private_dns = (known after apply) + private_ip = (known after apply) + public_dns = (known after apply) + public_ip = (known after apply) + secondary_private_ips = (known after apply) + security_groups = (known after apply) + source_dest_check = true + subnet_id = (known after apply) + tags_all = (known after apply) + tenancy = (known after apply) + user_data = (known after apply) + user_data_base64 = (known after apply) + user_data_replace_on_change = false + vpc_security_group_ids = (known after apply) + capacity_reservation_specification { + capacity_reservation_preference = (known after apply) + capacity_reservation_target { + capacity_reservation_id = (known after apply) + capacity_reservation_resource_group_arn = (known after apply) } } + cpu_options { + amd_sev_snp = (known after apply) + core_count = (known after apply) + threads_per_core = (known after apply) } + ebs_block_device { + delete_on_termination = (known after apply) + device_name = (known after apply) + encrypted = (known after apply) + iops = (known after apply) + kms_key_id = (known after apply) + snapshot_id = (known after apply) + tags = (known after apply) + throughput = (known after apply) + volume_id = (known after apply) + volume_size = (known after apply) + volume_type = (known after apply) } + enclave_options { + enabled = (known after apply) } + ephemeral_block_device { + device_name = (known after apply) + no_device = (known after apply) + virtual_name = (known after apply) } + maintenance_options { + auto_recovery = (known after apply) } + metadata_options { + http_endpoint = (known after apply) + http_put_response_hop_limit = (known after apply) + http_tokens = (known after apply) + instance_metadata_tags = (known after apply) } + network_interface { + delete_on_termination = (known after apply) + device_index = (known after apply) + network_card_index = (known after apply) + network_interface_id = (known after apply) } + private_dns_name_options { + enable_resource_name_dns_a_record = (known after apply) + enable_resource_name_dns_aaaa_record = (known after apply) + hostname_type = (known after apply) } + root_block_device { + delete_on_termination = (known after apply) + device_name = (known after apply) + encrypted = (known after apply) + iops = (known after apply) + kms_key_id = (known after apply) + tags = (known after apply) + throughput = (known after apply) + volume_id = (known after apply) + volume_size = (known after apply) + volume_type = (known after apply) } } # aws_security_group.splunk_server will be created + resource "aws_security_group" "splunk_server" { + arn = (known after apply) + description = "Managed by Terraform" + egress = (known after apply) + id = (known after apply) + ingress = [ + { + cidr_blocks = [ + "[redacted]/32", ] + description = "" + from_port = 22 + ipv6_cidr_blocks = [] + prefix_list_ids = [] + protocol = "tcp" + security_groups = [] + self = false + to_port = 22 }, + { + cidr_blocks = [ + "[redacted]/32", ] + description = "" + from_port = 8000 + ipv6_cidr_blocks = [] + prefix_list_ids = [] + protocol = "tcp" + security_groups = [] + self = false + to_port = 8000 }, ] + name = (known after apply) + name_prefix = "splunk-group" + owner_id = (known after apply) + revoke_rules_on_delete = false + tags_all = (known after apply) + vpc_id = (known after apply) } # aws_subnet.splunk_server will be created + resource "aws_subnet" "splunk_server" { + arn = (known after apply) + assign_ipv6_address_on_creation = false + availability_zone = (known after apply) + availability_zone_id = (known after apply) + cidr_block = "172.31.1.0/28" + enable_dns64 = false + enable_resource_name_dns_a_record_on_launch = false + enable_resource_name_dns_aaaa_record_on_launch = false + id = (known after apply) + ipv6_cidr_block_association_id = (known after apply) + ipv6_native = false + map_public_ip_on_launch = false + owner_id = (known after apply) + private_dns_hostname_type_on_launch = (known after apply) + tags_all = (known after apply) + vpc_id = "vpc-[redacted]" } Plan: 3 to add, 0 to change, 0 to destroy. ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now. c:\Users\Chris\Documents\Projects\terraform\YT single server arch AWS>
Sobald dies abgeschlossen ist, ist es eine gute Idee, terraform plan
auszuführen. Dies ist eine Methode, um zu sehen, was Ihr Terraform-Build tun wird, ohne tatsächlich Änderungen an Ihrer Cloud-Umgebung vorzunehmen. Überprüfen Sie diese Ausgabe sorgfältig und stellen Sie sicher, dass das, was Sie sehen, Ihren Erwartungen entspricht.
c:\Users\Chris\Documents\Projects\terraform\YT single server arch AWS>terraform apply 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.splunk_server will be created + resource "aws_instance" "splunk_server" { + ami = "ami-0b5cb59327b8d7e1f" + arn = (known after apply) + associate_public_ip_address = true + availability_zone = (known after apply) + cpu_core_count = (known after apply) + cpu_threads_per_core = (known after apply) + disable_api_stop = (known after apply) + disable_api_termination = (known after apply) + ebs_optimized = (known after apply) + get_password_data = false + host_id = (known after apply) + host_resource_group_arn = (known after apply) + iam_instance_profile = (known after apply) + id = (known after apply) + instance_initiated_shutdown_behavior = (known after apply) + instance_state = (known after apply) + instance_type = "t3.large" + ipv6_address_count = (known after apply) + ipv6_addresses = (known after apply) + key_name = (known after apply) + monitoring = (known after apply) + outpost_arn = (known after apply) + password_data = (known after apply) + placement_group = (known after apply) + placement_partition_number = (known after apply) + primary_network_interface_id = (known after apply) + private_dns = (known after apply) + private_ip = (known after apply) + public_dns = (known after apply) + public_ip = (known after apply) + secondary_private_ips = (known after apply) + security_groups = (known after apply) + source_dest_check = true + subnet_id = (known after apply) + tags_all = (known after apply) + tenancy = (known after apply) + user_data = (known after apply) + user_data_base64 = (known after apply) + user_data_replace_on_change = false + vpc_security_group_ids = (known after apply) + capacity_reservation_specification { + capacity_reservation_preference = (known after apply) + capacity_reservation_target { + capacity_reservation_id = (known after apply) + capacity_reservation_resource_group_arn = (known after apply) } } + cpu_options { + amd_sev_snp = (known after apply) + core_count = (known after apply) + threads_per_core = (known after apply) } + ebs_block_device { + delete_on_termination = (known after apply) + device_name = (known after apply) + encrypted = (known after apply) + iops = (known after apply) + kms_key_id = (known after apply) + snapshot_id = (known after apply) + tags = (known after apply) + throughput = (known after apply) + volume_id = (known after apply) + volume_size = (known after apply) + volume_type = (known after apply) } + enclave_options { + enabled = (known after apply) } + ephemeral_block_device { + device_name = (known after apply) + no_device = (known after apply) + virtual_name = (known after apply) } + maintenance_options { + auto_recovery = (known after apply) } + metadata_options { + http_endpoint = (known after apply) + http_put_response_hop_limit = (known after apply) + http_tokens = (known after apply) + instance_metadata_tags = (known after apply) } + network_interface { + delete_on_termination = (known after apply) + device_index = (known after apply) + network_card_index = (known after apply) + network_interface_id = (known after apply) } + private_dns_name_options { + enable_resource_name_dns_a_record = (known after apply) + enable_resource_name_dns_aaaa_record = (known after apply) + hostname_type = (known after apply) } + root_block_device { + delete_on_termination = (known after apply) + device_name = (known after apply) + encrypted = (known after apply) + iops = (known after apply) + kms_key_id = (known after apply) + tags = (known after apply) + throughput = (known after apply) + volume_id = (known after apply) + volume_size = (known after apply) + volume_type = (known after apply) } } # aws_security_group.splunk_server will be created + resource "aws_security_group" "splunk_server" { + arn = (known after apply) + description = "Managed by Terraform" + egress = (known after apply) + id = (known after apply) + ingress = [ + { + cidr_blocks = [ + "[redacted]/32", ] + description = "" + from_port = 22 + ipv6_cidr_blocks = [] + prefix_list_ids = [] + protocol = "tcp" + security_groups = [] + self = false + to_port = 22 }, + { + cidr_blocks = [ + "[redacted]/32", ] + description = "" + from_port = 8000 + ipv6_cidr_blocks = [] + prefix_list_ids = [] + protocol = "tcp" + security_groups = [] + self = false + to_port = 8000 }, ] + name = (known after apply) + name_prefix = "splunk-group" + owner_id = (known after apply) + revoke_rules_on_delete = false + tags_all = (known after apply) + vpc_id = (known after apply) } # aws_subnet.splunk_server will be created + resource "aws_subnet" "splunk_server" { + arn = (known after apply) + assign_ipv6_address_on_creation = false + availability_zone = (known after apply) + availability_zone_id = (known after apply) + cidr_block = "172.31.1.0/28" + enable_dns64 = false + enable_resource_name_dns_a_record_on_launch = false + enable_resource_name_dns_aaaa_record_on_launch = false + id = (known after apply) + ipv6_cidr_block_association_id = (known after apply) + ipv6_native = false + map_public_ip_on_launch = false + owner_id = (known after apply) + private_dns_hostname_type_on_launch = (known after apply) + tags_all = (known after apply) + vpc_id = "vpc-[redacted]" } Plan: 3 to add, 0 to change, 0 to destroy. Changes to Outputs: + splunk_server_public_ip = (known after apply) Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value: yes aws_subnet.splunk_server: Creating... aws_security_group.splunk_server: Creating... aws_subnet.splunk_server: Creation complete after 1s [id=subnet-053c39ae3dcc97112] aws_security_group.splunk_server: Creation complete after 2s [id=sg-03bf97ed2524e4aee] aws_instance.splunk_server: Creating... aws_instance.splunk_server: Still creating... [10s elapsed] aws_instance.splunk_server: Creation complete after 13s [id=i-050c4bad2d2a6ba93] Apply complete! Resources: 3 added, 0 changed, 0 destroyed. c:\Users\Chris\Documents\Projects\terraform\YT single server arch AWS>
Schließlich übernimmt die Ausführung terraform apply
den Code und wendet ihn auf Ihr AWS-Konto an. Dies kann einige Sekunden bis zu einer Minute dauern. Sobald der Vorgang abgeschlossen ist, sollten Sie jedoch eine Erfolgsmeldung erhalten. Wenn Sie Fehler erhalten, überprüfen Sie den Fehler sorgfältig. Terraform-Fehler sind in der Regel von hoher Qualität und liefern Hinweise, für deren Verständnis nicht viel (wenn überhaupt) Recherche erforderlich ist.
Zu diesem Zeitpunkt ist Ihr Splunk-Server wahrscheinlich bereit für die Anmeldung (es dauert ein oder zwei Minuten, bis die Benutzeroberfläche auf Splunk verfügbar ist). Um sich bei Splunk anzumelden, benötigen Sie drei Informationen:
admin
istSPLUNK-<instanceid>
sein wirdhttp://10.10.10.10:8000
)
Es ist zwar möglich, die IP-Adresse aus Terraform zu extrahieren und sie Ihnen als AUSGABE des Skripts zu liefern oder die AWS CLI zum Sammeln dieser Informationen zu verwenden, wir haben dies der Einfachheit halber hier jedoch nicht getan. Um Ihre IP-Adresse und die Instanz-ID zu erhalten, müssen Sie sich bei Ihrer AWS-Konsole anmelden.
Suchen Sie im Menü „Dienste“ nach „EC2“, klicken Sie dann auf „EC2“ und dann auf „Instanzen (laufend)“. In dieser Ansicht sehen Sie eine Liste der laufenden EC2-Instanzen, die nur eine sein sollte, es sei denn, Sie haben andere interessante Dinge am Laufen.
Klicken Sie auf die richtige Instanz (oder die einzige), und in dieser Ansicht sehen Sie oben links „Instanz-ID“, die durch Klicken auf die Schaltfläche „Kopieren“ links kopiert werden kann, und rechts sehen Sie Ihre IP Adresse.
Nehmen Sie diese IP-Adresse und geben Sie mit dem Browser Ihrer Wahl http://[instanceIP]:8000
ein und drücken Sie dann die Eingabetaste. Sie sollten die Splunk-Anmeldung sehen – wenn nicht, warten Sie noch ein oder zwei Minuten – Splunk benötigt (im wahrsten Sinne des Wortes) 2-3 Minuten, um das erste Mal zu starten. Merken Sie sich den username = admin
und das password = SPLUNK-[instanceID]
.
Das Bauen ist großartig, und das Erlernen neuer Dinge macht Spaß. Wenn man mit dem Spaß fertig ist, zu vergessen, die Cloud-Ressourcen auszuschalten, ist scheiße. Terraform Destroy führt das Gegenteil von Terraform Apply aus. Es zerstört die in der Terraform-Datei angegebene Infrastruktur. Um Terraform Destroy zu verwenden, was Sie jetzt tun sollten, gehen Sie zurück zu Ihrer Befehlszeile und geben Sie terraform destroy
ein. Ein erfolgreicher Lauf von Terraform Destroy wird durch das Fehlen der Splunk-Benutzeroberfläche (es wird Ihnen wahrscheinlich mitteilen, dass die Verbindung getrennt wurde) und auch durch die Ausgabe des Destroy-Befehls angezeigt.
c:\Users\Chris\Documents\Projects\terraform\YT single server arch AWS>terraform destroy aws_subnet.splunk_server: Refreshing state... [id=subnet-053c39ae3dcc97112] aws_security_group.splunk_server: Refreshing state... [id=sg-03bf97ed2524e4aee] aws_instance.splunk_server: Refreshing state... [id=i-050c4bad2d2a6ba93] Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: - destroy Terraform will perform the following actions: # aws_instance.splunk_server will be destroyed - resource "aws_instance" "splunk_server" { - ami = "ami-0b5cb59327b8d7e1f" -> null - arn = "arn:aws:ec2:us-west-2:625982356191:instance/i-050c4bad2d2a6ba93" -> null - associate_public_ip_address = true -> null - availability_zone = "us-west-2b" -> null - cpu_core_count = 1 -> null - cpu_threads_per_core = 2 -> null - disable_api_stop = false -> null - disable_api_termination = false -> null - ebs_optimized = false -> null - get_password_data = false -> null - hibernation = false -> null - id = "i-050c4bad2d2a6ba93" -> null - instance_initiated_shutdown_behavior = "stop" -> null - instance_state = "running" -> null - instance_type = "t3.large" -> null - ipv6_address_count = 0 -> null - ipv6_addresses = [] -> null - monitoring = false -> null - placement_partition_number = 0 -> null - primary_network_interface_id = "eni-059f68aecb53fc4bb" -> null - private_dns = "ip-172-31-1-11.us-west-2.compute.internal" -> null - private_ip = "172.31.1.11" -> null - public_dns = "[redacted].us-west-2.compute.amazonaws.com" -> null - public_ip = "[redacted]" -> null - secondary_private_ips = [] -> null - security_groups = [ - "splunk-group20230929124520702900000001", ] -> null - source_dest_check = true -> null - subnet_id = "subnet-053c39ae3dcc97112" -> null - tags = {} -> null - tags_all = {} -> null - tenancy = "default" -> null - user_data_replace_on_change = false -> null - vpc_security_group_ids = [ - "sg-03bf97ed2524e4aee", ] -> null - capacity_reservation_specification { - capacity_reservation_preference = "open" -> null } - cpu_options { - core_count = 1 -> null - threads_per_core = 2 -> null } - credit_specification { - cpu_credits = "unlimited" -> null } - enclave_options { - enabled = false -> null } - maintenance_options { - auto_recovery = "default" -> null } - metadata_options { - http_endpoint = "enabled" -> null - http_put_response_hop_limit = 1 -> null - http_tokens = "optional" -> null - instance_metadata_tags = "disabled" -> null } - private_dns_name_options { - enable_resource_name_dns_a_record = false -> null - enable_resource_name_dns_aaaa_record = false -> null - hostname_type = "ip-name" -> null } - root_block_device { - delete_on_termination = true -> null - device_name = "/dev/xvda" -> null - encrypted = false -> null - iops = 100 -> null - tags = {} -> null - throughput = 0 -> null - volume_id = "vol-0e283fb892f5fe38a" -> null - volume_size = 20 -> null - volume_type = "gp2" -> null } } # aws_security_group.splunk_server will be destroyed - resource "aws_security_group" "splunk_server" { - arn = "arn:aws:ec2:us-west-2:625982356191:security-group/sg-03bf97ed2524e4aee" -> null - description = "Managed by Terraform" -> null - egress = [] -> null - id = "sg-03bf97ed2524e4aee" -> null - ingress = [ - { - cidr_blocks = [ - "[redacted]/32", ] - description = "" - from_port = 22 - ipv6_cidr_blocks = [] - prefix_list_ids = [] - protocol = "tcp" - security_groups = [] - self = false - to_port = 22 }, - { - cidr_blocks = [ - "[redacted]/32", ] - description = "" - from_port = 8000 - ipv6_cidr_blocks = [] - prefix_list_ids = [] - protocol = "tcp" - security_groups = [] - self = false - to_port = 8000 }, ] -> null - name = "splunk-group20230929124520702900000001" -> null - name_prefix = "splunk-group" -> null - owner_id = "625982356191" -> null - revoke_rules_on_delete = false -> null - tags = {} -> null - tags_all = {} -> null - vpc_id = "vpc-002c2876364b2b282" -> null } # aws_subnet.splunk_server will be destroyed - resource "aws_subnet" "splunk_server" { - arn = "arn:aws:ec2:us-west-2:625982356191:subnet/subnet-053c39ae3dcc97112" -> null - assign_ipv6_address_on_creation = false -> null - availability_zone = "us-west-2b" -> null - availability_zone_id = "usw2-az1" -> null - cidr_block = "172.31.1.0/28" -> null - enable_dns64 = false -> null - enable_lni_at_device_index = 0 -> null - enable_resource_name_dns_a_record_on_launch = false -> null - enable_resource_name_dns_aaaa_record_on_launch = false -> null - id = "subnet-053c39ae3dcc97112" -> null - ipv6_native = false -> null - map_customer_owned_ip_on_launch = false -> null - map_public_ip_on_launch = false -> null - owner_id = "625982356191" -> null - private_dns_hostname_type_on_launch = "ip-name" -> null - tags = {} -> null - tags_all = {} -> null - vpc_id = "vpc-002c2876364b2b282" -> null } Plan: 0 to add, 0 to change, 3 to destroy. Do you really want to destroy all resources? Terraform will destroy all your managed infrastructure, as shown above. There is no undo. Only 'yes' will be accepted to confirm. Enter a value: yes aws_instance.splunk_server: Destroying... [id=i-050c4bad2d2a6ba93] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 10s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 20s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 30s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 40s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 51s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 1m1s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 1m11s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 1m21s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 1m31s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 1m41s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 1m51s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 2m1s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 2m11s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 2m21s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 2m31s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 2m41s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 2m51s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 3m1s elapsed] aws_instance.splunk_server: Still destroying... [id=i-050c4bad2d2a6ba93, 3m11s elapsed] aws_instance.splunk_server: Destruction complete after 3m14s aws_subnet.splunk_server: Destroying... [id=subnet-053c39ae3dcc97112] aws_security_group.splunk_server: Destroying... [id=sg-03bf97ed2524e4aee] aws_subnet.splunk_server: Destruction complete after 0s aws_security_group.splunk_server: Destruction complete after 0s Destroy complete! Resources: 3 destroyed. c:\Users\Chris\Documents\Projects\terraform\YT single server arch AWS>
Es ist nicht einfach, es bis zum Ende eines solchen Monster-Tutorials zu schaffen. Herzlichen Glückwunsch, wenn Sie es bis hierher geschafft haben! Wenn ich etwas verpasst habe, was wahrscheinlich ist, tut mir leid! An dieser Stelle lohnt es sich, weiter mit dieser neu entdeckten Fähigkeit zu spielen – ändern Sie Ihr Terraform-Skript und fügen Sie der EC2-Instanz ein EBS-Volume für zusätzlichen Speicher hinzu. Fügen Sie S3 für die Langzeitspeicherung hinzu. Finden Sie heraus, wie Sie der VM automatisch ein SSH-Schlüsselpaar hinzufügen, damit Sie per SSH darauf zugreifen und die Benutzeroberfläche verwenden können. Die Hauptsache ist, jeden Tag damit herumzuspielen, auch nur ein bisschen.
Der Moment, in dem Sie aufhören, ist der Moment, in dem Sie beginnen, diese Fähigkeit langsam zu verlieren.