You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 12:05:27