来自 bash 的带有 jq 的 aws cli 命令从日志存储桶中获取 S3 日志失败

aws cli command from bash with jq to get S3 logs from logging bucket failing

以下脚本旨在获取 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

执行后得到:

An error occurred (NoSuchKey) when calling the GetObject operation: The specified key does not exist.

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

但是,如果我从 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 并完全避免这个问题会更高效。