paint-brush
Déverrouillage d'IaC, partie 3 : votre premier déploiement Terraform !par@chrisray
548 lectures
548 lectures

Déverrouillage d'IaC, partie 3 : votre premier déploiement Terraform !

par Chris Ray55m2023/09/30
Read on Terminal Reader

Trop long; Pour lire

Obtenir la configuration pour construire avec Terraform est difficile ! Dans la troisième partie, nous nous mettons au travail et construisons un serveur Splunk dans AWS à l'aide de Terraform.
featured image - Déverrouillage d'IaC, partie 3 : votre premier déploiement Terraform !
Chris Ray HackerNoon profile picture
0-item


Amusons-nous!

Soyons réalistes : une série en 3 parties sur quelque chose de technique comme IaC peut être un défi. Je suis sûr que vous en avez déjà été éloigné plusieurs fois. Arriver à la partie 3 est passionnant – c’est là que la partie amusante commence. C'est le moment où le caoutchouc prend la route. Si vous avez l'impression de vous accrocher à peine et que vous doutez de pouvoir terminer cette partie, il est probablement bon de savoir que la plupart des gens ressentent cela aussi. Très peu de gens se lancent dans quelque chose d'aussi abstrait que celui-ci et réussissent du premier coup (ou du troisième). Nous allons passer aux choses sérieuses!

Pour ce premier déploiement, utilisons quelque chose que nous connaissons tous par son nom, Splunk. Dans ce script, nous allons déployer un seul serveur sur lequel Splunk est déjà installé et configuré. Cela utilisera une Amazon Machine Image (AMI). Il existe de nombreuses AMI parmi lesquelles choisir. Certains sont des systèmes d'exploitation différents, comme Windows ou Linux ; certaines sont différentes distributions de Linux, comme Ubuntu, CentOS, etc., et certaines sont des applications prédéfinies comme celle-ci.


