在terraform中动态导入dynamodb的二级索引

时间:2019-08-23 20:54:17

标签: amazon-dynamodb terraform terraform-provider-aws

我正在尝试将几个dynamodb表导入terraform。我一直在研究如何动态处理环境之间的全局二级索引。 对于每个环境,我都有一个模块和两个状态文件。

我如何使用count来动态输入这些变量,这些变量会在环境之间变化

例如,在下面的示例中,有4个索引,但是对于prod帐户中的特定索引,读容量和写容量会发生变化,而所有其他变量均保持不变。

ie last-index对prod和nonprod的读写容量值不同

如何在Terraform中实现它?

模块:

locals {
  name           = ["xxx-index","xxx-index","xxx-index","xxx-index","last-index"]
  write_capacity = [ 5,5,5,5,5]
  read_capacity  = [ 5,5,5,5,5]
  range_key      = ["xxx","xxx","xxx","xxx","xxx"]

}

  global_secondary_index {
    count           = "${length(local.name)}"
    name            = "${element(local.name, count.index)}"
    write_capacity  = "${element(local.write_capacity, count.index)"
    read_capacity   = "${element(local.read_capacity, count.index)"
    hash_key        = "userId"
    range_key       = "${element(local.range_key,count.index)}"
    projection_type = "ALL"
  }
  

Terraform -version Terraform v0.11.13   + provider.aws v2.25.0

1 个答案:

答案 0 :(得分:2)

对于Terraform 0.11,没有合理的答案。它缺少描述您要查找的转换所需的原语,并且不支持动态生成嵌套块。

Terraform 0.11中最受支持的功能是将索引数固定为常数,但仍会更改各个部分,例如:

resource "aws_dynamodb_table" "example" {
  # ...

  global_secondary_index {
    name            = "${local.name[0]}"
    write_capacity  = "${local.write_capacity[0]}"
    read_capacity   = "${local.read_capacity[0]}"
    range_key       = "${local.range_key[0]}"
    hash_key        = "userId"
    projection_type = "ALL"
  }

  global_secondary_index {
    name            = "${local.name[1]}"
    write_capacity  = "${local.write_capacity[1]}"
    read_capacity   = "${local.read_capacity[1]}"
    range_key       = "${local.range_key[1]}"
    hash_key        = "userId"
    projection_type = "ALL"
  }

  global_secondary_index {
    name            = "${local.name[2]}"
    write_capacity  = "${local.write_capacity[2]}"
    read_capacity   = "${local.read_capacity[2]}"
    range_key       = "${local.range_key[2]}"
    hash_key        = "userId"
    projection_type = "ALL"
  }

  global_secondary_index {
    name            = "${local.name[3]}"
    write_capacity  = "${local.write_capacity[3]}"
    read_capacity   = "${local.read_capacity[3]}"
    range_key       = "${local.range_key[3]}"
    hash_key        = "userId"
    projection_type = "ALL"
  }

  global_secondary_index {
    name            = "${local.name[4]}"
    write_capacity  = "${local.write_capacity[4]}"
    read_capacity   = "${local.read_capacity[4]}"
    range_key       = "${local.range_key[4]}"
    hash_key        = "userId"
    projection_type = "ALL"
  }
}

为处理此用例而添加的新Terraform 0.12功能是dynamic blocks,它允许根据集合值生成零个或多个特定类型的块。

例如:

locals {
  indices = {
    "xxx-index" = {
      write_capacity = 5
      read_capacity  = 5
      range_key      = "xxx"
    },
    "last-index" = {
      write_capacity = 5
      read_capacity  = 5
      range_key      = "xxx"
    },
  }
}

resource "aws_dynamodb_table" "example" {
  # ...

  dynamic "global_secondary_index" {
    for_each = local.indices
    content {
      name            = global_secondary_index.key
      write_capacity  = global_secondary_index.value.write_capacity
      read_capacity   = global_secondary_index.value.read_capacity
      range_key       = global_secondary_index.value.range_key
      hash_key        = "userId"
      projection_type = "ALL"
    }
  }
}