如何在 Terraform 外部数据源中使用 AWS cli 命令

Ern*_*ert 4 amazon-web-services terraform terraform-provider-aws

如果我单独运行以下命令,我会得到预期的结果 -

这 :

aws cloudfront list-cloud-front-origin-access-identities | jq -r ' .CloudFrontOriginAccessIdentityList.Items[] | select(.Comment == "Created for Nackle Shared CF in pprd").Id'
Run Code Online (Sandbox Code Playgroud)

返回这个:

E1P6ZIBDB6I6FZ
Run Code Online (Sandbox Code Playgroud)

如何使用 Terraform 外部数据源获得相同的结果?

我试过这个:

data "external" "json" {
program = ["sh", "-c", "aws cloudfront list-cloud-front-origin-access-identities | jq -r ' .CloudFrontOriginAccessIdentityList.Items[] | select(.Comment == "Created for Nackle Shared CF in pprd").Id'"] 
}

output "map" {
value = ["${values(data.external.json.result)}"] 
}
Run Code Online (Sandbox Code Playgroud)

但当我运行 Terraform apply 时它返回此错误 -

Expected a comma to mark the beginning of the next item.
Run Code Online (Sandbox Code Playgroud)

我假设正确写入时“值”将是 E1P6ZIBDB6I6FZ ?

如何将该值用作地形另一部分中的变量?

有没有不同的方法来解决这个问题?

我是 Terraform 的新手,从未使用过外部数据源。

Mar*_*cin 5

外部数据源的json解析能力非常有限。它应该是(转义引号并返回新的 json):

data "external" "json" {
program = ["sh", "-c", "aws cloudfront list-cloud-front-origin-access-identities | jq -r ' .CloudFrontOriginAccessIdentityList.Items[] | select(.Comment == \"Created for Nackle Shared CF in pprd\") |  {id: .Id}'"] 
}
Run Code Online (Sandbox Code Playgroud)

然后您可以通过以下方式访问 Id:

data.external.json.result["id"]
Run Code Online (Sandbox Code Playgroud)