この記事は
YAMAP エンジニア Advent Calendar 2020 の十二日目になる予定です。
尚、今後の「一例シリーズ」では、以下のようなネタを用意しています。
- 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 にログを送信しています。
そして、衝撃的だったのが、AWS CLI で CloudWatch Logs のロググループを tail -f することが出来るようになっていたことでした。
$ aws logs tail --follow test-log-group
最高ですね。
以上
AWS CLI で CloudWatch Logs に手元からログを送信する一例でした。メトリクスフィルターの動作確認等が 256 倍捗りそうです。