サイトアイコン 協栄情報ブログ

シェルスクリプトを使用した、操作ログの自動取得と抽出

はじめに

今回は、scriptコマンドを利用して、コンソール上の操作(作業)ログを自動取得するシェルスクリプトの作成手順を紹介していきます。

■目的

操作ログを記録することで、予期せぬエラーが表示された場合やオペレーションミスが起こってしまった際の詳細な記録を残しておくことができます。
作業終了後に記録を見返し手順書などを修正することで、次回以降の作業を滞りなく進めることが出来ます。

■前提条件

↓SG(SSH)

↓IAMロール(AmazonS3FullAccess)

■構成図

■手順

1.S3バケット作成

まず初めにシェルスクリプトで取得した操作ログのバックアップ先となる、S3バケットを作成します。
1.サービスからS3、サイドメニューからバケットを選択し、「バケットを作成」を押下します。
2.以下の設定値を入力します。

設定項目 入力値 備考
バケット名 任意 大文字が使えず、バケット名は世界で一意である必要がある
リージョン eu-west-1 遠隔に保管する必要がないのでVPCと同一のリージョンとします
オブジェクト所有者 ACL無効 検証用で自身が利用する為
パブリックアクセス制限 すべてブロック パブリックアクセスを行わない為
バージョニング 無効 要件がないのでコストを考慮し無効
暗号化キータイプ SSE-S3 要件がないので、デフォルト値とします

3.作成したS3バケット内に、backup_logフォルダを作成します。


 

2.EC2インスタンスの作成

シェルスクリプトを実行し、コンソール上の操作ログを取得する為に、EC2を作成します。
1.サービスからEC2、サイドメニューからインスタンスを選択し、「インスタンスを起動」を押下します。
2.以下の設定値を入力します。

設定項目 入力値
名前 任意
OS Red Hat
AMI Red Hat Enterprise Linux 9 (HVM), SSD Volume Type(無料枠)
インスタンスタイプ t2.micro(無料枠)
キーペア 使用しているものを選択
VPC 事前に作成したもの
サブネット 事前に作成したもの
パブリックIP 有効化
SG 事前に作成したもの
IAMロール 事前に作成したもの

3.ユーザーデータに下記スクリプトを記入する。
ユーザーデータを設定することで、インスタンスを起動した段階で自動的に入力しておいたコマンドが実行されます。
※本来はインスタンス起動後に、コンソールからコマンド入力するので、その手間が省けます。

#!/bin/bash
sudo yum install python -y
sudo dnf install -y wget
sudo wget https://bootstrap.pypa.io/get-pip.py
python get-pip.py

sudo curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
sudo yum install zip unzip -y
unzip awscliv2.zip
sudo ./aws/install
source ~/.bash_profile

mkdir /home/ec2-user/temp_folder
mkdir /home/ec2-user/ope_log_folder

sudo chown -R ec2-user /home/ec2-user
sudo chgrp -R ec2-user /home/ec2-user

起動時に Linux インスタンスでコマンドを実行するより引用

3.scriptコマンドとは

scriptコマンドは、Linuxで実行したコマンドと実行日時、出力結果を全てログファイルに記録することが可能です。

実際にscriptコマンドを実施し、記録内容をcatコマンドで確認したものが下の画像となります。

操作ログを記録することで、予期せぬエラーが表示された場合やオペレーションミスが起こってしまった際の詳細な記録を残しておくことができます。
作業終了後に記録を見返し手順書などを修正することで、次回以降の作業を滞りなく進めることが出来ます。
 
しかし現状の仕様では、作業者がscriptコマンドを実行し忘れる可能性があるため、インスタンスへログインした際に自動で実行されるようにしていきます。
 

4.ログイン時に、scriptコマンドを自動実行させる

ログイン時に実行される設定用のシェルスクリプトである.bash_profileに、scriptコマンドを追記します。
.bash_profileはログイン時だけ実行されるシェルスクリプトなので、この設定ファイルにscriptコマンドを追記することで、インスタンスにログインした際にコマンドが自動実行されます。
 
1.ホームディレクトリで、ls -laコマンドを実行し、.bash_profileがあることを確認します。
2.確認後、sudo vi .bash_profileで設定ファイルを開き編集します。
3.ファイルの末尾にscript ./ope_log_folder/$(date +%Y%m%d_%H%M%S).log.gzと追記します。
※追記したコマンドの内容
ホームディレクトリ配下のope_log_folder(フォルダー)へ、ログイン時の日時が記載されたファイルが作成される。
例)20230622_002814.log.gz


 

5.scriptコマンドが自動化されていることを確認

実際に項番4で追記した内容が反映されているか一度ログアウトし、再度ログインします。
正常に動作すると、下の画像のようなコメントが表示されます。

scriptコマンドの自動実行の確認が出来きました。
ls -lコマンドでも、対象のファイルが保存されていることが確認できました。
次はログアウトする際に、S3バケットへログのアップロードを自動化します。
 

