使用jq从bash中使用aws cli命令从日志桶失败获取S3日志



下面的脚本旨在获取S3日志桶中每个条目的内容,并将其保存到一个文件

#!/bin/bash
#
# Get the content of each entry in the S3 logging bucket and save it to a file 
#
LOGGING_BUCKET=dtgd-hd00
aws s3api list-objects-v2 --bucket "$LOGGING_BUCKET" | jq '.Contents' >> entries.json &&
keys=$(jq '.[].Key' entries.json )
for key in $keys;do
echo $key
aws s3api get-object --bucket "$LOGGING_BUCKET" --key "$key" ouput_file_"$key"
done

执行后得到:

调用GetObject操作时发生错误(NoSuchKey):指定的键不存在。

"dtgd-hd00/logs2021 - 08 - 10 - 05 - 43 - 18 - 01393 - d975686fa45"

但是,如果我从CLI中执行:

aws s3api get-object --bucket dtgd-hd00 
--key "dtgd-hd00/logs2021-08-10-05-43-18-01393D975686FA45" 
output_file_"$key"

它工作完美,获取内容并按要求将其保存到输出文件。

怎么了??

变量$key将是一个引号字符串,因此您基本上是双引号字符串,并且S3无法找到带有引号的"key_name"。您可以在传递它们之前删除引号:

for key in $keys;do
key="${key%"}"
key="${key#"}"
aws s3api get-object --bucket "$LOGGING_BUCKET" --key "$key" ouput_file_"$key"
done

当然,使用aws s3 sync会更高效,并完全避免这个问题。