Команда: test
Команда tofu test позволяет протестировать конфигурацию OpenTofu, создав реальную инфраструктуру и проверив выполнение необходимых условий (утверждений). После завершения теста OpenTofu удаляет созданные ресурсы.
Использование
Использование: tofu test [options].
Эта команда выполнит все файлы *.tftest.hcl, *.tftest.json, *.tofutest.hcl и *.tofutest.json в текущем каталоге или в каталоге с именем tests. Настроить это поведение можно с помощью приведённых ниже параметров.
Рассмотрим простой пример: он создаёт файл test.txt из main.tf, а затем проверяет, успешно ли основной код выполнил свою задачу, используя main.tftest.hcl.
- main.tf
- main.tftest.hcl
resource "local_file" "test" {
filename = "${path.module}/test.txt"
content = "Hello world!"
}run "test" {
assert {
condition = file(local_file.test.filename) == "Hello world!"
error_message = "Incorrect content in ${local_file.test.filename}."
}
}Выполните tofu init, а затем tofu test, чтобы запустить тест: он применит файл main.tf и проверит его по утверждению из main.tftest.hcl. Это лишь простой пример. Более подробные примеры приведены ниже.
Приоритет расширений
Если в каталоге присутствуют файлы .tftest.hcl и .tofutest.hcl с одинаковым базовым именем, OpenTofu отдаст предпочтение файлу .tofutest.hcl и проигнорирует файл .tftest.hcl. Например:
- Если в одном каталоге имеются файлы
main.tftest.hclиmain.tofutest.hcl, OpenTofu загрузит толькоmain.tofutest.hclи проигнорируетmain.tftest.hcl.
Это гарантирует, что файлы .tofu всегда имеют приоритет над файлами .tf, если доступны оба типа. Это может быть полезно авторам модулей, которые хотят, чтобы их модули поддерживали и OpenTofu, и Terraform, и хотят создавать для каждого из них отдельные тесты.
- если в одном каталоге имеются файлы
main.tftest.jsonиmain.tofutest.json, OpenTofu загрузит толькоmain.tofutest.jsonи проигнорируетmain.tftest.json.
Параметры
-
-test-directory=pathЗадаёт каталог тестов (по умолчанию: "tests"). При запускеtofu testOpenTofu будет искать тестовые файлы в указанном каталоге, а также в текущем каталоге. Путь должен быть задан относительно текущего рабочего каталога. -
-filter=testfileУказывает отдельный тестовый файл для запуска. Чтобы указать несколько файлов, используйте этот параметр несколько раз. Путь должен быть задан относительно текущего рабочего каталога. -
-var 'foo=bar'Задаёт входную переменную корневого модуля. Чтобы добавить несколько переменных, используйте этот параметр несколько раз. -
-var-file=filenameЗадаёт несколько переменных из указанного файла. Помимо этого файла, OpenTofu автоматически загружаетterraform.tfvarsи*.auto.tfvars. Чтобы указать несколько файлов, используйте этот параметр несколько раз. -
-jsonПереключает формат вывода на JSON. -
-no-colorОтключает цветной вывод команды. -
-verboseВыводит план или состояние для каждого блока запуска теста по мере его выполнения.
Использование переменных в источниках модулей, конфигурации бэкенда или блоке шифрования требует задания значений переменным корневого модуля при запуске tofu test.
Структура каталогов
Команда tofu test поддерживает два варианта структуры каталогов: плоскую и вложенную.
- Плоская структура
- Вложенная структура
При такой структуре тестовые файлы *.tftest.hcl находятся непосредственно рядом с файлами *.tf, которые они проверяют. Нет требования, чтобы у каждого файла *.tf был отдельный тестовый файл, однако это рекомендуется.
. ├── main.tf ├── main.tftest.hcl ├── foo.tf ├── foo.tftest.hcl ├── bar.tf └── bar.tftest.hcl
При такой структуре файлы *.tftest.hcl находятся в отдельном каталоге tests. Как и в плоской структуре, нет требования, чтобы у каждого файла *.tf был отдельный тестовый файл, однако это рекомендуется.
.
├── main.tf
├── foo.tf
├── bar.tf
└── tests
├── main.tftest.hcl
├── foo.tftest.hcl
└── bar.tftest.hclТестирование модулей
При тестировании модулей для каждого модуля можно использовать одну из описанных выше структур каталогов:
- Плоская структура
- Вложенная структура
При такой структуре выполните tofu test -test-directory=./path/to/module, чтобы протестировать нужный модуль.
.
├── module1
│ ├── main.tf
│ ├── main.tftest.hcl
│ ├── foo.tf
│ ├── foo.tftest.hcl
│ ├── bar.tf
│ └── bar.tftest.hcl
└── module2
└── ...При такой структуре перейдите в рабочем каталоге к пути модуля и выполните tofu test, чтобы протестировать нужный модуль.
.
├── module1
│ ├── main.tf
│ ├── foo.tf
│ ├── bar.tf
│ └── tests
│ ├── main.tftest.hcl
│ ├── foo.tftest.hcl
│ └── bar.tftest.hcl
└── module2
└── ...Для запуска ограниченного набора тестовых файлов можно использовать параметр -filter=sometest.tftest.hcl. Чтобы запустить несколько тестовых файлов, укажите этот параметр несколько раз.
Структура файлов *.tftest.hcl / *.tofutest.hcl
Язык тестирования OpenTofu похож на основной язык OpenTofu и использует ту же структуру блоков.
Тестовый файл состоит из следующих элементов:
- Блоки
run: описывают тесты. - Блок
variables(необязательно): задаёт переменные для всех тестов в текущем файле. - Блоки
provider(необязательно): задают провайдеры, используемые в тестах. - Блоки
mock_provider(необязательно): задают провайдеры, для которых будут созданы имитации. - Блоки
override_resource(необязательно): задают ресурсы, которые нужно переопределить. - Блоки
override_data(необязательно): задают источники данных, которые нужно переопределить. - Блоки
override_module(необязательно): задают вызовы модулей, которые нужно переопределить.
Блок run
Блок run содержит один тестовый сценарий, который выполняет tofu apply или tofu plan, а затем вычисляет все блоки assert. После завершения теста для удаления временно созданных ресурсов используется tofu destroy.
Блок run состоит из следующих элементов:
| Имя | Тип | Описание |
|---|---|---|
assert |
блок | Задаёт утверждения, проверяющие, правильно ли ваш код (например, main.tf) создал инфраструктуру. Если не указать блоки assert, OpenTofu просто применит конфигурацию без каких-либо утверждений. |
module |
блок | Переопределяет тестируемый модуль. Это можно использовать для загрузки вспомогательного модуля и выполнения более сложных тестов. |
expect_failures |
список | Список ресурсов, создание которых должно завершиться с ошибкой в текущем запуске. |
variables |
блок | Задаёт переменные для текущего тестового сценария. См. раздел о переменных. |
command |
plan или apply
|
Задаёт команду, которую выполнит OpenTofu: plan или apply. По умолчанию — apply. |
plan_options |
блок | Параметры операции plan или apply. |
providers |
объект | Псевдонимы провайдеров. |
override_resource |
блок | Задаёт ресурс, который нужно переопределить для запуска. |
override_data |
блок | Задаёт источник данных, который нужно переопределить для запуска. |
override_module |
блок | Задаёт вызов модуля, который нужно переопределить для запуска. |
Блок run.assert
Внутри блока run можно задать блоки assert, чтобы проверить состояние инфраструктуры после завершения операции apply или plan. Теоретических ограничений на количество таких блоков нет.
В каждом блоке должны быть указаны два атрибута:
condition— это условие OpenTofu, которое должно возвращатьtrue, чтобы тест прошёл, иfalse, чтобы тест завершился с ошибкой. Условие обязательно должно ссылаться на ресурс, источник данных, переменную, выходное значение или модуль из основного кода, иначе OpenTofu откажется запускать тест.error_message— строка с пояснением причины сбоя теста.
Например, блок assert можно записать так:
- main.tftest.hcl
- main.tf
run "test" {
assert {
condition = file(local_file.test.filename) == "Hello world!"
error_message = "Incorrect content in ${local_file.test.filename}."
}
}resource "local_file" "test" {
filename = "${path.module}/test.txt"
content = "Hello world!"
}Обратите внимание: условия позволяют выполнять только базовые проверки текущего состояния OpenTofu и использовать функции OpenTofu. Нельзя определять дополнительные источники данных непосредственно в коде теста. Обойти это ограничение можно с помощью блока module, чтобы загрузить вспомогательный модуль.
Блок run.module
В некоторых случаях средств, доступных в выражении условия, может быть недостаточно, чтобы проверить, правильно ли ваш код создал инфраструктуру.
Блок module позволяет переопределить основной модуль, который загружает tofu test. Это даёт возможность создавать дополнительные ресурсы или источники данных, которые можно использовать в условиях assert.
Синтаксис этого блока похож на синтаксис загрузки модулей в обычном коде OpenTofu:
run "test" {
module {
source = "./some-module"
}
}Блок module имеет следующие два атрибута:
- Атрибут
sourceуказывает на каталог модуля или реестр модулей. Удалённые источники в этом случае не допускаются. - Атрибут
versionзадаёт версию используемого модуля.
В блоке module нельзя напрямую передавать параметры, как это делается в обычном коде OpenTofu. Вместо этого используйте блок variables, чтобы передать параметры модулю.
В этом примере файл main.tf создаёт контейнер Docker с образом nginx, открывающий порт 8080. Файл main.tftest.hcl должен проверить, правильно ли запускается веб-сервер, но без вспомогательного модуля это сделать нельзя.
Чтобы создать источник данных http, файл main.tftest.hcl загружает модуль test-harness. Затем тестовый модуль загружает основной модуль и добавляет источник данных для проверки HTTP-ответа. Обратите внимание: источник данных в test-harness имеет явную зависимость от module.main, чтобы гарантировать, что он вернёт результат только после завершения работы основного модуля.
- main.tf
- main.tftest.hcl
- test-harness/helper.tf
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "3.0.2"
}
}
}
resource "docker_container" "webserver" {
name = "nginx-test"
image = "nginx"
ports {
internal = 80
external = 8080
}
}run "http" {
# Load the test helper instead of the main module:
module {
source = "./test-harness"
}
# Check if the webserver returned an HTTP 200 status code:
assert {
condition = data.http.test.status_code == 200
error_message = "Incorrect status code returned: ${data.http.test.status_code}"
}
}# Load the main module:
module "main" {
source = "../"
}
# Fetch the website so the assert can do its job:
data "http" "test" {
url = "http://localhost:8080"
# Important! Wait for the main module to finish:
depends_on = [module.main]
}В этом проекте для запуска контейнера используется сторонний провайдер. Проект можно запустить локально, если у вас установлен Docker Engine.
Блоки variables и run.variables
В проверяемом коде (например, main.tf) часто есть блоки переменных, которым нужно задать значения в тестовом сценарии. Передать переменные тестовому запуску можно одним из следующих способов:
| Порядок | Источник |
|---|---|
| 1 | Переменные среды с префиксом TF_VAR_. |
| 2 | Файлы tfvar, указанные в текущем каталоге: terraform.tfvars и *.auto.tfvars. |
| 3 | Файлы tfvar, указанные в каталоге тестов: tests/terraform.tfvars и tests/*.auto.tfvars. |
| 4 | Переменные командной строки, заданные флагом -var, и переменные из файлов, заданных флагом -var-file. |
| 5 | Переменные из блока variables в тестовом файле. |
| 6 | Переменные из блока variables в блоке run. |
OpenTofu обрабатывает переменные в указанном выше порядке, поэтому последующие значения могут переопределять ранее заданные. Например:
- main.tftest.hcl
- main.tf
# First, set the variable here:
variables {
name = "OpenTofu"
}
run "basic" {
assert {
condition = output.greeting == "Hello OpenTofu!"
error_message = "Incorrect greeting: ${output.greeting}"
}
}
run "override" {
# Override it for this test case only here:
variables {
name = "OpenTofu user"
}
assert {
condition = output.greeting == "Hello OpenTofu user!"
error_message = "Incorrect greeting: ${output.greeting}"
}
}variable "name" {}
output "greeting" {
value = "Hello ${var.name}!"
}Список run.expect_failures
В некоторых случаях может потребоваться протестировать намеренные ошибки в коде, например, чтобы убедиться в правильной работе проверки.
Внутри блока run можно использовать expect_failures, чтобы указать переменные или ресурсы, выполнение которых должно завершиться с ошибкой при запуске кода с заданными параметрами.
Например, приведённый ниже тестовый сценарий проверяет, что проверка переменной instances правильно завершается с ошибкой, если ей передать отрицательное число:
- main.tftest.hcl
- main.tf
run "main" {
command = plan
variables {
instances = -1
}
expect_failures = [
var.instances,
]
}variable "instances" {
type = number
validation {
condition = var.instances >= 0
error_message = "The number of instances must be positive or zero"
}
}Также можно использовать условие expect_failure для проверки событий жизненного цикла, таких как предварительные или последующие условия, а также результатов проверок.
В настоящее время список expect_failure не поддерживает тестирование ошибок создания ресурсов. Для использования expect_failure необходимо указать событие жизненного цикла.
В примере ниже проверяется, что неправильно настроенная проверка работоспособности завершается с ошибкой. Это гарантирует, что проверка работоспособности не будет всегда проходить успешно, даже если выполняется для неправильной конечной точки.
- main.tftest.hcl
- main.tf
run "test-failure" {
variables {
# This healthcheck endpoint won't exist:
health_endpoint = "/nonexistent"
}
expect_failures = [
# We expect this to fail:
check.health
]
}variable "health_endpoint" {
default = "/"
}
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "3.0.2"
}
}
}
resource "docker_container" "webserver" {
name = ""
image = "nginx"
rm = true
ports {
internal = 80
external = 8080
}
}
check "health" {
data "http" "www" {
url = "http://localhost:8080${var.health_endpoint}"
depends_on = [docker_container.webserver]
}
assert {
condition = data.http.www.status_code == 200
error_message = "Invalid status code returned: ${data.http.www.status_code}"
}
}Настройка run.command и блок run.plan_options
По умолчанию tofu test использует tofu apply для создания реальной инфраструктуры. В некоторых случаях, например если реальная инфраструктура очень дорогая или её невозможно использовать для тестирования, может быть полезно запускать только tofu plan. Вы можете использовать настройку command = plan, чтобы выполнить план вместо применения. В следующем примере проверяется, правильно ли переменная передаётся ресурсу docker_image, без фактического применения плана:
- main.tftest.hcl
- main.tf
run "test" {
command = plan
plan_options {
refresh = false
}
variables {
image_name = "myapp"
}
assert {
condition = docker_image.build.name == "myapp"
error_message = "Missing build resource"
}
}variable "image_name" {
default = "app"
}
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "3.0.2"
}
}
}
resource "docker_image" "build" {
name = var.image_name
build {
context = "."
}
}Независимо от настройки command, вы можете использовать блок plan_options, чтобы задать следующие дополнительные параметры для обоих режимов:
| Название | Описание |
|---|---|
| mode | Измените этот параметр с normal (значение по умолчанию) на refresh-only, чтобы только обновить локальное состояние на основе удалённой инфраструктуры. |
| refresh | Установите для этого параметра значение false, чтобы отключить проверку внешних изменений относительно файла состояния. Аналогично tofu plan -refresh=false. |
| replace | Принудительно замените указанный список ресурсов, например [docker_image.build] в примере выше. Аналогично tofu plan -replace=docker_image.build. |
| target | Ограничьте планирование указанным списком модулей или ресурсов. Аналогично tofu plan -target=docker_image.build. |
Эти параметры можно использовать вместе с переопределениями провайдеров для создания полностью автономных тестов. Пример приведён в разделе «Провайдеры» ниже.
Блок providers
В некоторых случаях может потребоваться переопределить настройки провайдера при запуске тестов. Вы можете использовать блоки provider вне блока run, чтобы задать дополнительные параметры конфигурации провайдеров, например учётные данные тестовой учётной записи.
provider "aws" {
// Add additional settings here
}Эта возможность также позволяет выполнять частично или полностью автономные тесты, если провайдер поддерживает такой режим. В следующем примере показан полностью автономный тест с провайдером AWS и ресурсом бакета S3:
- main.tftest.hcl
- main.tf
// Configure the AWS provider to run fake credentials and without
// any validations. Not all providers support this, but when they
// do, you can run fully offline tests.
provider "aws" {
access_key = "foo"
secret_key = "bar"
skip_credentials_validation = true
skip_region_validation = true
skip_metadata_api_check = true
skip_requesting_account_id = true
}
run "test" {
// Run in plan mode to skip applying:
command = plan
// Disable the refresh to prevent reaching out to the AWS API:
plan_options {
refresh = false
}
// Test if the bucket name is correctly passed to the aws_s3_bucket
// resource:
variables {
bucket_name = "test"
}
assert {
condition = aws_s3_bucket.test.bucket == "test"
error_message = "Incorrect bucket name: ${aws_s3_bucket.test.bucket}"
}
}variable "bucket_name" {}
provider "aws" {
region = "us-east-2"
}
resource "aws_s3_bucket" "test" {
bucket = var.bucket_name
}Псевдонимы провайдеров
Помимо переопределения провайдеров, вы можете назначать провайдерам псевдонимы, чтобы заменять их другими провайдерами внутри блока run. Это полезно, если нужно использовать две конфигурации провайдера в одном файле теста и переключаться между ними.
В приведённом ниже примере тестовый случай sockettest загружает конфигурацию провайдера Docker, отличную от используемой в остальной части файла.
- main.tftest.hcl
- main.tf
# This is the default "docker" provider for this file:
provider "docker" {
host = "tcp://0.0.0.0:2376"
}
# This will be the override:
provider "docker" {
alias = "unixsocket"
host = "unix:///var/run/docker.sock"
}
run "sockettest" {
# Replace the "docker" provider for this test case only:
providers = {
docker = docker.unixsocket
}
assert {
condition = docker_image.build.name == "myapp"
error_message = "Missing build resource"
}
}
// Add other tests with the original provider here.terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "3.0.2"
}
}
}
resource "docker_image" "build" {
name = "myapp"
build {
context = "."
}
}Блоки mock_provider
Блок mock_provider позволяет заменить конфигурацию провайдера имитационной конфигурацией. В этом случае создание и получение ресурсов и источников данных провайдера пропускается. Вместо этого OpenTofu автоматически генерирует все вычисляемые атрибуты и блоки, которые будут использоваться в тестах.
Подробнее о том, как OpenTofu создаёт автоматически сгенерированные значения.
Имитационные провайдеры также поддерживают поле alias, а также блоки mock_resource и mock_data. В некоторых случаях вместо автоматически сгенерированных значений могут потребоваться значения по умолчанию. Для этого передайте их в поле defaults блоков mock_resource или mock_data.
Кроме того, можно использовать блоки override_resource и override_data для переопределения ресурсов или источников данных в области действия одного провайдера. Подробнее о переопределении см. в следующем разделе.
В приведённом ниже примере проверяется, правильно ли имя бакета передаётся ресурсу, без его фактического создания:
- main.tftest.hcl
- main.tf
// All resources and data sources provided by `aws.mock` provider
// will be mocked. Their values will be automatically generated.
mock_provider "aws" {
alias = "mock"
}
// The same goes for `local` provider. Also, every `local_file`
// data source will have its `content` set to `test`.
mock_provider "local" {
mock_data "local_file" {
defaults = {
content = "test"
}
}
}
// Test if the bucket name is correctly passed to the aws_s3_bucket
// resource from the local file.
run "test" {
// Use `aws.mock` provider for this test run only.
providers = {
aws = aws.mock
}
assert {
condition = aws_s3_bucket.test.bucket == "test"
error_message = "Incorrect bucket name: ${aws_s3_bucket.test.bucket}"
}
}data "local_file" "bucket_name" {
filename = "bucket_name.txt"
}
provider "aws" {
region = "us-east-2"
}
resource "aws_s3_bucket" "test" {
bucket = data.local_file.bucket_name.content
}Блоки override_resource и override_data
В некоторых случаях может потребоваться протестировать инфраструктуру с переопределёнными ресурсами или источниками данных. Вы можете использовать блоки override_resource или override_data, чтобы пропустить создание и получение этих ресурсов или источников данных с помощью реального провайдера. Вместо этого OpenTofu автоматически генерирует все вычисляемые атрибуты и блоки, которые будут использоваться в тестах.
Подробнее о том, как OpenTofu создаёт автоматически сгенерированные значения.
Эти блоки состоят из следующих элементов:
| Название | Тип | Описание |
|---|---|---|
| target | reference | Обязательный параметр. Адрес целевого ресурса или источника данных, который нужно переопределить. |
| values | object | Пользовательские значения вычисляемых атрибутов и блоков, которые будут использоваться вместо автоматически сгенерированных. |
Блоки override_resource или override_data можно использовать для всего файла тестов или внутри отдельного блока run. Если оба блока заданы для одного и того же target, приоритет имеет последний.
В приведённом ниже примере проверяется, правильно ли имя бакета передаётся ресурсу, без его фактического создания:
- main.tftest.hcl
- main.tf
// This data source will not be called for any run
// in this `.tftest.hcl` file. Instead, `values` object
// will be used to populate `content` attribute. Other
// attributes and blocks will be automatically generated.
override_data {
target = data.local_file.bucket_name
values = {
content = "test"
}
}
// Test if the bucket name is correctly passed to the aws_s3_bucket
// resource from the local file.
run "test" {
// S3 bucket will not be created in AWS for this run,
// but it's available to use in both tests and configuration.
override_resource {
target = aws_s3_bucket.test
}
assert {
condition = aws_s3_bucket.test.bucket == "test"
error_message = "Incorrect bucket name: ${aws_s3_bucket.test.bucket}"
}
}data "local_file" "bucket_name" {
filename = "bucket_name.txt"
}
provider "aws" {
region = "us-east-2"
}
resource "aws_s3_bucket" "test" {
bucket = data.local_file.bucket_name.content
}Нельзя использовать override_resource или override_data для отдельного экземпляра ресурса или источника данных. Необходимо переопределить каждый экземпляр ресурса или источника данных.
Автоматически сгенерированные значения
Для имитации ресурсов и источников данных OpenTofu требуется автоматически генерировать вычисляемые атрибуты, не вызывая соответствующие провайдеры. При генерации этих значений OpenTofu не может использовать пользовательскую логику провайдера, поэтому применяет простые правила, основанные на типе значения:
| Тип атрибута | Сгенерированное значение |
|---|---|
| number | 0 |
| bool | false |
| string | Случайная буквенно-цифровая строка. |
| list | Пустой список. |
| map | Пустое отображение. |
| set | Пустое множество. |
| object | Объект, поля которого заполняются по той же логике рекурсивно. |
| tuple | Пустой кортеж. |
Вместо автоматически сгенерированных можно указать пользовательские значения в соответствующих полях имитации или переопределения. Учтите, что это возможно только для вычисляемых атрибутов; значения конфигурации изменить нельзя.
Блок override_module
В некоторых случаях может потребоваться протестировать инфраструктуру с переопределёнными вызовами модулей. Вы можете использовать блок override_module, чтобы игнорировать всю конфигурацию, предоставленную вызываемым модулем. В этом случае OpenTofu будет использовать пользовательские значения, заданные в блоке override_module, в качестве выходных данных модуля.
Блок состоит из следующих элементов:
| Название | Тип | Описание |
|---|---|---|
| target | reference | Обязательный параметр. Адрес целевого вызова модуля, который нужно переопределить. |
| outputs | object | Значения, используемые в качестве выходных данных вызова модуля. Если выходное значение не задано, OpenTofu по умолчанию присвоит ему null. |
Блок override_module можно использовать для всего файла тестов или внутри отдельного блока run. Если оба блока заданы для одного и того же target, приоритет имеет последний.
В приведённом ниже примере проверяется, правильно ли имя бакета передаётся из модуля, без его фактического вызова:
- main.tftest.hcl
- main.tf
- bucket_meta/main.tf
// All the module configuration will be ignored for this
// module call. Instead, the `outputs` object will be used
// to populate module outputs.
override_module {
target = module.bucket_meta
outputs = {
name = "test"
tags = {
Environment = "Test Env"
}
}
}
// Test if the bucket name is correctly passed to the aws_s3_bucket
// resource from the module call.
run "test" {
// S3 bucket will not be created in AWS for this run,
// but it's available to use in both tests and configuration.
override_resource {
target = aws_s3_bucket.test
}
assert {
condition = aws_s3_bucket.test.bucket == "test"
error_message = "Incorrect bucket name: ${aws_s3_bucket.test.bucket}"
}
assert {
condition = aws_s3_bucket.test.tags["Environment"] == "Test Env"
error_message = "Incorrect `Environment` tag: ${aws_s3_bucket.test.tags["Environment"]}"
}
}module "bucket_meta" {
source = "./bucket_meta"
}
provider "aws" {
region = "us-east-2"
}
resource "aws_s3_bucket" "test" {
bucket = module.bucket_meta.name
tags = module.bucket_meta.tags
}data "local_file" "bucket_name" {
filename = "bucket_name.txt"
}
output "name" {
value = data.local_file.bucket_name.content
}
output "tags" {
value = {
Environment = "Dev"
}
}Нельзя использовать override_module для отдельного экземпляра вызова модуля. Необходимо переопределить каждый экземпляр вызова модуля.
Copyright (c) The OpenTofu Authors
Copyright (c) 2014 HashiCorp, Inc.
Mozilla Public License, version 2.0
https://opentofu.org/docs/v1.9/cli/commands/test/