#terraform #terraform-provider-aws
#terraform #terraform-provider-aws
Вопрос:
У меня следующая структура папок:
infrastructure
└───security-groups
│ │ main.tf
│ │ config.tf
│ │. security_groups.tf
│
└───instances
│ main.tf
│ config.tf
│ instances.tf
Я хотел бы сослаться на идентификатор группы безопасности, созданный в папке security-groups, по ссылке.
Я попытался вывести требуемые идентификаторы в security_groups.tf файл с
output "sg_id" {
value = "${aws_security_group.server_sg.id}"
}
А затем в файле instances добавьте его в качестве модуля:
module "res" {
source = "../security-groups"
}
Проблема с этим подходом заключается в том, что когда я выполняю terraform apply в папке instances , он также пытается создать группы безопасности (которые я уже создал, выполнив terraform apply в папке security-groups), и это завершается неудачей, поскольку SGS существуют.
Каков был бы самый простой способ ссылаться на ресурсы, созданные в другой папке, без изменения структуры кода?
Спасибо.
Ответ №1:
Для ссылки на существующий ресурс вам необходимо использовать data
блок. Вы не будете ссылаться непосредственно на блок ресурсов в другой папке, а вместо этого укажите имя, идентификатор или любой другой уникальный идентификатор, который у него есть. Итак, для группы безопасности вы должны добавить что-то вроде
data "aws_security_group" "sg" {
name = "the-security-group-name"
}
в вашу папку instances и обратитесь к этой сущности, чтобы связать ваши экземпляры с этой группой безопасности.
Вам также следует подумать, действительно ли вы хотите просто применять terraform ко всему дереву, а не к каждой папке в отдельности. Тогда вы можете напрямую ссылаться на все свои управляемые ресурсы, как вы пытаетесь сделать, и вам не нужно вызывать terraform apply
столько раз.
Ответ №2:
Хотя ответ lxop является лучшей практикой, если вам действительно нужно ссылаться на выходные данные в другой локальной папке, вы можете сделать это следующим образом:
data "terraform_remote_state" "sg" {
backend = "local"
config = {
path = "../security-groups/terraform.tfstate"
}
}
а затем обратитесь к нему, используя, например
locals {
sgId = data.terraform_remote_state.sg.outputs.sg_id
}