Curl生成JSON错误将JS文件保存在Terraform数据中

mccptt67  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(89)

我有一个test.js文件,我试图拉在我的Terraform文件夹中,如下所示:

data external "file"{
    program = ["curl", "-o", "Content-Type:application/js", "${path.pwd}/testing.js", "https://raw.github.com/test/test.js"]
}

继续获取命令“curl”产生的无效JSON:JSON输入的意外结束。当我尝试在PC上本地 curl 时,它可以工作。

64jmpszr

64jmpszr1#

external数据源是在Terraform中没有其他数据源可以满足您的需求时的最后手段。
在本例中,您似乎希望从远程HTTP端点获取JSON数据。如果是这样,使用the http data source就不那么复杂了:

data "http" "example" {
  url = "https://raw.github.com/test/test.js"
}

然后,您可以使用data.http.example.response_body来处理从该URL返回的数据。
你提到的URL实际上并不起作用,所以我假设你有一些其他的URL,你打算在实践中使用。如果有问题的URL返回JavaScript,那么您可能只是将其作为普通字符串使用,因为Terraform没有内置的解析或处理JavaScript代码的功能。
如果您尝试访问的真实的URL实际上返回 JSON 而不是JavaScript,则可以使用the jsondecode function访问该JSON表示的数据结构。例如,您可以将结果分配给named local value,以便您可以从模块中的多个位置使用它:

locals {
  example_data = jsondecode(data.http.example.response_body)
}

在模块的其他地方,local.example_data将引用解码JSON数据后得到的值,假设主体确实包含有效的JSON。如果没有,那么您将看到与external数据源类似的错误:jsondecode函数只能解码有效的JSON数据。

ghhkc1vu

ghhkc1vu2#

问题不在于curl失败了,而是你没有产生terraform可以使用的输出。你必须生成一个json blob。下面是我使用的外部脚本:用途:

data "external" "terraform_versions" {
  program = ["scripts/terraform_versions.sh"]
}
#!/bin/bash

BRANCH=$(git rev-parse --abbrev-ref HEAD)
COMMIT=$(git rev-parse HEAD)

jq -n --arg branch "${BRANCH}" --arg commit "${COMMIT}" '{"branch":$branch, "commit":$commit}'

其输出数据为:

{
  "branch": "master",
  "commit": "abc123deadbeef..."
}

哪些terraform可以消耗:

resource "aws_ssm_parameter" "terraform_branch" {
  name = "/${terraform.workspace}/tf/branch"
  type = "SecureString"
  value = data.external.terraform_versions.result["branch"]
  overwrite = true
}

resource "aws_ssm_parameter" "terraform_commit" {
  name = "/${terraform.workspace}/tf/commit"
  type = "SecureString"
  value = data.external.terraform_versions.result["commit"]
  overwrite = true
}

更多here
编辑:我个人从未使用过它,但有一个http提供程序可能更适合你的需要。参见here

相关问题