paint-brush
Desbloqueando IaC Parte 3: Sua primeira implantação do Terraform!por@chrisray
548 leituras
548 leituras

Desbloqueando IaC Parte 3: Sua primeira implantação do Terraform!

por Chris Ray55m2023/09/30
Read on Terminal Reader

Muito longo; Para ler

É difícil configurar a construção com o Terraform! Na Parte 3, vamos direto ao assunto e construímos um servidor Splunk na AWS usando Terraform.
featured image - Desbloqueando IaC Parte 3: Sua primeira implantação do Terraform!
Chris Ray HackerNoon profile picture
0-item


Vamos nos divertir!

Vamos ser sinceros: uma série de três partes sobre algo técnico como IaC pode ser um desafio. Tenho certeza de que você já foi afastado disso algumas vezes. Chegar à parte 3 é emocionante – é quando a parte divertida começa. É o momento em que a borracha atinge a estrada. Se você sente que mal consegue aguentar e duvida que conseguirá terminar esta parte, provavelmente é bom saber que a maioria das pessoas também se sente assim. Muito poucos entram em algo tão abstrato como este e acertam na primeira tentativa (ou terceira). Vamos ao que interessa!

Para esta primeira implantação, vamos usar algo que todos conhecemos pelo nome, Splunk. Neste script, iremos implantar um único servidor que já possui o Splunk instalado e configurado. Isso usará uma Amazon Machine Image (AMI). Existem muitas AMIs para escolher. Alguns são sistemas operacionais diferentes, como Windows ou Linux; algumas são distros diferentes do Linux, como Ubuntu, CentOS, etc., e algumas são aplicativos pré-construídos como este.


Vamos ativar o servidor Splunk EC2 (a "instância Splunk"), criar acesso à rede para permitir que apenas seu endereço IP público o alcance na porta TCP 8000 (a porta UI padrão do Splunk) e, em seguida, destruir tudo isso com um simples Terraform comando quando terminarmos.


Vou dividir o arquivo terraform único (main.tf) em alguns pequenos pedaços para que possamos percorrer cada parte com mais facilidade. Depois, no final, vou juntar tudo para podermos executar.

Como descobrir as coisas sozinho no terreno do Terraform

Antes de começarmos, é importante que você saiba onde encontrar respostas para perguntas que não considerei aqui. Por exemplo, quando comecei a construir no Terraform, me perguntei: "Como posso saber quais argumentos (é assim que você define os recursos, como o tipo de máquina virtual em uma instância EC2 ou os protocolos de entrada permitidos em um grupo de segurança) Neste exemplo, e para MUITAS outras perguntas não respondidas aqui, você pode acessar o registro do Terraform para saber mais sobre os provedores, recursos, argumentos e sintaxe disponíveis.


Por exemplo, no registro, posso encontrar o recurso "Grupo de Segurança" (que usaremos neste tutorial) e, em seguida, ir para a guia Entradas para visualizar todos os argumentos disponíveis (eles os chamam de variáveis, para sua informação) que serão permitido quando configuramos o recurso. Ok... desvio completo, para a configuração da sua primeira implantação do TF!

Construindo com Terraform

Primeiro passo, precisamos definir o provedor que queremos usar. Estamos trabalhando na AWS, então o provedor será “AWS”. Também definiremos a região que queremos trabalhar aqui.


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


Se você se lembra, eu disse que usaríamos uma Amazing Machine Image (AMI) para uma máquina virtual (EC2). Aqui, usamos a palavra-chave “data” do Terraform para pesquisar o recurso “aws_ami”. Além disso, damos um nome a todos os dados retornados como parte desta pesquisa - "Splunk." Isso é para que possamos referenciar esses dados em outro lugar em nosso código (tenha isso em mente mais tarde)...


Como pesquisar qualquer coisa requer alguma forma de limitar os resultados da pesquisa apenas ao que queremos encontrar, usamos a palavra-chave filter e depois passamos dois argumentos, “nome” e “valores”. Aqui, instruímos a pesquisa de “aws_ami” para pesquisar no campo “nome” qualquer coisa que comece com “Splunk”.


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


Na AWS, o acesso da rede aos recursos geralmente é controlado por meio de um recurso chamado “ Grupo de Segurança ”. Em nosso exemplo, usaremos um grupo de segurança que permite a entrada ("entrada") da porta TCP 8000 do meu endereço IP (ou o seu, quando você criar este script). Como estamos usando o Splunk em uma conta privada com informações não confidenciais, Permitirei que ele se comunique de saída ("saída"). No entanto, se este fosse um ambiente de produção, você precisaria identificar os intervalos de IP e portas necessários e restringir o acesso apenas a eles para seguir as práticas recomendadas.


Observe que eu defino os parâmetros de entrada, incluindo o protocolo e “cidr_blocks”. Isso é importante, pois configurações incorretas aqui podem abrir um ambiente acidentalmente para a Internet mais ampla. Se você estiver interessado em aprender como fornecer segurança de rede adicional para seu ambiente AWS, me avise - posso criar um tutorial sobre como adicionar um Application Load Balancer ( ALB) a esta configuração para fornecer recursos de segurança adicionais.


 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, a razão pela qual estamos todos aqui – a máquina virtual que executará o Splunk. Como é o caso de todas as outras partes do código Terraform, começamos definindo um recurso, neste caso, “aws_instance”, e nomeando-o “splunk_ec2”, e depois definimos outros parâmetros abaixo dele usando argumentos.


