paint-brush
Открываем IaC, часть 3: ваше первое развертывание Terraform!к@chrisray
556 чтения
556 чтения

Открываем IaC, часть 3: ваше первое развертывание Terraform!

к Chris Ray55m2023/09/30
Read on Terminal Reader
Read this story w/o Javascript

Слишком долго; Читать

Настроить сборку с помощью Terraform сложно! В части 3 мы приступим к делу и создадим сервер Splunk в AWS с использованием Terraform.
featured image - Открываем IaC, часть 3: ваше первое развертывание Terraform!
Chris Ray HackerNoon profile picture
0-item


Давай повеселимся!

Посмотрим правде в глаза: серия из трех частей, посвященная чему-то техническому, например IaC, может оказаться непростой задачей. Я уверен, что вас уже несколько раз отвлекали от этого. Дойти до третьей части очень интересно — именно тогда начинается самое интересное. Это момент, когда резина отправляется в путь. Если вы чувствуете, что едва держитесь, и сомневаетесь, что сможете закончить эту часть, вероятно, приятно знать, что большинство людей тоже так думают. Очень немногие решаются на что-то настолько абстрактное и добиваются успеха с первой попытки (или с третьей). Давайте приступим к делу!

Для этого первого развертывания давайте воспользуемся чем-то, что мы все знаем по имени, Splunk. В этом сценарии мы развернем один сервер, на котором уже установлен и настроен Splunk. При этом будет использоваться образ машины Amazon (AMI). Есть много ОИМ на выбор. У некоторых разные ОС, например Windows или Linux; некоторые из них представляют собой разные дистрибутивы Linux, например Ubuntu, CentOS и т. д., а некоторые представляют собой готовые приложения, подобные этому.


Мы запустим сервер Splunk EC2 («экземпляр Splunk»), создадим доступ к сети, чтобы разрешить доступ к нему только с вашего общедоступного IP-адреса через TCP-порт 8000 (порт пользовательского интерфейса Splunk по умолчанию), а затем уничтожим все это с помощью простого Terraform. команду, когда мы закончим.


Я разобью один файл terraform (main.tf) на несколько небольших частей, чтобы нам было легче проходить каждую часть. Затем, в конце, я соберу все это вместе, чтобы мы могли реализовать это.

Как разобраться во всем самостоятельно в Terraformland

Прежде чем мы начнем, важно, чтобы вы знали, куда можно обратиться, чтобы найти ответы на вопросы, которые я здесь не рассмотрел. Например, когда я начал создавать в Terraform, я задавался вопросом: «Откуда мне знать, какие аргументы (именно так вы определяете ресурсы, например тип виртуальной машины в экземпляре EC2 или входящие протоколы, разрешенные в группе безопасности) В этом примере и на МНОГИЕ другие вопросы, на которые здесь нет ответа, вы можете перейти в реестр Terraform , чтобы узнать больше о доступных поставщиках, ресурсах, аргументах и синтаксисе.


Например, в реестре я могу найти ресурс «Группа безопасности» (который мы будем использовать в этом руководстве), затем перейти на вкладку «Входные данные» , чтобы просмотреть все доступные аргументы (они называют их переменными, к вашему сведению), которые будут разрешено при настройке ресурса. Хорошо... обход завершен, переходим к конфигурации вашего первого развертывания TF!

Строительство с Терраформом

Первый шаг: нам нужно определить поставщика, которого мы хотим использовать. Мы работаем в AWS, поэтому поставщиком будет «AWS». Здесь мы также определим регион, в котором хотим работать.


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


Если вы помните, я говорил, что мы собираемся использовать Amazing Machine Image (AMI) для виртуальной машины (EC2). Здесь мы используем ключевое слово Terraform «data» для поиска по ресурсу «aws_ami». Кроме того, мы даем имя всем данным, возвращаемым в ходе этого поиска, — «Splunk». Это делается для того, чтобы мы могли ссылаться на эти данные в другом месте нашего кода (имейте это в виду позже)...


