Terraform - переменная внутри переменной - PullRequest
1 голос
/ 07 января 2020

Я хотел бы использовать переменную внутри переменной.

Это мой ресурс:

resource "aws_route" "vpc_peering_accepter" {
provider = "aws.accepter"
count = length(data.terraform_remote_state.vpc.outputs.${var.region}-vpc-private_routing_tables)
route_table_id = tolist(data.terraform_remote_state.vpc.outputs.${var.region}-vpc-private_routing_tables)[count.index]
destination_cidr_block = var.vpc_cidr
vpc_peering_connection_id = aws_vpc_peering_connection.peer.*.id[0]
}

Конечно, этот не работает. Какая лучшая практика для этого?

Спасибо, Elad

Ответы [ 2 ]

1 голос
/ 07 января 2020

Вы можете объединить Локальные значения с функцией поиска для выполнения sh this.

В следующем примере нулевой источник данных имитирует data.terraform_remote_state.vpc.outputs:

variable "region" {
  default = "us-east1"
}

locals {
  vpc_private_routing_tables = "${var.region}-vpc-private_routing_tables"
}

data "null_data_source" "values" {
  inputs = {
    us-east1-vpc-private_routing_tables = "11111111"
    us-east2-vpc-private_routing_tables = "22222222"
  }
}

output "vpc_peering" {
  value = lookup(data.null_data_source.values.inputs, local.vpc_private_routing_tables)
}
0 голосов
/ 08 января 2020

Поскольку data.terraform_remote_state.vpc.outputs является отображением, вы можете использовать синтаксис атрибута или синтаксис индекса для доступа к значениям внутри:

  • Синтаксис атрибута: data.terraform_remote_state.vpc.outputs.us-west-1-vpc-private_routing_tables
  • Синтаксис индекса: data.terraform_remote_state.vpc.outputs["us-west-1-vpc-private_routing_tables"]

Преимущество синтаксиса индекса заключается в том, что вы можете использовать любое выражение в этих скобках, если его результатом является строка. В частности, вы можете использовать синтаксис интерполяции шаблона:

data.terraform_remote_state.vpc.outputs["${var.region}-vpc-private_routing_tables"]

С учетом сказанного, в такой ситуации, когда вы производите одну и ту же информацию для ряда различных объектов - в данном случае регионов - - более обычным является объединение всех этих значений в одно отображение при объявлении выходных данных, так что эти связанные значения явно группируются в одну коллекцию. Например:

output "vpc_private_routing_table_ids" {
  value = {
    us-east-1 = aws_route_table.us-east-1.id
    us-west-2 = aws_route_table.us-west-2.id
  }
}

Затем с точки зрения потребителя, то есть модуля, который использует data "terraform_remote_state" для доступа к этим выходам, это выглядит как простая карта, обозначенная областью:

data.terraform_remote_state.vpc.outputs.vpc_private_routing_table_ids[var.region]

Если вы создаете много разных объектов для каждого региона, вы можете собрать все их идентификаторы в один выход, что может быть удобнее для использования в других местах:

output "regions" {
  value = {
    us-east-1 = {
      vpc_id                 = aws_vpc.us-east-1.id
      subnet_ids             = aws_subnet.us-east-1[*].id
      private_route_table_id = aws_route_table.us-east-1.id
    }
    us-west-1 = {
      vpc_id                 = aws_vpc.us-west-1.id
      subnet_ids             = aws_subnet.us-west-1[*].id
      private_route_table_id = aws_route_table.us-west-1.id
    }
  }
}

... который будет выглядеть следующим образом в потребительском модуле:

data.terraform_remote_state.vpc.outputs.regions[var.region].private_route_table_id

В конечном итоге вы можете структурировать выходные значения так, как вам нравится, но я бы порекомендовал выбрать форму, которая оптимизирует для ясности в конфигурации, которая ссылается на данные. Обычно это означает, что ссылочные выражения должны быть максимально простыми, и в идеале избегать сложных выражений, таких как синтаксис строковых шаблонов, когда это возможно.

...