我想要一个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}'