Источник данных terraform_remote_state
Источник данных terraform_remote_state использует последний снимок состояния из указанного серверного модуля состояния, чтобы получить выходные значения корневого модуля из другой конфигурации OpenTofu.
Источник данных terraform_remote_state можно использовать без необходимости в провайдере или его настройке. Он всегда доступен через встроенный провайдер с адресом источника terraform.io/builtin/terraform. Этот провайдер не включает никаких других ресурсов или источников данных.
terraform_remote_state не учитывает конфиденциальность снимков исходного состояния. Будьте осторожны при обращении к состоянию с конфиденциальными выходными значениями корневого модуля.
Будьте осторожны при использовании шифрования состояния! Для совместного использования зашифрованного состояния между проектами требуется тщательно согласовать ключи метаданных. Подробнее см. раздел Источники данных удаленного состояния руководства по шифрованию состояния.
Альтернативные способы обмена данными между конфигурациями
Обмен данными с помощью выходных значений корневого модуля удобен, но имеет недостатки. Хотя terraform_remote_state предоставляет только выходные значения, его пользователь должен иметь доступ ко всему снимку состояния, который часто содержит конфиденциальную информацию.
Если возможно, мы рекомендуем явно публиковать данные для внешнего использования в отдельном месте, а не обращаться к ним через удаленное состояние. Это позволяет применять разные средства контроля доступа к общей информации и снимкам состояния.
Для явного обмена данными между конфигурациями можно использовать пары типов управляемых ресурсов и источников данных из различных провайдеров, включая (но не ограничиваясь) следующие:
Это лишь некоторые распространенные варианты от официальных провайдеров OpenTofu, но существует слишком много вариантов хранения конфигурации, чтобы перечислить их здесь все, в том числе в партнерских провайдерах и провайдерах сообщества. Любую пару из типа управляемого ресурса и соответствующего источника данных потенциально можно использовать для обмена данными между конфигурациями OpenTofu. Другие возможности см. в документации отдельных провайдеров.
Одно из ключевых преимуществ использования отдельного хранилища конфигурации вместо terraform_remote_state заключается в том, что данные потенциально могут считываться и другими системами, кроме OpenTofu, например системами управления конфигурацией или планировщиками на вычислительных экземплярах. Поэтому мы рекомендуем выбрать хранилище конфигурации, которое смогут использовать и другие компоненты вашей инфраструктуры. Например:
- Если вы хотите предоставлять IP-адреса и имена хостов, можно публиковать их как обычные записи DNS
A,AAAA,CNAMEиSRVв частной зоне DNS, а затем настроить остальную инфраструктуру на использование этой зоны, чтобы находить объекты инфраструктуры с помощью встроенного системного DNS-резолвера. - Если вы используете HashiCorp Consul, публикация данных в хранилище ключей и значений Consul или каталоге служб Consul сделает эти данные доступными через Consul Template или блок
templateHashiCorp Nomad. - Если вы используете Kubernetes, можно сделать Config Maps доступными вашим Pod.
Некоторые перечисленные выше хранилища данных специально предназначены для хранения небольших значений конфигурации, тогда как другие представляют собой универсальные системы хранения больших двоичных объектов. Для таких универсальных систем можно использовать функцию jsonencode и функцию jsondecode соответственно для хранения и извлечения структурированных данных.
Можно скрыть детали реализации получения опубликованных данных конфигурации, создав модуль только с данными, содержащий необходимую конфигурацию источника данных и требуемую последующую обработку, например декодирование JSON. Позже этот модуль можно изменить, если вы перейдете на другую стратегию обмена данными между несколькими конфигурациями OpenTofu.
Пример использования (серверный модуль remote)
data "terraform_remote_state" "vpc" {
backend = "remote"
config = {
organization = "hashicorp"
workspaces = {
name = "vpc-prod"
}
}
}
resource "aws_instance" "foo" {
# ...
subnet_id = data.terraform_remote_state.vpc.outputs.subnet_id
}Пример использования (локальный серверный модуль local)
data "terraform_remote_state" "vpc" {
backend = "local"
config = {
path = "..."
}
}
resource "aws_instance" "foo" {
# ...
subnet_id = data.terraform_remote_state.vpc.outputs.subnet_id
}Описание аргументов
Поддерживаются следующие аргументы:
-
backend— (обязательный) используемый удаленный серверный модуль. -
workspace— (необязательный) используемое рабочее пространство OpenTofu, если серверный модуль поддерживает рабочие пространства. -
config— (необязательный; объект) конфигурация удаленного серверного модуля. Хотя этот аргумент обозначен как необязательный, большинству серверных модулей требуется конфигурация.Объект
configможет использовать любые аргументы, допустимые в соответствующем блокеterraform { backend "<TYPE>" { ... } }. Подробнее см. документацию по выбранному серверному модулю.ПримечаниеЕсли конфигурация серверного модуля требует вложенного блока, укажите его здесь как обычный атрибут со значением-объектом. (Например,
workspaces = { ... }вместоworkspaces { ... }.) -
defaults— (необязательный; объект) значения по умолчанию для выходных значений на случай, если файл состояния пуст или в нем отсутствует обязательное выходное значение.
Описание атрибутов
Кроме перечисленных выше, экспортируются следующие атрибуты:
-
outputs— объект, содержащий все выходные значения корневого уровня удаленного состояния.
Только выходные значения корневого уровня
Для использования в других частях модуля предоставляются только выходные значения корневого уровня из снимка удаленного состояния. Данные ресурсов и выходные значения вложенных модулей недоступны.
Чтобы сделать выходное значение вложенного модуля доступным в качестве выходного значения корневого модуля, необходимо явно настроить его передачу в корневом модуле. Например:
Например:
module "app" {
source = "..."
}
output "app_value" {
value = module.app.example
}В этом примере выходное значение с именем example из модуля "app" доступно как выходное значение корневого модуля app_value. Если бы эта конфигурация не содержала блок output "app_value", данные были бы недоступны через terraform_remote_state.
Хотя terraform_remote_state не предоставляет для использования в конфигурации никакой другой информации из снимка состояния, данные снимка состояния представляют собой единый объект. Поэтому любой пользователь или сервер, имеющий достаточный доступ для чтения выходных значений корневого модуля, всегда также сможет получить доступ ко всему снимку состояния посредством прямых сетевых запросов. Не используйте terraform_remote_state, если какие-либо ресурсы в вашей конфигурации работают с данными, которые вы считаете конфиденциальными.
Copyright (c) The OpenTofu Authors
Copyright (c) 2014 HashiCorp, Inc.
Mozilla Public License, version 2.0
https://opentofu.org/docs/v1.9/language/state/remote-state-data/