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
相关产品推荐
相关产品推荐

