Bash脚本执行AWS CloudWatch日志查询无数据,但手动执行命令正常的问题求助
Bash脚本执行AWS CloudWatch日志查询无数据,但手动执行命令正常的问题求助
我刚接触Bash脚本,目前想实现一个功能:通过Bash脚本调用AWS查询命令,把结果导出到.txt文件里。本来打算先把这个小测试跑通,再扩展到实际的多Lambda日志组查询需求,但现在遇到了一个棘手的问题:
当我直接运行.sh脚本时,导出的txt文件显示查询状态是Running,没有任何数据返回;但如果把脚本里的命令逐行复制到Git Bash里手动执行,就能正常拿到完整的查询结果。
我的原始脚本
#!/bin/bash variables () { lambdas="confidential" } variables queryId=$(aws logs start-query --log-group-name $lambdas --start-time 1695704400 --end-time 1695707999 --query-string 'filter @message like "requestId" | parse @message "operationName: '*'," as API | parse @message "status: *," as Status | parse @message "channel: '*'," as Channel | stats count(*) as Total by API,Channel,Status | sort API,Total desc' | jq '.queryId' | awk -F '"' '{print $2}') results=$(aws logs get-query-results --query-id $queryId | jq .) echo "$results" > testextract5.txt
脚本执行后的结果(testextract5.txt内容)
{ "results": [], "statistics": { "recordsMatched": 0, "recordsScanned": 0, "bytesScanned": 0 }, "status": "Running" }
手动执行命令后的结果
把脚本里的命令逐行在Git Bash里执行后,导出的txt能拿到正常数据:
[ { "field": "API", "value": "'Confidential'" }, { "field": "Channel", "value": "'Confidential'" }, { "field": "Status", "value": "Confidential" }, { "field": "Total", "value": "1" } ], "statistics": { "recordsMatched": 16507, "recordsScanned": 69000, "bytesScanned": 29835564 }, "status": "Complete"
已尝试的排查步骤
- 用
bash -x script.sh调试脚本,输出的命令看起来和手动执行的完全一致,但结果还是不对 - 回滚到WSL1版本,问题依旧
- 更新AWS CLI到最新版本,没有解决
- 给
$lambda和$queryId变量加上双引号,结果还是没有数据返回
最新测试发现(2023年10月3日 新加坡时间05:15更新)
我把问题隔离出来测试:创建了两个内容完全相同的txt文件test1.txt和test2.txt,里面都是同一个queryId值c86c7f6b-95e4-4d17-9417-2f6987989316。然后修改脚本测试:
#!/bin/bash variables () { lambdas="confidential" } variables queryId=$(aws logs start-query --log-group-name "$lambdas" --start-time 1695704400 --end-time 1695707999 --query-string 'filter @message like "requestId"' | jq '.queryId' | awk -F '"' '{print $2}') # 这个生成的test1.txt里的queryId,用来执行查询时无数据 echo $queryId > test1.txt # 手动输入queryId生成的test2.txt,执行查询正常 echo c86c7f6b-95e4-4d17-9417-2f6987989316 > test2.txt queryIds=$(awk '{print $1}' test2.txt) results=$(aws logs get-query-results --query-id $queryIds | jq .) echo "$results" > testextract.txt
测试结果:
- 用
test1.txt里的queryId执行查询,没有数据返回 - 用
test2.txt里的queryId执行查询,就能正常拿到结果
肉眼看两个文件的内容完全一样,但脚本生成的queryId好像被转换成了特殊字符?实在搞不懂哪里出了问题。
期望的结果
希望脚本执行时能和手动执行命令一样,拿到完整的查询结果,这样我才能继续扩展成用数组处理多个Lambda日志组的功能。
备注:内容来源于stack exchange,提问作者joms
相关产品推荐
相关产品推荐

