Terraform: инфраструктура на уровне кода | страница 62



В этой главе вы узнаете, как Terraform отслеживает состояние вашей инфраструктуры и каким образом это влияет на структуру файлов и каталогов, изоляцию и блокирование в проекте Terraform. Вот ключевые темы, по которым мы пройдемся.

• Что собой представляет состояние Terraform.

• Общее хранилище для файлов состояния.

• Ограничения внутренних хранилищ Terraform.

• Изоляция файлов состояния.

• Изоляция с помощью рабочих областей.

• Изоляция с помощью описания структуры файлов.

• Источник данных terraform_remote_state.


Примеры кода

Напоминаю: все примеры кода для этой книги можно найти по адресу github.com/brikis98/terraform-up-and-running-code.


Что собой представляет состояние Terraform

При каждом своем запуске система Terraform записывает информацию о созданной ею инфраструктуре в свой файл состояния. По умолчанию, если запуск происходит в /foo/bar, Terraform создает файл /foo/bar/terraform.tfstate. Этот файл имеет нестандартный формат JSON и связывает ресурсы Terraform в ваших конфигурационных файлах с их представлением в реальном мире. Представьте, к примеру, что у Terraform следующая конфигурация:

resource "aws_instance" "example" {

  ami           = "ami-0c55b159cbfafe1f0"

  instance_type = "t2.micro"

}

Ниже показан небольшой фрагмент файла terraform.tfstate (урезанный, чтобы его было легче читать), который будет создан после выполнения terraformapply:

{

  "version": 4,

  "terraform_version": "0.12.0",

  "serial": 1,

  "lineage": "1f2087f9-4b3c-1b66-65db-8b78faafc6fb",

  "outputs": {},

  "resources": [

    {

      "mode": "managed",

      "type": "aws_instance",

      "name": "example",

      "provider": "provider.aws",

      "instances": [

        {

          "schema_version": 1,

          "attributes": {

            "ami": "ami-0c55b159cbfafe1f0",

            "availability_zone": "us-east-2c",

            "id": "i-00d689a0acc43af0f",

            "instance_state": "running",

            "instance_type": "t2.micro",

            "(...)": "(truncated)"

          }

        }

      ]

    }

  ]

}

Благодаря формату JSON Terraform знает, что ресурс типа aws_instance с именем example соответствует серверу EC2 с идентификатором i-00d689a0acc43af0f в вашей учетной записи AWS. При каждом запуске Terraform может запросить у AWS текущее состояние этого сервера и сравнить его с вашей конфигурацией, чтобы определить, какие изменения следует внести. Иными словами, вывод команды plan — это расхождение между кодом на вашем компьютере и инфраструктурой, развернутой в реальном мире (согласно идентификаторам в файле состояния).