Например, чтобы развернуть в AWS один (виртуальный) сервер (экземпляр EC2), укажите в файле main.tf ресурс aws_instance:
resource "aws_instance" "example" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
}
Ресурс aws_instance поддерживает много разных аргументов, но пока что вам нужны только два из них, которые являются обязательными.
•ami. Образ Amazon Machine Image (AMI), который будет запущен на сервере EC2. В AWS Marketplace (https://aws.amazon.com/marketplace/) можно найти платные и бесплатные образы. Вы также можете создать собственный экземпляр AMI, применяя такие инструменты, как Packer (обсуждение образов и шаблонизации серверов ищите в подразделе «Средства шаблонизации серверов» на с. 31). Код, представленный выше, назначает параметру ami идентификатор AMI Ubuntu 18.04 в us-east-2. Этот образ можно использовать бесплатно.
• instance_type. Тип сервера EC2, который нужно запустить. У каждого типа есть свой объем ресурсов процессора, памяти, дискового пространства и сети. Все доступные варианты перечислены на соответствующей странице по адресу https://amzn.to/2H49EOH. В приведенном выше примере используется тип t2.micro, который имеет один виртуальный процессор с 1 Гбайт памяти и входит в бесплатный тариф AWS.
Используйте документацию!
Terraform поддерживает десятки провайдеров, у каждого из которых есть десятки ресурсов, и для каждого ресурса предусмотрены десятки аргументов. Запомнить все это невозможно. При написании кода Terraform следует регулярно сверяться с документацией, чтобы посмотреть, какие ресурсы вам доступны и как их использовать. Например, вот документация для ресурса aws_instance по адресу http://bit.ly/33dmi7g. Несмотря на свой многолетний опыт использования Terraform, я все еще обращаюсь к этой документации по нескольку раз в день!
Откройте терминал, перейдите в папку, в которой вы создали файл main.tf, и выполните команду terraforminit:
$ terraform init
Initializing the backend...
Initializing provider plugins...
- Checking for available provider plugins...
- Downloading plugin for provider "aws" (terraform-providers/aws) 2.10.0...
The following providers do not have any version constraints in configuration, so the latest version was installed.
To prevent automatic upgrades to new major versions that may contain breaking changes, it is recommended to add version = "..." constraints to the corresponding provider blocks in configuration, with the constraint strings suggested below.
* provider.aws: version = "~> 2.10"
Terraform has been successfully initialized!
Исполняемый файл terraform поддерживает основные команды Terraform, но он не содержит никакого кода для провайдеров (вроде AWS, Azure или GCP). Поэтому, начиная работу с этим инструментом, вы должны выполнить terraforminit, чтобы он мог просканировать ваш код, определить, с какими провайдерами вы работаете, и загрузить для них подходящие модули. По умолчанию код провайдеров загружается в папку .terraform, которая является рабочей папкой Terraform (стоит добавить ее в .gitignore). В последующих главах вы познакомитесь с другими сценариями использования команды init и папки .terraform. А пока что просто знайте, что init необходимо выполнять каждый раз, когда вы начинаете писать новый код Terraform, и это можно делать многократно (это идемпотентная команда).
Теперь, загрузив код провайдера, выполните команду terraformplan:
$ terraform plan
(...)
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.
Команда plan позволяет увидеть, что сделает Terraform, без внесения каких-либо изменений. Это хорошая возможность еще раз проверить свой код перед выпуском его во внешний мир. По своему выводу команда plan похожа на утилиту diff, которая является частью Unix, Linux и git: знак плюс (+) помечает все, что будет создано; знак минус (-) — что будет удалено, а то, что помечено тильдой (~), будет изменено. В предыдущем выводе вы можете видеть, что Terraform планирует создать лишь один сервер EC2 и ничего другого — именно то, что нам нужно.