Я собираюсь создать сценарий bash, который проверяет статус веб-сайта, я использую эту команду:
Этот для создания потока журнала
aws logs create-log-stream --log-group-name "WebsiteStatusMessage" --log-stream-name $timestamp
Этот другой для публикации журналов
aws logs put-log-events --log-group-name "WebsiteStatusMessage" --log-stream-name "$timestamp" --log-events file://$iam/logsoutput.json
logsoutput.json
[
{
"timestamp": 202006041832,
"message": "test event1"
}
]
И когда я выполняю команду или скрипт, он показывает это сообщение:
{
"rejectedLogEventsInfo": {
"tooOldLogEventEndIndex": 1
}
}
А также это другое сообщение на консоли:
Expecting property name enclosed in double quotes: line 6 column 2 (char 84)
Код сценария Bash
#!/bin/bash
#variables
iam=$(pwd)
timestamp=$(date +"%Y%m%d%H%M")
instance_id="i-######"
#Read line per line and storage it on a array
getArray()
{
array=()
while IFS= read -r line
do
array+=("$line")
done < "$1"
}
getArray "$iam/sites.txt"
#working
for url in "${array[@]}"
do
echo "The website is: $url"
STATUS=$(curl -s -o /dev/null -w "%{http_code}\n" $url)
if [ "$STATUS" == "200" ] || [ "$STATUS" == "301" ] || [ "$STATUS" == "302" ]; then
echo "$url is up, returned $STATUS"
else
echo "$url is not up, returned $STATUS"
###
# This will send the metric to metrics Cloudwatch
###
rm $iam/metricsOutput.json
echo " [ " >> $iam/metricsOutput.json
echo " { " >> $iam/metricsOutput.json
echo " \"MetricName\": \"SiteStatus\", " >> $iam/metricsOutput.json
echo " \"Timestamp\": \"$timestamp\", " >> $iam/metricsOutput.json
echo " \"Value\": 1, " >> $iam/metricsOutput.json
echo " } " >> $iam/metricsOutput.json
echo " ] " >> $iam/metricsOutput.json
aws cloudwatch put-metric-data --namespace "Custom-2" --metric-data file://$iam/metricsOutput.json
###
# This sends the message to logstream on Cloudwatch
###
rm $iam/logsoutput.json
echo " [ " >> $iam/logsoutput.json
echo " { " >> $iam/logsoutput.json
echo " \"timestamp\": $timestamp, " >> $iam/logsoutput.json
echo " \"message\": \"test event1\" " >> $iam/logsoutput.json
echo " } " >> $iam/logsoutput.json
echo " ] " >> $iam/logsoutput.json
aws logs create-log-stream --log-group-name "WebsiteStatusMessage" --log-stream-name $timestamp
aws logs put-log-events --log-group-name "WebsiteStatusMessage" --log-stream-name "$timestamp" --log-events file://$iam/logsoutput.json
fi
done
Я пробовал с разными структурами json, но все равно ничего, есть идеи? (У aws cli есть полные разрешения Cloudwatch)
Не тестировали, но я думаю, что timestamp
должен быть отметка времени unix (секунды с 1970-01-01 00:00:00) не дата, т.е. $(date +%s)
и вполне возможно с точностью до миллисекунды, поэтому добавьте 000
в конце.
Надеюсь, это поможет :)
Я предлагаю вам разделить две функции вашего скрипта. Вы можете заставить свой сценарий обрабатывать вывод журналов в файлы .json и установить агент CloudWatch на экземпляр. Когда вы настраиваете агент CloudWatch, вы можете указать ему включить вашу настраиваемую папку журнала, и он отправит все в чистом виде в CloudWatch. За использование агента взимается небольшая плата из-за детализации, поэтому обязательно ознакомьтесь с ценами на него. Это гораздо лучшее решение, чем использование команды CLI в сценарии bash для ручной загрузки журналов. Если есть управляемый сервис для чего-то, всегда используйте его - по крайней мере, это мой девиз.