Seamos realistas: una serie de tres partes sobre algo técnico como IaC puede ser un desafío. Estoy seguro de que ya te habrás apartado de esto varias veces. Llegar a la parte 3 es emocionante: es cuando comienza la parte divertida. Es el momento en que la goma toca el camino. Si sientes que apenas puedes aguantar y dudas de poder terminar esta parte, probablemente sea bueno saber que la mayoría de las personas también se sienten así. Muy pocos se meten en algo tan abstracto como esto y lo logran en el primer (o tercer) intento. ¡Vamos a ir al grano!
Para esta primera implementación, usemos algo que todos conocemos por nombre, Splunk. En este script, implementaremos un único servidor que ya tiene Splunk instalado y configurado. Esto utilizará una imagen de máquina de Amazon (AMI). Hay muchas AMI para elegir. Algunos son sistemas operativos diferentes, como Windows o Linux; algunas son diferentes distribuciones de Linux, como Ubuntu, CentOS, etc., y otras son aplicaciones prediseñadas como esta.
Activaremos el servidor Splunk EC2 (la "instancia de Splunk"), crearemos acceso a la red para permitir que solo su dirección IP pública llegue a él en el puerto TCP 8000 (el puerto de interfaz de usuario predeterminado de Splunk) y luego destruiremos todo esto con un simple Terraform. comando cuando hayamos terminado.
Dividiré el único archivo terraform (main.tf) en unos cuantos fragmentos pequeños para que podamos recorrer cada parte más fácilmente. Luego, al final, lo juntaré todo para que podamos ejecutarlo.
Antes de comenzar, es importante que sepa dónde puede acudir para encontrar respuestas a preguntas que no he considerado aquí. Como ejemplo, cuando comencé a construir en Terraform, me pregunté: "¿Cómo sé qué argumentos (así es como se definen los recursos, como el tipo de máquina virtual en una instancia EC2 o los protocolos de ingreso permitidos en un grupo de seguridad)?" En este ejemplo, y para MUCHAS otras preguntas que no se responden aquí, puede ir al registro de Terraform para obtener más información sobre los proveedores, recursos, argumentos y sintaxis disponibles.
Por ejemplo, en el registro, puedo ir y buscar el recurso "Grupo de seguridad" (que usaremos en este tutorial), luego ir a la pestaña Entradas para ver todos los argumentos disponibles (los llaman variables, para su información) que serán permitido cuando configuramos el recurso. Bien... ¡desvío completo, hacia la configuración de su primera implementación de TF!
Primer paso, debemos definir el proveedor que querremos utilizar. Estamos trabajando en AWS, por lo que el proveedor será "AWS". También definiremos aquí la región que queremos trabajar.
provider "aws" { region = "us-west-1" }
Si recuerdas, dije que íbamos a usar una Amazing Machine Image (AMI) para una máquina virtual (EC2). Aquí, utilizamos la palabra clave "datos" de Terraform para buscar el recurso "aws_ami". Además, le damos a los datos que se devuelven como parte de esta búsqueda un nombre: "Splunk". Esto es para que podamos hacer referencia a estos datos en otras partes de nuestro código (tenga esto en cuenta más adelante)...
Dado que buscar cualquier cosa requiere alguna forma de limitar los resultados de la búsqueda solo a lo que queremos encontrar, usamos la palabra clave de filtro y luego le pasamos dos argumentos, "nombre" y "valores". Aquí, indicamos a la búsqueda de "aws_ami" que busque en el campo "nombre" cualquier cosa que comience con "Splunk". Si bien es posible que sea necesario ajustar esto para que sea más específico, en este caso, este filtro es bueno.
data "aws_ami" "splunk" { most_recent = true filter { name = "name" values = ["splunk*"] } }
En AWS, el acceso de la red a los recursos suele controlarse a través de un recurso llamado " Grupo de seguridad ". En nuestro ejemplo, usaremos un grupo de seguridad que permite la entrada al puerto TCP 8000 ("ingreso") desde mi dirección IP (o la suya, cuando cree este script). Debido a que estamos usando Splunk en una cuenta privada con información no confidencial, Le permitiré comunicarse saliente ("salida"). Sin embargo, si se tratara de un entorno de producción, necesitaría identificar los rangos de IP y puertos necesarios y restringir el acceso solo a ellos para seguir las mejores prácticas.
Observe que defino los parámetros de ingreso, incluido el protocolo y "cidr_blocks". Esto es importante, ya que las configuraciones incorrectas aquí pueden abrir un entorno accidentalmente a Internet en general. Si está interesado en obtener información sobre cómo proporcionar seguridad de red adicional para su entorno de AWS, hágamelo saber: puedo crear un tutorial sobre cómo agregar un balanceador de carga de aplicaciones ( ALB) a esta configuración para proporcionar funciones de seguridad adicionales.
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"] } }
Finalmente, la razón por la que todos estamos aquí: la máquina virtual que ejecutará Splunk. Como es el caso con todas las demás partes del código de Terraform, comenzamos definiendo un recurso, en este caso, "aws_instance", y lo nombramos "splunk_ec2", luego definimos otros parámetros debajo de él usando argumentos.
¿Recuerda la palabra clave "datos" que utilizamos anteriormente para buscar en "aws_ami" la AMI "Splunk*" más reciente? Tenemos el nombre "Splunk". Aquí, en la configuración de la instancia EC2, podemos hacer referencia a los datos contenidos en esa consulta. Hacemos referencia a él usando el argumento "ami" y diciendo que es igual a lo que hay en "data.aws_ami.splunk.id". Este es un concepto realmente importante de entender, así que dediquemos dos minutos a desglosarlo:
Bajando, decimos que el grupo de seguridad para este EC2 es el grupo de seguridad "splunksg" que definimos anteriormente. Esto utiliza la misma lógica que la denominación de "datos" de AMI. Es decir, comienza con el nombre del recurso, el nombre del objeto que definimos y luego la variable ".name", que también definimos como " SplunkSecGroup ". También tenga en cuenta que puede usar el tipo de instancia de t2.micro para esto, y funciona, es muy lento, así que opto por un t2.medium.
Por último, aplicamos etiquetas a esta instancia, lo cual resulta útil cuando una cuenta de AWS crece y realizar un seguimiento de los activos se vuelve más difícil.
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" } }
Ahora, sé que podrías haber saltado esta parte y haberlo insertado en el sistema de archivos y ejecutarlo y sentirte en paz con el mundo desde que "completaste" el tutorial, pero no hagas eso. No seas tan vago. El valor de tomarse el tiempo para leer y construir conmigo está en el dolor de cometer errores y en la alegría de corregirlos.
Poniéndolo todo junto, deberíamos tener un script de Terraform similar a este:
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" } }
¡Vaya, mira eso, 43 líneas de código! Parece mucho, pero ya terminaste: ¡puedes actualizarlo, crear con él, destruirlo o compartirlo!
Debido a que ya hemos configurado todas las piezas necesarias para que esto funcione en la Parte 2 de Desbloqueo de IaC en este punto, todo lo que se necesita es guardar el archivo con la extensión correcta (usemos main.tf).
Abra CMD o PowerShell como administrador (CTRL+MAYÚS+CLIC o haga clic derecho y "ejecutar como..."), "CD" o cambie el directorio a la misma ubicación que el archivo que acabamos de crear (main.tf) y ejecute lo siguiente comandos:
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
inicializa Terraform en ese directorio. Básicamente, esto es iniciar 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>
Una vez completado, es una buena idea ejecutar terraform plan
, que es un método para ver qué hará su compilación de Terraform sin realizar ningún cambio en su entorno de nube. Revise detenidamente este resultado y asegúrese de que lo que ve coincida con lo que espera.
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>
Finalmente, ejecutar terraform apply
toma el código y lo aplica a su cuenta de AWS. Esto puede tardar desde unos segundos hasta un minuto, pero deberías recibir un mensaje de éxito una vez que esté hecho. Si recibe algún error, revíselo cuidadosamente. Los errores de Terraform suelen ser de alta calidad y darán pistas que no requieren mucha (si es que hay alguna) investigación para comprenderlas.
En este punto, su servidor Splunk probablemente esté listo para iniciar sesión (la interfaz de usuario tarda uno o dos minutos en estar disponible en Splunk). Para iniciar sesión en Splunk, necesitará tres datos:
admin
SPLUNK-<instanceid>
http://10.10.10.10:8000
).
Si bien es posible extraer la dirección IP de Terraform y recibirla como SALIDA del script o utilizar la CLI de AWS para recopilar esta información, no lo hicimos aquí por razones de simplicidad. Para obtener su dirección IP y el ID de la instancia, deberá iniciar sesión en su consola de AWS.
Busque EC2 en el menú de servicios, luego haga clic en EC2 y luego haga clic en Instancias (en ejecución). En esta vista, verá una lista de instancias EC2 en ejecución, que debería ser solo una a menos que tenga otras cosas divertidas en marcha.
Haga clic en la instancia correcta (o en la única) y, en esta vista, verá en la parte superior izquierda el "ID de instancia", que se puede copiar haciendo clic en el botón copiar a la izquierda, y a la derecha, verá su Dirección IP.
Tome esa dirección IP y, usando el navegador de su elección, escriba http://[instanceIP]:8000
y luego presione Enter. Debería ver el inicio de sesión de Splunk. Si no lo ve, espere uno o dos minutos más. Splunk tarda (literalmente) entre 2 y 3 minutos en iniciarse la primera vez. Recuerde el username = admin
y la password = SPLUNK-[instanceID]
.
Construir es genial y aprender cosas nuevas es divertido; olvidarse de apagar los recursos de la nube cuando terminas de divertirte apesta. La destrucción de Terraform realiza lo contrario de la aplicación de Terraform. Derriba la infraestructura especificada en el archivo terraform. Para usar terraform destroy, lo cual deberías hacer ahora mismo, regresa a tu línea de comando e ingresa terraform destroy
. Una ejecución exitosa de terraform destroy se notará por la falta de la interfaz de usuario de Splunk (probablemente le notificará que está desconectada) y también por la salida del comando de destrucción.
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>
Llegar al final de un tutorial de monstruos como este no es fácil. ¡Felicidades si llegaste hasta aquí! Si me perdí algo, lo cual es probable, ¡lo siento! En este punto, valdría la pena seguir jugando con esta nueva habilidad: cambie su script de terraform y agregue un volumen de EBS a la instancia EC2 para almacenamiento adicional. Agregue S3 para almacenamiento a largo plazo. Descubra cómo agregar automáticamente un par de claves SSH a la máquina virtual para que pueda ingresar mediante SSH y usar la interfaz de usuario. Lo principal es seguir jugando con esto todos los días, aunque sea un poquito.
El momento en que te detienes es el momento en que comienzas a perder esta habilidad lentamente.