Поскольку для поиска чего-либо требуется какой-то способ ограничить результаты поиска только тем, что мы хотим найти, мы используем ключевое слово фильтра, а затем передаем ему два аргумента: «имя» и «значения». Здесь мы указываем поиску «aws_ami» искать в поле «имя» все, что начинается с «Splunk».


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


В AWS сетевой доступ к ресурсам часто контролируется через ресурс, называемый « группой безопасности ». В нашем примере мы будем использовать группу безопасности, которая разрешает входящий («входящий») TCP-порт 8000 с моего IP-адреса (или вашего, когда вы создаете этот сценарий).Поскольку мы используем Splunk в частной учетной записи с неконфиденциальной информацией, Я разрешу ему исходящую связь («исходящий»). Однако, если бы это была производственная среда, вам нужно было бы определить необходимые диапазоны IP-адресов и портов и ограничить доступ только к ним, чтобы следовать передовым практикам.


Обратите внимание, что я определяю входные параметры, включая протокол и «cidr_blocks». Это важно, поскольку неправильные настройки здесь могут случайно открыть среду для более широкого доступа в Интернет. Если вы заинтересованы в получении дополнительной сетевой безопасности для вашей среды AWS, дайте мне знать — я могу создать руководство по добавлению балансировщика нагрузки приложений ( ALB) в эту конфигурацию, чтобы обеспечить дополнительные функции безопасности.


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


Наконец, причина, по которой мы все здесь — виртуальная машина, на которой будет работать Splunk. Как и в случае со всеми другими частями кода Terraform, мы начинаем с определения ресурса, в данном случае «aws_instance», и присваиваем ему имя «splunk_ec2», а затем переходим к определению других параметров под ним, используя аргументы.


Помните ключевое слово «данные», которое мы использовали выше для поиска «aws_ami» самого последнего AMI «Splunk*»? У нас есть название «Спланк». Здесь, в конфигурации экземпляра EC2, мы можем ссылаться на данные, содержащиеся в этом запросе. Мы ссылаемся на него, используя аргумент «ami» и говоря, что он равен всему, что находится в «data.aws_ami.splunk.id». Это действительно важная концепция, которую нужно понять, поэтому давайте потратим две минуты на ее разбор:


  1. « data.aws_ami. » ссылается на ключевое слово data в блоке кода, который мы создали выше.
  2. « splunk.id » ссылается на имя, которое мы дали этим данным, «Splunk», а последний фрагмент, «id», ссылается на идентификатор AMI, который возвращается запросом «data». Идентификатор AMI — это строка, которую нелегко запомнить людям, но она уникальна и проста в использовании для компьютеров.


Двигаясь вниз, мы говорим, что группа безопасности для этого EC2 — это группа безопасности «splunksg», которую мы определили выше. Здесь используется та же логика, что и при именовании «данных» AMI. IE, он начинается с имени ресурса, имени объекта, который мы определили, а затем переменной «.name», которую мы также определили как « SplunkSecGroup ». Также обратите внимание, что для этого вы можете использовать тип экземпляра t2.micro, и это работает - просто очень медленно, поэтому я выбираю t2.medium.


Наконец, мы применяем теги к этому экземпляру, что полезно, когда учетная запись AWS растет и отслеживать активы становится сложнее.


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


Я знаю, что вы могли бы просто перейти к этой части, вставить это в файловую систему, запустить и почувствовать себя в мире с миром, поскольку вы «завершили» руководство, но не делайте этого. Не будь таким ленивым. Ценность того, чтобы потратить время на чтение и создание вместе со мной, заключается в боли от ошибок и радости от их исправления.


Собрав все это вместе, у нас должен получиться скрипт терраформирования, который выглядит следующим образом:


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


Ого, посмотрите, 43 строки кода! Звучит много, но с этим покончено — вы можете обновить его, создать с его помощью, уничтожить или поделиться им!


