You need to enable JavaScript to run this app. Bash中用带jq的AWS CLI拉取S3日志桶文件报NoSuchKey问题
优惠活动
大模型
产品
解决方案
定价
更多

Bash中用带jq的AWS CLI拉取S3日志桶文件报NoSuchKey问题

故障原因
  • 核心问题是jq命令未添加-r(原始输出)参数:默认jq输出JSON格式的字符串,会给提取到的键名自动包裹双引号,也就是说你脚本中$key变量的值本身就包含首尾的双引号字符,传给aws s3api get-object的--key参数时,相当于请求的S3对象键名自带双引号,S3端不存在该名称的对象,因此抛出NoSuchKey错误。你手动执行命令时写的--key "xxx"中的双引号是Shell的参数边界符,仅用来标注参数的首尾范围,不会被作为参数内容传递给awscli,因此可以正常执行。
  • 次要风险点:原脚本用for key in $keys的写法遍历键名,如果S3对象键名包含空格、换行等特殊字符,Shell会将单个键拆分为多个值,也会导致请求的键名不完整触发同类报错。
  • 额外笔误:原脚本中输出文件名写为ouput_file_,少了字母t,虽不影响本次报错,但会导致输出文件名不符合预期。
修复后的参考脚本
#!/bin/bash
#
# Get the content of each entry in the S3 logging bucket and save it to a file 
#

LOGGING_BUCKET=dtgd-hd00

# 直接通过管道传递键名,无需生成临时json文件,同时用read避免特殊字符拆分问题
aws s3api list-objects-v2 --bucket "$LOGGING_BUCKET" | jq -r '.Contents[].Key' | while read -r key; do
  echo "$key"
  # 替换键名中的斜杠为下划线,避免生成多级目录,同时修正文件名拼写错误
  aws s3api get-object --bucket "$LOGGING_BUCKET" --key "$key" "output_file_${key//\//_}"
done

内容的提问来源于stack exchange,提问作者MasterOfTheHouse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 09:42:02