Чтобы инициировать создание сервера, нужно выполнить команду terraformapply:
$ terraform apply
(...)
Terraform will perform the following actions:
# aws_instance.example will be created
+ resource "aws_instance" "example" {
+ ami = "ami-0c55b159cbfafe1f0"
+ arn = (known after apply)
+ associate_public_ip_address = (known after apply)
+ availability_zone = (known after apply)
+ cpu_core_count = (known after apply)
+ cpu_threads_per_core = (known after apply)
+ get_password_data = false
+ host_id = (known after apply)
+ id = (known after apply)
+ instance_state = (known after apply)
+ instance_type = "t2.micro"
+ ipv6_address_count = (known after apply)
+ ipv6_addresses = (known after apply)
+ key_name = (known after apply)
(...)
}
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value:
Вы можете заметить, что команда apply отображает такой же вывод, как и plan, и спрашивает вас, действительно ли вы хотите перейти к осуществлению этого плана. plan — отдельная команда, которая в основном подходит для быстрой проверки и разбора кода (больше об этом — в главе 8), но в большинстве случаев вы будете сразу выполнять команду apply, проверяя ее вывод.
Введите yes и нажмите клавишу Enter, чтобы развернуть сервер EC2:
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_instance.example: Creating...
aws_instance.example: Still creating... [10s elapsed]
aws_instance.example: Still creating... [20s elapsed]
aws_instance.example: Still creating... [30s elapsed]
aws_instance.example: Creation complete after 38s [id=i-07e2a3e006d785906]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Поздравляем, вы развернули сервер EC2 в своей учетной записи AWS, используя Terraform! Чтобы в этом убедиться, перейдите в консоль EC2 (https://amzn.to/2GOFxdI); вы должны увидеть страницу, похожую на ту, что изображена на рис. 2.4.
Рис. 2.4. Один сервер EC2
Мы действительно видим наш сервер! Однако нужно признать, что это не самый впечатляющий пример. Сделаем его немного более интересным. Для начала обратите внимание на то, что у нашего сервера EC2 нет имени. Чтобы его указать, добавьте к ресурсу aws_instance параметр tags:
resource "aws_instance" "example" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
tags = {
Name = "terraform-example"
}
}
Чтобы увидеть последствия этих изменений, еще раз выполните команду terraformapply:
$ terraform apply
aws_instance.example: Refreshing state...
(...)
Terraform will perform the following actions:
# aws_instance.example will be updated in-place
~ resource "aws_instance" "example" {
ami = "ami-0c55b159cbfafe1f0"
availability_zone = "us-east-2b"
instance_state = "running"
(...)
+ tags = {
+ "Name" = "terraform-example"
}
(...)
}
Plan: 0 to add, 1 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value:
Система Terraform отслеживает все ресурсы, которые были созданы для этого набора конфигурационных файлов. Поэтому ей известно, что сервер EC2 уже существует (обратите внимание на строчку Refreshingstate… при выполнении команды apply), и она может вывести разницу между тем, что развернуто на данный момент, и тем, что описано в вашем коде (это одно из преимуществ использования декларативного кода по сравнению с процедурным; см. раздел «Сравнение Terraform с другими средствами IaC» на с. 42). В предыдущем сравнении видно, что Terraform хочет создать один тег под названием Name. Это именно то, что вам нужно, поэтому введите yes и нажмите клавишу Enter.
Обновив свою консоль EC2, вы увидите примерно такое окно, как на рис. 2.5.
Рис. 2.5. У сервера EC2 теперь есть тег с именем
Итак, у вас теперь есть рабочий код Terraform, стоит сохранить его в системе управления версиями. Это позволит вам делиться им с другими членами команды, отслеживать историю всех изменений инфраструктуры и использовать журнал фиксаций для отладки. Ниже показан пример того, как создать локальный Git-репозиторий и применять его для хранения конфигурационного файла Terraform:
git init
git add main.tf
git commit -m "Initial commit"
Cледует также создать файл под названием .gitignore. Он заставляет Git игнорировать определенные типы файлов, которые вы бы не хотели сохранить по случайности:
.terraform
*.tfstate
*.tfstate.backup
Файл .gitignore, показанный выше, заставляет Git игнорировать папку .terraform, которую Terraform использует в качестве временной рабочей папки, а также файлы вида *.tfstate, в которых Terraform хранит состояние (в главе 3 вы узнаете, почему файлы состояния нельзя записывать в репозиторий). Файл .gitignore тоже нужно зафиксировать: