ubuntu AWS查询字符串在由.sh脚本执行时不提取任何数据

hs1rzwqc  于 2023-10-17  发布在  其他
关注(0)|答案(2)|浏览(109)

我是新的Bash脚本,想测试提取数据,我的计划是提取数据到一个.txt文件的基础上的AWS查询从.sh文件(JavaScript脚本)。我有一个更大的目的,但我想有这个工作之前,我输入我的主要aws查询。

下面有一个.sh脚本。
注:我把所有的价值观-保密-没有任何报价。仅值

#!/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

每当我运行.sh文件时,下面是结果.txt:

{
  "results": [],
  "statistics": {
    "recordsMatched": 0,
    "recordsScanned": 0,
    "bytesScanned": 0
  },
  "status": "Running"
}

但当我手动复制粘贴每个命令从.sh文件所有的bash脚本在git-bash命令行,它的工作!见下文:

jomasangkay@DESKTOP-R1DM530:/mnt/c/Users/personal pc/Desktop/company/Bashscript/test$ 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}')
jomasangkay@DESKTOP-R1DM530:/mnt/c/Users/personal pc/Desktop/company/Bashscript/test$ results=$(aws logs get-query-results --query-id $queryId | jq .)
jomasangkay@DESKTOP-R1DM530:/mnt/c/Users/personal pc/Desktop/company/Bashscript/test$ echo "$results" > testextract5.txt

下面是提取的结果.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,但我没有看到任何问题。我试着回滚到wsl版本1,安装了最新的aws更新。都不管用我的剧本有问题吗?
我希望当我运行.sh文件时,应该有像上面的.txt结果这样的预期数据。我创建这个bash脚本的主要目的是因为AWS Cloudwatch Log Insights有一个与lambda相关的限制,所以我计划创建一个bash脚本,在$lambda中使用数组。这篇文章是我的试验和错误。我需要让这件事继续下去。

尝试了$lambda和$queryId的双引号,结果相同,没有数据。下面

jomasangkay@DESKTOP-R1DM530:/mnt/c/Users/personal pc/Desktop/company/Bashscript/test$ bash -x testing2.sh
+ variables
+ lambdas=confidential
++ jq .queryId
++ awk -F '"' '{print $2}'
++ aws logs start-query --log-group-name confidential --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'
+ queryId=0f6c6fd6-da5e-40ed-9c74-ad22791455be
++ aws logs get-query-results --query-id 0f6c6fd6-da5e-40ed-9c74-ad22791455be
++ jq .
+ results='{
  "results": [],
  "statistics": {
    "recordsMatched": 0,
    "recordsScanned": 0,
    "bytesScanned": 0
  },
  "status": "Running"
}'
+ echo '{
  "results": [],
  "statistics": {
    "recordsMatched": 0,
    "recordsScanned": 0,
    "bytesScanned": 0
  },
  "status": "Running"
}'

===============================
更新于2023年10月3日-新加坡时间上午05:15
我通过创建一个名为test1.txt和test2.txt的2.txt文件来隔离这个问题,下面是它们的内容,

test1.txt
c86c7f6b-95e4-4d17-9417-2f6987989316
test2.txt
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}')

#NOT WORKING
echo $queryId > test1.txt

#WORKING
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中分配变量时,它不工作,没有提取数据。
当我从test2.txt中分配变量时,它按预期工作。
出于某种原因,看起来像从test1.txt查询ID转换为有点特殊的字符值,我不确定。

zzzyeukh

zzzyeukh1#

重复aws logs get-query-results直到有结果

正如我们在问题的更新输出中看到的,对aws logs get-query-results的响应是"status": "Running"。查询仍然在AWS上运行,结果还没有准备好,无法下载。所以我们只需要稍后再次调用aws logs get-query-results
根据documentation,有效状态值为Scheduled | Running | Complete | Failed | Cancelled | Timeout | Unknown。您可以尝试在循环中重复获取结果,直到状态不是ScheduledRunning之一:

while true; do
    results=$(aws logs get-query-results --query-id "$queryId" | jq .)
    status=$(jq -r .status <<< "$results")
    echo "status=$status"
    [ "$status" = "Scheduled" -o "$status" = "Running" ] || break
    sleep 1
done

红鲱鱼
这一点,原本看起来就有些可疑:

queryId=$(aws ... 'filter ... operationName: '*', ... channel: '*', ...' | ...)
                                             ^^^               ^^^

也就是说,一个“裸”*,在单引号表达式之外,这看起来是无意的,而且容易出错。
其意图似乎是将'*'包含在单引号表达式中,我们可以通过添加单引号来结束正在进行的单引号表达式,然后在双引号表达式中添加'*',然后启动另一个单引号表达式来继续我们中断的表达式:

queryId=$(aws ... 'filter ... operationName: '"'*'"', ... channel: '"'*'"', ...' | ...)
                                             ^ ending the previous single-quoted expression
                                              ^^^^^ a double-quoted expression
                                                   ^ starting a new single-quoted expression

修复发布的代码中的行:

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}')

虽然这不是真实的问题,但仍然很好解决。

4xrmg8kj

4xrmg8kj2#

我能够解决我的问题。这是由于bash脚本运行太快,AWS脚本无法完成其进程或获取其数据。因此,我尝试先将sleep命令放置5秒,以检查是否真的是这样。那么是的,这就是问题所在,所以我只需要写一个条件语句来代替sleep……谢谢大家的建议,我从你们身上学到了很多。

相关问题