Назад | Перейти на главную страницу

Как отправлять журналы в Cloudwatch с помощью интерфейса командной строки?

Я собираюсь создать сценарий 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 для ручной загрузки журналов. Если есть управляемый сервис для чего-то, всегда используйте его - по крайней мере, это мой девиз.