使用外部变量导致意外的对象

Using external variable leads to unexpected object

我想从网站获取令牌,然后在后续资源中使用该令牌。我正在使用 external 提供程序从 bash 脚本获取令牌,然后在后期使用它:

data "external" "token" {
  program = ["sh", "./token.sh"]

  query = {
    api_key = var.api_key
  }
}

token.sh 如下所示:

#!/usr/bin/env sh
####################
set -e
TOKEN=`curl -X POST <some url>`
jq -n --arg token "$TOKEN" '{"token":$token}'

要访问 $TOKEN,我正在使用 data.external.token。我收到错误消息:data.external.token is object with 5 attributes

我尝试在脚本中只执行 TOKEN='FOO' 并得到相同的错误,所以我认为我的 curl 字符串不是问题所在。我不明白为什么脚本不起作用...此外,是否有调试 terraform 的好方法,尤其是 运行 时间变量?

让我从这个开始:

Also, is there any good way to debug terraform especially run time variables?

是的,您可以使用 Terraform 输出进行调试。例如:

output "token_output" {
  value = data.external.token
}

将输出如下内容:

token_output = {
  "id" = "-"
  "program" = tolist([
    "sh",
    "./token.sh",
  ])
  "query" = tomap({
    "api_key" = "foo"
  })
  "result" = tomap({
    "token" = "some token"
  })
  "working_dir" = tostring(null)
}

我认为这可以解释为什么会出现以下错误:

data.external.token is object with 5 attributes

您要查找的是 result 属性(也记录在 attribute references 中)。您可以这样引用它:

output "result" {
  value = data.external.token.result
}

为了进一步调试,除了输出,你还可以使用terraform console命令。这将启动一个 REPL,您可以在其中查看您所在州的资源内容。