AWS Cloud9 のターミナルの出力結果をCloudWatch Logsに保存する
皆さんはAWS Cloud9使っていますか?
私はボチボチです。
AWS Cloud9を使うと、チーム共通のIDE環境としての利用は勿論、IAMユーザーのアクセスキーを発行しなくとも、Cloud9のターミナルで、使用しているIAMユーザーの権限でAWS CLIが使えるので非常に便利です。
Cloud9での権限周りについての説明はclassmethodさんのブログに記載されています。
ただ一点、Cloud9のターミナルのログを保存する機能がないことが少し不満です。
みんな大好きTerraformやiTerm2では、操作ログを指定したファイルに保存できますが、Cloud9ではこの機能はありません。
対策としてパッと私が考えた方法は以下3点です。
- 作業を終えたら、ターミナルを全選択 -> コピーしてファイルに保存する
- ログインしたら絶対 script コマンドを実行する
- psacctを自動起動するようにしておく
1番と2番はオペミス起きそうなので論外ですね...
特に1番は間違えてターミナル上で貼り付けしたら、クリップボードに保存されている内容が全て実行されてしまうので地獄です。
3番は一番シンプルで実装も簡単ですが、以下のようにコマンドのオプションや実行結果までは知ることはできません。
※ しかもbashだらけで良くわからない...
$ lastcomm --user ec2-user
bash F ec2-user pts/2 0.00 secs Sat Jul 18 04:19
bash F ec2-user pts/2 0.00 secs Sat Jul 18 04:19
git ec2-user pts/2 0.00 secs Sat Jul 18 04:19
bash F ec2-user pts/2 0.00 secs Sat Jul 18 04:19
bash F ec2-user pts/2 0.00 secs Sat Jul 18 04:19
bash F ec2-user pts/2 0.00 secs Sat Jul 18 04:19
git ec2-user pts/2 0.00 secs Sat Jul 18 04:19
bash F ec2-user pts/2 0.00 secs Sat Jul 18 04:19
そのため、私の圧倒的なググり力を武器に、以下の方法でターミナルのログを利用者の手間をかけずに保存するようにしました。
1. ~/.bash_prrofileを編集し、ターミナルを開いたら script コマンドを実行するように設定する
以下サイトを参考に ~/.bash_profileを編集します。
scriptとpsacctでオペレーションログを記録する | Developers.IO
~/.bash_profileの末尾には以下内容を追記します。
P_PROC=`ps aux | grep $PPID | grep bash | awk '{ print $11 }'`
if [ "$P_PROC" = "bash" ]; then
script -q /var/log/script/`whoami`_`date '+%Y%m%d%H%M%S'`.log
exit
fi
参考サイトと異なる箇所は、確認するプロセスの対象がsshd ではなく bash に変更しています。
これは参考サイトがサーバにSSHで接続する場面を想定しているのに対して、今回のCloud9のターミナルの場合はSSHを使用せず、直接bashを実行しているからです。
また、事前にscriptコマンドの出力ファイル保存先のディレクトリを作成するのも忘れずに。
保存先のディレクトリの権限は以下のように、実行権限が必要でした。
※ 理由は不明。誰か教えてください...
drwxr--r-- 2 ec2-user ec2-user 4096 Jul 18 04:17 /var/log/script/
動作確認として、Cloud9で別ターミナルを立ち上げ、適当に操作してからターミナルを閉じると、以下のようにディレクトリにファイルが保存されています。
$ ls -l /var/log/script/
-rw-rw-r-- 1 ec2-user ec2-user 644 Jul 17 13:51 ec2-user_20200717135050.log
2. scriptコマンドの出力ファイルをCloudWatch Logsに保存する
以下サイトを参考にscriptコマンドの出力ファイルをCloudWatch Logsに保存します。
AmazonLinux2のシスログをCloudWatch Logs に転送させてみた | Developers.IO
まずは、Cloud9が動いているEC2インスタンスがCloudWatch LogsにアクセスできるようにIAMロールをアタッチします。
今回は、CloudWatchlogsFullAccess のIAMポリシーを付与したIAMロールをEC2インスタンスにアタッチしました。
続いて、以下のようにClouwatch Logsのインストール及び、起動、自動起動の設定です。
※ Cloud9のAMIはAmazonLinuxベースだったので、systemctlコマンドではなく、serviceコマンドや chkconfigコマンドを使っています。
// インストール
$ sudo yum insyall -y awslogs
// サービス起動
$ sudo service awslogs start
// サービス起動確認
$ sudo service awslogs status
// サービス自動起動設定
$ sudo chkconfig awslogs on
// サービス自動起動設定確認
$ sudo chkconfig --list awslogs
そして、CloudWatch Logsの設定です。
/etc/awslogs/awslogs.conf の末尾に以下の内容を追記します。
[general]
state_file = /var/lib/awslogs/agent-state
[/var/log/script/*.log]
datetime_format = %b %d %H:%M:%S
file = /var/log/script/*.log
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = cloud9-syslog-/var/log/script/.log
最後に設定を反映させるために、 CloudWatch Logsのサービスを再起動して、設定は完了です。
sudo service awslogs restart
以下コマンドでCloudWatch Logsを確認してみると、正常に転送できていることが確認できると思います。
$ aws logs get-log-events \
--log-group-name cloud9-syslog-/var/log/script/.log \
--log-stream-name <Cloud9が動作しているEC2インスタンスのID> \
--query "events[].[message]" \
--output text > script.log
$ less script.log
初めてのブログからして、なんだか長いですね...
次はもう少し文章まとめられるように頑張ります。