Terraform外部数据源格式化问题



我想要一个s3 bucket在TF中的列表。

使用AWS CLI,我可以获得该列表并将其格式化为JSON:

my-mac$ eval aws s3 ls | awk '{print $3}' | jq -R -s -c 'split("n")' | jq '.[:-1]'
[
"xxx-bucket-1",
"xxx-bucket-2"
]

但是TF不取回它,这让我很恼火。

这是我的数据源配置:

data "external" "bucket_objects" {
program = ["bash", "cli.sh"]
}

shell脚本文件内容:

#!/bin/bash
set -e
eval aws s3 ls | awk '{print $3}' | jq -R -s -c 'split("n")' | jq '.[:-1]'

最后,错误信息:

│ Error: Unexpected External Program Results
│ 
│   with data.external.bucket_objects,
│   on data.tf line 22, in data "external" "bucket_objects":
│   22:   program = ["bash", "cli.sh"]
│ 
│ The data source received unexpected results after executing the program.
│ 
│ Program output must be a JSON encoded map of string keys and string values.
│ 
│ If the error is unclear, the output can be viewed by enabling Terraform's
│ logging at TRACE level. Terraform documentation on logging:
│ https://www.terraform.io/internals/debugging
│ 
│ Program: /bin/bash
│ Result Error: json: cannot unmarshal array into Go value of type
│ map[string]string

我的shell脚本游戏很弱,它将是一些愚蠢的东西,但我不知道那是什么。

下面是我的例子:

#!/bin/bash
set -e
BUCKET_NAMES=$(aws s3 ls | awk '{print $3}' | jq -R -s -c 'split("n")' | jq '.[:-1]')
jq -n --arg bucket_names "$BUCKET_NAMES" '{"bucket_names":$bucket_names}'