Ссылка на ресурс Terraform, созданный в другой папке

#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
}