Lembra da palavra-chave “data” que usamos acima para pesquisar em “aws_ami” a AMI “Splunk*” mais recente? Temos o nome "Splunk". Aqui, na configuração da instância EC2, podemos referenciar os dados contidos nessa consulta. Nós o referenciamos usando o argumento "ami" e dizendo que é igual ao que está em "data.aws_ami.splunk.id". Este é um conceito muito importante de entender, então vamos gastar dois minutos analisando-o:


  1. " data.aws_ami. "está fazendo referência à palavra-chave data no bloco de código que criamos acima.
  2. " splunk.id " faz referência ao nome que demos a esses dados, "Splunk", enquanto a última parte, "id", faz referência ao ID da AMI que é retornado pela consulta "data". O AMI ID é uma string que não é facilmente lembrada por humanos, mas é única e fácil de usar para máquinas.


Descendo, dizemos que o security_group para este EC2 é o grupo de segurança “splunksg” que definimos acima. Isso usa a mesma lógica da nomenclatura de "dados" da AMI. Ou seja, ele começa com o nome do recurso, o nome do objeto que definimos e, em seguida, a variável ".name", que também definimos como " SplunkSecGroup ". Observe também que você pode usar o instance_type de t2.micro para isso, e ele funciona - é muito lento, então opto por um t2.medium.


Por último, aplicamos tags a esta instância, o que é útil quando uma conta da AWS cresce e o controle dos ativos se torna mais 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" } }


Agora, eu sei que você poderia simplesmente ter pulado para esta parte e colocado isso no sistema de arquivos e executá-lo e se sentir em paz com o mundo desde que “concluiu” o tutorial, mas não faça isso. Não seja tão preguiçoso. O valor de reservar um tempo para ler e construir comigo está na dor de cometer erros e na alegria de consertar esses erros.


Juntando tudo, devemos ter um script terraform parecido com 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" } }


Uau, olha só, 43 linhas de código! Parece muito, mas você acabou com isso - você pode atualizá-lo, criar com ele, destruí-lo ou compartilhá-lo!


Como já configuramos todas as peças necessárias para fazer isso funcionar na Parte 2 do Desbloqueio do IaC neste ponto, tudo o que é necessário é salvar o arquivo com a extensão correta (vamos usar main.tf).


Abra CMD ou PowerShell como admin (CTRL+SHIFT+CLICK ou clique com o botão direito e “executar como…”), “CD” ou mude o diretório para o mesmo local do arquivo que acabamos de criar (main.tf) e emita o seguinte comandos:

Terraform INIT


 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 o Terraform nesse diretório. Isso é essencialmente iniciar o Terraform.


Plano 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>


Depois de concluído, é uma boa ideia executar terraform plan , que é um método para ver o que sua construção do Terraform fará sem realmente fazer nenhuma alteração em seu ambiente de nuvem. Revise cuidadosamente esta saída e certifique-se de que o que você vê corresponde ao que você espera.

Aplicação 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>


Por fim, executar terraform apply pega o código e o aplica à sua conta AWS. Isso pode levar de alguns segundos a um minuto, mas você deverá receber uma mensagem de sucesso quando terminar. Se você receber algum erro, revise-o cuidadosamente. Os erros do Terraform geralmente são de alta qualidade e fornecerão pistas que não requerem muita (ou nenhuma) pesquisa para serem compreendidas.

Login do Splunk

Neste ponto, seu servidor Splunk provavelmente está pronto para fazer login (leva um ou dois minutos para que a UI fique disponível no Splunk). Para fazer login no Splunk, você precisará de três informações:

  1. O nome de usuário, que é admin
  2. A senha, que será SPLUNK-<instanceid>
  3. O endereço IP e a porta para esta instância EC2 na AWS (por exemplo, http://10.10.10.10:8000 )


Embora seja possível extrair o endereço IP do Terraform e entregá-lo a você como uma saída do script ou usar a AWS CLI para coletar essas informações, não fizemos isso aqui para simplificar. Para obter seu endereço IP e o ID da instância, você precisará fazer login no console AWS.


Procure EC2 no menu de serviços, clique em EC2 e em Instâncias (em execução). Nesta visualização, você verá uma lista de instâncias do EC2 em execução, que deve ser apenas uma, a menos que você tenha outras coisas divertidas acontecendo.

Clique na instância correta (ou na única), e nesta visualização você verá no canto superior esquerdo “ID da Instância”, que pode ser copiado clicando no botão copiar à esquerda, e à direita você verá seu Endereço de IP.


Pegue esse endereço IP e, usando o navegador de sua preferência, digite http://[instanceIP]:8000 e pressione Enter. Você deverá ver o login do Splunk - se não, espere mais um ou dois minutos - o Splunk leva (literalmente) 2-3 minutos para iniciar pela primeira vez. Lembre-se do username = admin e da password = SPLUNK-[instanceID] .


Destruição de Terraforma

Construir é ótimo e aprender coisas novas é divertido - esquecer de desligar os recursos da nuvem quando terminar de se divertir é uma droga. Terraform destroy executa o inverso de terraform apply. Ele destrói a infraestrutura especificada no arquivo terraform. Para usar terraform destroy, o que você deve fazer agora, volte para sua linha de comando e digite terraform destroy . Uma execução bem-sucedida do terraform destroy será notada pela falta da UI do Splunk (provavelmente irá notificá-lo de que está desconectado) e também pela saída do comando 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>


Chegar ao final de um tutorial monstruoso como esse não é fácil. Parabéns se você chegou até aqui! Se eu perdi alguma coisa, o que é provável, desculpe! Neste ponto, valeria a pena continuar brincando com essa habilidade recém-descoberta - altere seu script terraform e adicione um volume EBS à instância EC2 para armazenamento adicional. Adicione S3 para armazenamento de longo prazo. Descubra como adicionar automaticamente um par de chaves SSH à VM para que você possa usar SSH nela e usar a UI. O principal é continuar brincando com isso todos os dias, mesmo que seja um pouquinho.


O momento em que você para é o momento em que você começa a perder essa habilidade lentamente.