Поскольку на данный момент мы уже настроили все необходимое для этой работы во второй части книги «Разблокировка IaC» , все, что нужно, — это сохранить файл с правильным расширением (давайте использовать main.tf).


Откройте CMD или PowerShell от имени администратора (CTRL+SHIFT+ЩЕЛЧОК или щелкните правой кнопкой мыши и «запустить от имени…»), «CD» или измените каталог на тот же каталог, что и файл, который мы только что создали (main.tf), и выполните следующую команду. команды:

Терраформирование ИНИТ


 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 инициализирует Terraform в этом каталоге. По сути, это запуск 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>


Как только это будет завершено, рекомендуется запустить terraform plan , который позволяет увидеть, что будет делать ваша сборка 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>


Наконец, запуск terraform apply берет код и применяет его к вашей учетной записи AWS. Это может занять от нескольких секунд до минуты, но как только вы закончите, вы должны получить сообщение об успешном завершении. Если вы получаете какие-либо ошибки, внимательно просмотрите ошибку. Ошибки Terraform обычно высокого качества и дают подсказки, для понимания которых не требуется большого (если вообще требуется) исследования.

Вход в Splunk

На этом этапе ваш сервер Splunk, вероятно, готов к входу в систему (потребуется минута или две, чтобы пользовательский интерфейс стал доступен на Splunk). Чтобы войти в Splunk, вам понадобятся три части информации:

  1. Имя пользователя, которое является admin
  2. Пароль, который будет SPLUNK-<instanceid>
  3. IP-адрес и порт для этого экземпляра EC2 в AWS (например http://10.10.10.10:8000 ).


Хотя можно извлечь IP-адрес из Terraform и доставить его вам в качестве ВЫХОДА скрипта или использовать интерфейс командной строки AWS для сбора этой информации, мы не сделали этого здесь для простоты. Чтобы получить свой IP-адрес и идентификатор экземпляра, вам необходимо войти в консоль AWS.


Найдите EC2 в меню служб, затем нажмите EC2, затем нажмите «Экземпляры (работающие)». В этом представлении вы увидите список запущенных экземпляров EC2, который должен быть единственным, если только у вас не происходит других интересных вещей.

Щелкните правильный экземпляр (или единственный), и в этом представлении вы увидите в левом верхнем углу «Идентификатор экземпляра», который можно скопировать, нажав кнопку копирования слева, а справа вы увидите свой Айпи адрес.


Возьмите этот IP-адрес и, используя выбранный вами браузер, введите http://[instanceIP]:8000 затем нажмите Enter. Вы должны увидеть вход в Splunk — если нет, подождите еще минуту или две — Splunk запускается (буквально) 2-3 минуты в первый раз. Запомните username = admin и password = SPLUNK-[instanceID] .


Терраформирование Уничтожить

Создавать — это здорово, а изучать новые вещи — это весело. Забыть выключить облачные ресурсы, когда вы закончили веселиться, — отстой. Terraform Destroy выполняет действие, обратное terraform Apply. Он разрушает инфраструктуру, указанную в файле terraform. Чтобы использовать terraform Destroy, что вам следует сделать прямо сейчас, вернитесь в командную строку и введите terraform destroy . Успешный запуск terraform Destroy будет отмечен отсутствием пользовательского интерфейса Splunk (он, вероятно, уведомит вас об отключении), а также выходными данными команды 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>


Дойти до конца такого урока по монстрам непросто. Поздравляем, если вы зашли так далеко! Если я что-то пропустил, что вполне вероятно, извините! На этом этапе было бы целесообразно продолжить экспериментировать с этим новым навыком — изменить свой скрипт terraform и добавить том EBS к экземпляру EC2 для дополнительного хранилища. Добавьте S3 для долгосрочного хранения. Выясните, как автоматически добавить пару ключей SSH к виртуальной машине, чтобы вы могли подключаться к ней по SSH и использовать пользовательский интерфейс. Главное — продолжать играть с этим каждый день, хотя бы по чуть-чуть.


В тот момент, когда вы остановитесь, вы начнете медленно терять этот навык.