Terraform 在自定义地形提供程序中使地图值敏感

Terraform 在自定义地形提供程序中使地图值敏感,terraform,Terraform,我正在编写一个定制的Terraform提供程序,我有一个资源,它有一个参数,它是map[string]string,可能包含敏感值。我想使值敏感,但不是键。我尝试将映射中Elem的Sensitive属性设置为true(参见下面的示例),但在计划阶段,我仍然可以从控制台打印出值 return&schema.Resource{ // ... Schema:map[string]*Schema.Schema{ “敏感地图”:{ 类型:schema.TypeMap, 可选:true, 元素:&schem

我正在编写一个定制的Terraform提供程序,我有一个资源,它有一个参数,它是
map[string]string
,可能包含敏感值。我想使值敏感,但不是键。我尝试将映射中
Elem
Sensitive
属性设置为true(参见下面的示例),但在计划阶段,我仍然可以从控制台打印出值

return&schema.Resource{
// ...
Schema:map[string]*Schema.Schema{
“敏感地图”:{
类型:schema.TypeMap,
可选:true,
元素:&schema.schema{
类型:schema.TypeString,
//敏感:对,,
},
},
},
}
计划阶段输出示例:

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # deploy_project.this will be created
  + resource "my_resource" "this" {
      + sensitive_map                  = {
          + "key" = "value"
        }
      + id                        = (known after apply)
    }

Plan: 1 to add, 0 to change, 0 to destroy.

如何将值标记为敏感而不是密钥?

在Terraform SDK当前的敏感模型中,无法实现您的目标。一次为整个属性设置敏感度,而不是为属性的部分设置敏感度

尽管为了方便起见,SDK模型重新使用
*schema.schema
作为
Elem
的可能类型,但实际上只有
schema.schema
字段的一小部分可以在该位置工作,因为这样的声明与在Terraform模块中声明如下变量大致相同:

variable "sensitive_map" {
  type      = map(string)
  sensitive = true
}

请注意,“敏感”概念适用于整个变量。它不是变量类型约束的一部分,因此没有任何方法将“敏感字符串映射”写为类型约束。尽管提供程序参数实际上不是模块变量,但它们仍然与变量参与相同的值和类型系统,因此具有类似的功能集。

我最终选择了使用嵌套块而不是简单映射的解决方案。模式定义比一个简单的映射更复杂,它使得userland配置更加详细,但它确实很好地满足了我最初的需求

“敏感地图”:{
类型:schema.TypeList,
可选:true,
元素:&schema.Resource{
Schema:map[string]*Schema.Schema{
“关键”:{
类型:schema.TypeString,
要求:正确,
元素:&schema.schema{Type:schema.TypeString},
},
“价值”:{
类型:schema.TypeString,
要求:正确,
敏感:对,,
元素:&schema.schema{Type:schema.TypeString},
},
},
},
},
它在计划阶段显示为:

  + resource "my_resource" "this" {
      + sensitive_map {
          + key   = "foo"
          + value = (sensitive value)
        }
    }
它将Go中的表示形式从
map[string]string
更改为
map[string]接口{}
,其中空接口本身就是
map[string]string
。在资源的Create钩子中,解析输入配置的代码如下所示:

sensitiveMap:=make(client.EnvVars)
tmp:=d.Get(“敏感映射”)([]接口{})
对于u,v:=范围tmp{
keyval:=v.(映射[字符串]接口{})
变量[keyval[“key”](字符串)]=keyval[“value”](字符串)
}

我相信它可以进一步优化,但现在它工作得很好

我仔细检查了文档,它似乎确认了
敏感
不是Terraform资源模式的行为字段。假设sdk2和TF>=0.13等,这可能会以问题中编码的方式实现(如果可能)。实际上,这种行为是(我相信)选择加入而不是选择退出,因此是在TF配置中配置的,而不是在提供者中配置的。但是我可能错了。@MattSchuchard我在使用sdk v2和terraform 0.14.5,我还尝试在地图本身而不是元素上放置
敏感
标志,它在计划输出中将其标记为敏感,但它将整个地图标记为敏感,包括键是的,这正是我害怕的——我会尝试一些嵌套块的方法,看看效果如何是的,所以我把它变成了一个嵌套块列表,这让我可以更好地控制模式