来自 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
并完全避免这个问题会更高效。
以下脚本旨在获取 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
并完全避免这个问题会更高效。