6.ログアウト時のS3バケットへのログのアップロード自動化

まず初めに、S3バケットへのログのアップロードのシェルスクリプト(s3_upload.sh)を作成していきます。
1.ホームディレクトリに移動し、sudo vi s3_upload.shでシェルスクリプトを作成・編集します。
記載内容は以下の通りです。

#!/bin/bash

export PATH=/usr/local/aws-cli/v2/current/bin:$PATH

folder="/home/ec2-user/ope_log_folder"

bucket="項番1で作成したS3バケット名"
s3_folder="backup_log"
latest_file=$(ls -1t "$folder" | head -n 1)

aws s3 cp "$folder/$latest_file" "s3://$bucket/$s3_folder/$latest_file"

result=$?

if [ $result -eq 0 ]; then
     echo "ファイルのアップロードが正常に完了しました。"
else
     echo "ファイルのアップロード中にエラーが発生しました。エラーコード: $result"
fi

2.作成後、sudo chmod +x s3_upload.shでスクリプトに実行権限を与えます。

3.ホームディレクトリでls -laコマンドを実行し、.bashrcファイルがあることを確認します。
.bashrcは、bashを使用する際に必要な設定が記載されているファイルになります。
4.sudo vi .bashrcでファイルを開き、ファイル末尾にtrap "/home/ec2-user/s3_upload.sh" exitと追記します。
追記することで、ログアウトをトリガーとしs3_upload.shを実行します。
コンソール上でexit又はctrl dでログアウトする際に追記したスクリプトが実行されます。
※ログアウト前にスクリプトが実行され、自動アップロードすることで操作ログの取り忘れを防げます。


 

7.S3バケットへのアップロードが自動化されていることを確認

実際にexit又はctrl dでログアウトしようとすると、下の画像のように「ファイルのアップロードが正常に完了しました」と出力されていればS3バケットへアップロードされています。
 

マネジメントコンソールで、指定したS3バケット内のbackup_logフォルダを確認してみると、アップロードされたファイルと同じ名前のファイルがありました。

対象のファイルをS3バケットからダウンロードし、メモ帳などで開いて中身を比較すると内容が同じであることが分かったので、正常にアップロードできていることが確認できました。

※少し文字化けしていますが、操作ログの開始・終了時間、実行コマンド・実行結果が全て同じです。


 

8.S3バケットにバックアップしている複数のファイルからログ抽出を実施

シェルスクリプトの引数で日時と文字列を指定し、S3バケットのバックアップフォルダから、対象のログを抽出します。
1.ホームディレクトリに移動しsudo vi log_xtraction.shでシェルスクリプトを作成します。
記載内容は以下の通りです。

#!/bin/bash

export PATH=/usr/local/aws-cli/v2/current/bin:$PATH

file_name="$1"
search_string="$2"

bucket="項番1で作成したS3バケット名/backup_log"
temp_dir="/home/ec2-user/temp_folder"

aws s3 sync s3://$bucket $temp_dir --exclude "*" --include "*$file_name*"

files=$(find $temp_dir -type f)

PS3="ファイルを選択してください: "
select file in $files; do
     if [[ -n $file ]]; then
         echo "選択されたファイル: $file"
         if grep -q "$search_string" "$file"; then
            sed -n "/$search_string/{N;N;p;}" "$file"
         else
             echo "指定の文字列はファイル内に含まれていません"
         fi
         break
     else
          echo "無効な選択です。再度選択してください。"
     fi
done
rm -rf $temp_dir/*

2.sudo chmod +x log_xtraction.shで、実行権限を与えます。

9.ope_log_folderフォルダとログ抽出した内容が同じか確認

1.事前にecho scriptコマンドを実施した操作ログをS3バケットへアップロードします。
※実行するコマンドは分かりやすいものであれば、何でも大丈夫です。
2.sudo ./log_xtraction.sh 第二引数 第二引数を実行します。
例)sudo ./log_xtraction.sh 20230626 echo
※第一引数と第二引数へ入れる値は、項番9-1で実施したコマンドとアップロードしたファイル名により異なります。
3.cd ope_log_folder/で移動し、cat 20230626_075455.log.gzを実行し、内容を比較します。
出力した内容が一致しているため、ログ抽出が出来ていることが確認できました。


 

まとめ

今回は設定ファイルである.bash_profile.bashrcにコマンドを追記してS3バケットへアップロードやscriptコマンドの自動化を行いました。
各設定ファイルを使いこなすことで、出来ることが増えてきそうですね。
 
それぞれ設定ファイルの違いをまとめたのでご参考までに。

ファイル 概要
~/.bash_profile ログイン時のみ読み込ませたい設定
~/.bashrc bash起動の度に読み込ませたい設定
~/.bash_logout ログアウント時に読み込ませたい設定
~/.bash_history 実行したコマンドの履歴を記録するファイル

 

モバイルバージョンを終了