ようへいの日々精進XP

よかろうもん

AWS CLI で CloudWatch Logs に手元からログを送信する一例 (そして、AWS CLI で tail -f することが出来るんだ!)

この記事は

YAMAP エンジニア Advent Calendar 2020 の十二日目になる予定です。

qiita.com

尚、今後の「一例シリーズ」では、以下のようなネタを用意しています。

  • Github Actions (CircleCI) で GKE にアプリケーションをデプロイする一例

頑張るぞ。

tl;dr

AWS CLI を使って、CloudWatch Logs に手元の環境から、断続的にログを送信する方法について記載します。メトリクスフィルター等の動作確認で使っています。

尚、本記事で登場するツールのバージョンについては、以下の通りです。

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.15.7
BuildVersion:   19H15

bash-4.2# cat /etc/system-release
Amazon Linux release 2 (Karoo)

bash-4.2# aws --version
aws-cli/2.1.10 Python/3.7.3 Linux/4.19.76-linuxkit exe/x86_64.amzn.2 prompt/off

一例

シェルスクリプトサンプル

以下、シェルスクリプトの一例です。

#!/bin/bash -e

LOG_GROUP="ロググループ名"
LOG_STREAM="ログストリーム名"
LOG_MESSAGE="ログメッセージ"

# ruby -e 'puts (Time.now.to_f * 100).floor'
# gdate +%s%3N
# node -e 'console.log(Date.now())'
function generate_log {
  cat << EOF > /tmp/log.json
[
  {
    "timestamp": $(node -e 'console.log(Date.now())'),
    "message": "$LOG_MESSAGE"
  }
]
EOF
}

while true
do
  generate_log

  cat /tmp/log.json

  TOKEN=$(aws logs describe-log-streams \
    --log-group-name=$LOG_GROUP \
    --query='logStreams[?logStreamName==`'$LOG_STREAM'`].[uploadSequenceToken]' \
    --output=text)
  
  if [ "$TOKEN" != "None" ];then
    aws logs put-log-events \
      --log-group-name=$LOG_GROUP \
      --log-stream-name=$LOG_STREAM \
      --log-events file:///tmp/log.json \
      --sequence-token="${TOKEN}"
  else
    aws logs put-log-events \
      --log-group-name=$LOG_GROUP \
      --log-stream-name=$LOG_STREAM \
      --log-events file:///tmp/log.json
  fi

  sleep 3
done

ログメッセージを 3 秒間隔で CloudWatch Logs に送信しています。

継続してログを送信する為に、二回目以降の送信には --sequence-token オプションにシーケンストークンを付与する必要があります。

# 初めての送信
 $ aws logs put-log-events \
  --log-group-name=test-log-group \
  --log-stream-name=test-stream1 \
  --log-events file://log.json
{
    "nextSequenceToken": "1234567890234567890234567890234567890234567890234567890"
}

# 二回目の送信
$ aws logs put-log-events \
    --log-group-name=test-log-group \
    --log-stream-name=test-stream1 \
    --log-events file://log.json \
    --sequence-token=1234567890234567890234567890234567890234567890234567890
{
    "nextSequenceToken": "1234567890234567890234567890234567890234567890234567891"
}

実行例 (そして、AWS CLI で tail -f が出来た!)

シェルスクリプトを sendlog.sh という名前で保存しておいて、シェルスクリプトを実行して CloudWatch Logs にログを送信しています。

f:id:inokara:20201212230731g:plain

そして、衝撃的だったのが、AWS CLI で CloudWatch Logs のロググループを tail -f することが出来るようになっていたことでした。

$ aws logs tail --follow test-log-group

最高ですね。

以上

AWS CLI で CloudWatch Logs に手元からログを送信する一例でした。メトリクスフィルターの動作確認等が 256 倍捗りそうです。

参考