Nous allons faire tourner le serveur Splunk EC2 (l'« instance Splunk »), créer un accès réseau pour permettre uniquement à votre adresse IP publique de l'atteindre sur le port TCP 8000 (le port par défaut de l'interface utilisateur Splunk), puis détruire tout cela avec un simple Terraform. commande quand nous avons fini.


Je vais diviser le fichier Terraform unique (main.tf) en quelques petits morceaux afin que nous puissions parcourir plus facilement chaque partie. Puis, à la fin, je rassemblerai tout cela pour que nous puissions l’exécuter.

Comment comprendre les choses par vous-même dans Terraform Land

Avant de commencer, il est important que vous sachiez où trouver des réponses aux questions que je n’ai pas abordées ici. À titre d'exemple, lorsque j'ai commencé à créer dans Terraform, je me suis demandé : « Comment savoir quels arguments (c'est ainsi que vous définissez les ressources, comme le type de machine virtuelle dans une instance EC2 ou les protocoles d'entrée autorisés dans un groupe de sécurité) Dans cet exemple, et pour de NOMBREUSES autres questions auxquelles nous n'avons pas répondu ici, vous pouvez accéder au registre Terraform pour en savoir plus sur les fournisseurs, les ressources, les arguments et la syntaxe disponibles.


Par exemple, dans le registre, je peux aller chercher la ressource "Groupe de sécurité" (que nous utiliserons dans ce tutoriel), puis aller dans l' onglet Entrées pour voir tous les arguments disponibles (ils les appellent variables, pour info) qui seront autorisé lorsque nous configurons la ressource. Bon...détour effectué, sur la config de votre premier déploiement TF !

Construire avec Terraform

Première étape, nous devons définir le fournisseur que nous souhaiterons utiliser. Nous travaillons sur AWS, le fournisseur sera donc « AWS ». Nous définirons également la région que nous souhaitons travailler ici également.


 provider "aws" { region = "us-west-1" }


Si vous vous en souvenez, j'ai dit que nous allions utiliser une Amazing Machine Image (AMI) pour une machine virtuelle (EC2). Ici, nous utilisons le mot-clé Terraform « data » pour rechercher la ressource « aws_ami ». De plus, nous attribuons un nom à toutes les données renvoyées dans le cadre de cette recherche : "Splunk." Ceci afin que nous puissions référencer ces données ailleurs dans notre code (gardez cela à l'esprit plus tard)...


Étant donné que toute recherche nécessite un moyen de limiter les résultats de la recherche uniquement à ce que nous voulons trouver, nous utilisons le mot-clé filter puis lui transmettons deux arguments, "nom" et "valeurs". Ici, nous demandons à la recherche de « aws_ami » de rechercher dans le champ « nom » tout ce qui commence par « Splunk ». Bien que cela doive peut-être être réglé pour être plus précis, dans ce cas, ce filtre est bon.


 data "aws_ami" "splunk" { most_recent = true filter { name = "name" values = ["splunk*"] } }


Dans AWS, l'accès réseau aux ressources est souvent contrôlé via une ressource appelée « groupe de sécurité ». Dans notre exemple, nous utiliserons un groupe de sécurité qui autorise le port TCP 8000 entrant ("ingress") depuis mon adresse IP (ou la vôtre, lorsque vous créez ce script). Parce que nous utilisons Splunk dans un compte privé avec des informations non sensibles, Je lui permettrai de communiquer vers l'extérieur ("sortie"). Cependant, s'il s'agissait d'un environnement de production, vous devrez identifier les plages d'adresses IP et de ports nécessaires et restreindre l'accès à celles-ci uniquement pour suivre les meilleures pratiques.


Remarquez que je définis les paramètres d'entrée, y compris le protocole et "cidr_blocks". Ceci est important, car des erreurs de configuration ici peuvent ouvrir accidentellement un environnement à l'Internet plus large. Si vous souhaitez en savoir plus sur la fourniture d'une sécurité réseau supplémentaire pour votre environnement AWS, faites-le moi savoir - je peux créer un didacticiel sur l'ajout d'un équilibreur de charge d'application ( ALB) à cette configuration pour fournir des fonctionnalités de sécurité supplémentaires.


 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"] } }


Enfin, la raison pour laquelle nous sommes tous ici : la machine virtuelle qui exécutera Splunk. Comme c'est le cas pour toutes les autres parties du code Terraform, nous commençons par définir une ressource, dans ce cas, « aws_instance », et la nommons « splunk_ec2 », puis nous définissons d'autres paramètres en dessous à l'aide d'arguments.


Vous vous souvenez du mot-clé « data » que nous avons utilisé ci-dessus pour rechercher dans « aws_ami » l'AMI « Splunk* » la plus récente ? Nous avons le nom "Splunk". Ici, dans la configuration de l'instance EC2, nous pouvons référencer les données contenues dans cette requête. Nous le référençons en utilisant l'argument "ami" et en disant qu'il est égal à tout ce qui se trouve dans "data.aws_ami.splunk.id". C'est un concept très important à comprendre, alors passons deux minutes à le décomposer :


  1. " data.aws_ami. " fait référence au mot-clé data dans le bloc de code que nous avons créé ci-dessus.
  2. " splunk.id " fait référence au nom que nous avons donné à ces données, " Splunk ", tandis que le dernier élément, " id ", fait référence à l'identifiant AMI renvoyé par la requête " data ". L'ID AMI est une chaîne dont les humains ne se souviennent pas facilement, mais qui est unique et facile à utiliser pour les machines.


En descendant, nous disons que le security_group pour cet EC2 est le groupe de sécurité "splunksg" que nous avons défini ci-dessus. Cela utilise la même logique que la dénomination des « données » de l'AMI. IE, cela commence par le nom de la ressource, le nom de l'objet que nous avons défini, puis la variable ".name", que nous avons également définie comme " SplunkSecGroup ". Notez également que vous pouvez utiliser le type d'instance de t2.micro pour cela, et il fonctionne - c'est juste très lent, alors j'opte pour un t2.medium.


Enfin, nous appliquons des balises à cette instance, ce qui est utile lorsqu'un compte AWS se développe et que le suivi des actifs devient plus difficile.


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


Maintenant, je sais que vous auriez pu simplement passer à cette partie et la placer dans le système de fichiers et l'exécuter et vous sentir en paix avec le monde depuis que vous avez "terminé" le didacticiel, mais ne faites pas cela. Ne sois pas si paresseux. La valeur de prendre le temps de lire et de construire avec moi réside dans la douleur de faire des erreurs et dans la joie de corriger ces erreurs.


En mettant tout cela ensemble, nous devrions avoir un script Terraform qui ressemble à ceci :


 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, regardez ça, 43 lignes de code ! Cela semble beaucoup, mais vous en avez terminé : vous pouvez le mettre à jour, créer avec, le détruire ou le partager !


Étant donné que nous avons déjà configuré tous les éléments requis pour que cela fonctionne dans la partie 2 de Unlocking IaC , il suffit de sauvegarder le fichier avec l'extension correcte (utilisons main.tf).


Ouvrez CMD ou PowerShell en tant qu'administrateur (CTRL+MAJ+CLIC ou clic droit et « exécuter en tant que… »), « CD » ou changez le répertoire au même emplacement que le fichier que nous venons de créer (main.tf) et émettez ce qui suit commandes :

INIT Terraform


 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 initialise Terraform dans ce répertoire. Il s’agit essentiellement du démarrage de Terraform.


Plan de terrassement


 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>


Une fois cette opération terminée, c'est une bonne idée d'exécuter terraform plan , qui est une méthode permettant de voir ce que fera votre build Terraform sans réellement apporter de modifications à votre environnement cloud. Examinez attentivement ce résultat et assurez-vous que ce que vous voyez correspond à ce que vous attendez.

Appliquer Terraform


 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>


Enfin, l'exécution terraform apply prend le code et l'applique à votre compte AWS. Cela peut prendre quelques secondes à une minute, mais vous devriez recevoir un message de réussite une fois l'opération terminée. Si vous obtenez des erreurs, examinez-les attentivement. Les erreurs Terraform sont généralement de haute qualité et donneront des indices qui ne nécessitent pas beaucoup (voire aucune) de recherche pour être compris.

Connexion Splunk

À ce stade, votre serveur Splunk est probablement prêt à vous connecter (il faut une minute ou deux pour que l'interface utilisateur soit disponible sur Splunk). Pour vous connecter à Splunk, vous aurez besoin de trois informations :

  1. Le nom d'utilisateur, qui est admin
  2. Le mot de passe, qui sera SPLUNK-<instanceid>
  3. L'adresse IP et le port de cette instance EC2 dans AWS (par exemple http://10.10.10.10:8000 )


Bien qu'il soit possible d'extraire l'adresse IP de Terraform et de vous la faire parvenir en tant que SORTIE du script ou d'utiliser l' AWS CLI pour collecter ces informations, nous ne l'avons pas fait ici par souci de simplicité. Afin d'obtenir votre adresse IP et l'ID d'instance, vous devrez vous connecter à votre console AWS.


Recherchez EC2 dans le menu des services, puis cliquez sur EC2, puis sur Instances (en cours d'exécution). Dans cette vue, vous verrez une liste des instances EC2 en cours d'exécution, qui ne devraient être que celle-là, à moins que vous n'ayez d'autres choses amusantes à faire.

Cliquez sur la bonne instance (ou la seule), et dans cette vue, vous verrez en haut à gauche « ID d'instance », qui peut être copié en cliquant sur le bouton Copier à gauche, et à droite, vous verrez votre Adresse IP.


Prenez cette adresse IP et, à l'aide du navigateur de votre choix, saisissez http://[instanceIP]:8000 puis appuyez sur Entrée. Vous devriez voir la connexion Splunk - si ce n'est pas le cas, attendez encore une minute ou deux - Splunk prend (littéralement) 2 à 3 minutes pour se lancer la première fois. N'oubliez pas le username = admin et le password = SPLUNK-[instanceID] .


Détruire Terraform

Construire, c'est génial, et apprendre de nouvelles choses est amusant - oublier d'éteindre vos ressources cloud lorsque vous avez fini de vous amuser, c'est nul. Terraform destroy effectue l'inverse de l'application terraform. Il détruit l'infrastructure spécifiée dans le fichier Terraform. Pour utiliser terraform destroy, ce que vous devriez faire maintenant, revenez à votre ligne de commande et entrez terraform destroy . Une exécution réussie de Terraform destroy sera notée par l'absence d'interface utilisateur Splunk (elle vous informera probablement qu'elle est déconnectée) et également par le résultat de la commande destroy.


 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>


Arriver à la fin d’un didacticiel de monstre comme celui-ci n’est pas facile. Félicitations si vous êtes arrivé jusqu'ici ! Si j'ai raté quelque chose, ce qui est probable, désolé ! À ce stade, cela vaudrait la peine de continuer à jouer avec cette nouvelle compétence : modifiez votre script Terraform et ajoutez un volume EBS à l'instance EC2 pour un stockage supplémentaire. Ajoutez S3 pour un stockage à long terme. Découvrez comment ajouter automatiquement une paire de clés SSH à la VM afin de pouvoir y accéder en SSH et utiliser l'interface utilisateur. L’essentiel est de continuer à jouer avec ça tous les jours, même un petit peu.


Le moment où vous arrêtez est le moment où vous commencez à perdre lentement cette compétence.