Адресация ресурсов
Адрес ресурса — это строка, которая идентифицирует ноль или более экземпляров ресурсов в вашей конфигурации в целом.
Адрес состоит из двух частей:
[module path][resource spec]
В некоторых контекстах OpenTofu может допускать неполный адрес ресурса, который ссылается только на модуль целиком или не содержит индекс ресурса с несколькими экземплярами. В таких случаях значение зависит от контекста, поэтому обратитесь к документации конкретной используемой функции, которая анализирует адреса ресурсов.
Путь модуля
Путь модуля указывает на модуль в дереве модулей. Он имеет следующий вид:
module.module_name[module index]
-
module— ключевое слово модуля, указывающее на дочерний модуль (не корневой). Несколько ключевых словmoduleв пути указывают на вложенность. -
module_name— заданное пользователем имя модуля. -
[module index]— (Необязательно) Индекс для выбора экземпляра из вызова модуля, у которого несколько экземпляров; указывается в квадратных скобках ([и]).
Адрес без спецификации ресурса, то есть module.foo, применяется ко всем ресурсам в модуле, если у модуля один экземпляр, или ко всем экземплярам модуля, если у него несколько экземпляров. Чтобы указать все ресурсы конкретного экземпляра модуля, включите индекс модуля в адрес, например module.foo[0].
Если путь модуля не указан, адрес применяется к корневому модулю.
Пример использования ключевого слова module для разделения двух модулей, у которых несколько экземпляров:
module.foo[0].module.bar["a"]
Спецификация ресурса
Спецификация ресурса указывает на конкретный экземпляр ресурса в выбранном модуле. Она имеет следующий синтаксис:
resource_type.resource_name[instance index]
-
resource_type— тип адресуемого ресурса. -
resource_name— заданное пользователем имя ресурса. -
[instance index]— (Необязательно) Индекс для выбора экземпляра ресурса, у которого несколько экземпляров; указывается в квадратных скобках ([и]).
Спецификация ресурса без префикса пути модуля соответствует только ресурсам в корневом модуле.
Значения индексов для модулей и ресурсов
К значениям индексов модулей и ресурсов с несколькими экземплярами применяются следующие правила:
-
[N], гдеN— числовой индекс на основе0для ресурса с несколькими экземплярами, заданными метааргументомcount. Если при указании ресурса сcount > 1индекс опущен, адрес ссылается на все экземпляры. -
["INDEX"], гдеINDEX— буквенно-цифровой ключевой индекс ресурса с несколькими экземплярами, заданными метааргументомfor_each.
Примеры
Пример count
Предположим, конфигурация OpenTofu содержит:
resource "aws_instance" "web" {
# ...
count = 4
}Такой адрес:
aws_instance.web[3]
ссылается только на последний экземпляр в конфигурации, а такой адрес:
aws_instance.web
ссылается на все четыре экземпляра «web».
Пример for_each
Предположим, конфигурация OpenTofu содержит:
resource "aws_instance" "web" {
# ...
for_each = {
"tofu": "value1",
"resource": "value2",
"indexing": "value3",
"example": "value4",
}
}Такой адрес:
aws_instance.web["example"]
ссылается только на экземпляр «example» в конфигурации и разрешается в «value4».
Адреса ресурсов в командной строке
При непосредственном использовании адресов ресурсов в аргументах командной строки, например в параметрах планирования -target, -exclude и -replace, знаки пунктуации в синтаксисе адреса ресурса могут конфликтовать со специальной интерпретацией этих символов оболочкой, используемой для запуска OpenTofu.
Чтобы избежать этого, необходимо заключить эти символы в кавычки или экранировать их так, чтобы оболочка передала их OpenTofu без изменений. Синтаксис зависит от используемой оболочки или интерпретатора команд:
-
В оболочках Unix, например
bash, заключайте адрес ресурса в одинарные кавычки ('):Блок кода tofu apply -target='aws_instance.example["foo"]'
Если нужно указать строку ключа экземпляра, содержащую символ одинарной кавычки, используйте две отдельные последовательности в одинарных кавычках, поставив между ними экранированную одинарную кавычку. Например, в следующем примере указан ключ экземпляра
"example'foo":Блок кода tofu apply -target='aws_instance.example["example'\''foo"]'
-
В PowerShell 7.3 и более поздних версиях заключайте адрес ресурса в одинарные кавычки (
'):Блок кода tofu apply -target='aws_instance.example["foo"]'
В более ранних версиях PowerShell требования отличаются. Дополнительные сведения см. в разделе Передача аргументов, содержащих символы кавычек.
Если нужно указать строку ключа экземпляра, содержащую символ одинарной кавычки, используйте две одинарные кавычки подряд, чтобы представить одну буквальную кавычку. Например, в следующем примере указан ключ экземпляра
"example'foo":Блок кода tofu apply -target='aws_instance.example["example''foo"]'
-
В командной строке Windows (
cmd.exe) заключайте адрес ресурса в двойные кавычки ("), а кавычки в адресе экранируйте обратной косой чертой (\):Блок кода tofu apply -target="aws_instance.example[\"foo\"]"
Адреса ресурсов в файлах целевых ресурсов
Параметры -target-file и -exclude-file планирования считывают адреса ресурсов из отдельного файла, который может содержать ноль или более адресов ресурсов.
OpenTofu обрабатывает файл целевых ресурсов построчно. Каждая строка должна содержать одно из следующего:
- Адрес ресурса с синтаксисом, описанным выше; в этом случае OpenTofu добавляет адрес в набор целевых адресов.
- Комментарий, начинающийся с символа
#; в этом случае OpenTofu полностью игнорирует строку. - Пустая строка, состоящая только из нуля или более пробелов; в этом случае OpenTofu также полностью игнорирует строку.
Например, следующий файл целевых ресурсов является допустимым и задаёт несколько адресов ресурсов, которые, возможно, потребуется сначала создать при первом применении определённой конфигурации:
# These modules must be targeted during initial creation. module.network module.cluster # The following resources must also be included on initial # creation. aws_iam_role.all["base"] aws_iam_role_policy.all["base"]
Указанный выше файл целевых ресурсов будет соответствовать всем экземплярам ресурсов, адреса которых начинаются с module.network или module.cluster, а также конкретным экземплярам ресурсов aws_iam_role.all["base"] и aws_iam_role_policy.all["base"].
Copyright (c) The OpenTofu Authors
Copyright (c) 2014 HashiCorp, Inc.
Mozilla Public License, version 2.0
https://opentofu.org/docs/v1.12/cli/state/resource-addressing/