繁体   English   中英

Terraform - 复制 AWS SSM 参数

[英]Terraform - Copy AWS SSM Parameters

长期潜伏者第一次海报

寻求大家的指导。 我正在尝试复制 aws 命令以从本质上获取参数(ssm get-parameters-by-path),然后循环遍历参数并获取它们,然后循环遍历并将它们放入新参数(ssm put-parameter)

我知道 TF 中有一个 for 循环表达式,但是对于我的一生,我无法将如何实现这一点放在一起。

任何和所有的帮助将不胜感激!

我明白,一开始并不容易。 我将尝试逐步详细说明我是如何实现这一目标的。

无论如何,包含您之前尝试过的任何代码都很好,即使它不起作用。

因此,首先我创建了一些示例参数:

# create_parameters.tf
resource "aws_ssm_parameter" "p" {
  count = 3
  name  = "/test/${count.index}/p${count.index}"
  type  = "String"
  value = "test-${count.index}"
}

然后我尝试查看它们:

# example.tf
data "aws_ssm_parameters_by_path" "parameters" {
  path = "/test/"
  recursive = true
}
output "params_by_path" {
  value = data.aws_ssm_parameters_by_path.parameters
  sensitive = true
}

作为我收到的输出: terraform output params_by_path

{
  "arns" = tolist([
    "arn:aws:ssm:eu-central-1:999999999999:parameter/test/0/p0",
    "arn:aws:ssm:eu-central-1:999999999999:parameter/test/1/p1",
    "arn:aws:ssm:eu-central-1:999999999999:parameter/test/2/p2",
  ])
  "id" = "/test/"
  "names" = tolist([
    "/test/0/p0",
    "/test/1/p1",
    "/test/2/p2",
  ])
  "path" = "/test/"
  "recursive" = true
  "types" = tolist([
    "String",
    "String",
    "String",
  ])
  "values" = tolist([
    "test-0",
    "test-1",
    "test-2",
  ])
  "with_decryption" = true
}

aws_ssm_parameters_by_path在没有额外处理的情况下是不可用的,因此我们需要使用另一个数据源,来为提供的参数的副本获取合适的对象。 在我找到aws_ssm_parameter的文档中。 但是,要使用它,我需要参数的全名。

我在前一阶段检索到的参数名称列表,所以现在只需要遍历它们:

# example.tf    
locals {
  names = toset(data.aws_ssm_parameters_by_path.parameters.names)
}

data "aws_ssm_parameter" "param" {
  for_each = local.names
  name = each.key
}
output "params" {
  value = data.aws_ssm_parameter.param
  sensitive = true
}

结果,我得到: terraform output params

{
  "/test/0/p0" = {
    "arn" = "arn:aws:ssm:eu-central-1:999999999999:parameter/test/0/p0"
    "id" = "/test/0/p0"
    "name" = "/test/0/p0"
    "type" = "String"
    "value" = "test-0"
    "version" = 1
    "with_decryption" = true
  }
  "/test/1/p1" = {
    "arn" = "arn:aws:ssm:eu-central-1:999999999999:parameter/test/1/p1"
    "id" = "/test/1/p1"
    "name" = "/test/1/p1"
    "type" = "String"
    "value" = "test-1"
    "version" = 1
    "with_decryption" = true
  }
  "/test/2/p2" = {
    "arn" = "arn:aws:ssm:eu-central-1:999999999999:parameter/test/2/p2"
    "id" = "/test/2/p2"
    "name" = "/test/2/p2"
    "type" = "String"
    "value" = "test-2"
    "version" = 1
    "with_decryption" = true
  }
}

每个参数对象都已被检索,因此现在可以创建新参数 - 可以这样完成:

# example.tf
resource "aws_ssm_parameter" "new_param" {
  for_each = local.names
  name  = "/new_path${data.aws_ssm_parameter.param[each.key].name}"
  type  = data.aws_ssm_parameter.param[each.key].type
  value = data.aws_ssm_parameter.param[each.key].value
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM