以前Raspberry Piにセンサーを取り付け、ラズパイで室内の温湿度を取得できるようにしました。
そして、単に温湿度を取得するだけではなく、取得した温湿度にSLAを規定し、範囲外の値を取得した際は管理者へ通知を行うような温湿度管理システムを構築したいと考えていました。
サードパーティ制の管理ツールを使用する手も考えましたが、折角ラズパイを購入してまで温湿度センサーを作りましたので、ただ計測するだけでなく、計測した値を管理するシステムまで作ってしまおうと考え、処理ロジックをシェルスクリプトとAWS CloudWatchで実装しました。
概要
今回作成したものは、温湿度センサ モジュール(AM2302)を使用した温湿度センサーにて取得した温湿度値をシェルスクリプトにて判定し、AWS CloudWatchから通知を行う温湿度管理システムになります。
本記事では、システムの構築手順に沿って各項目をご紹介させていただきます。
システム概要
- システム概要
- 温湿度管理モジュールを利用して下記処理を行う
- 温湿度値を計測 / SLA判定 / ログ出力
- ログファイルのローテート
- CloudWatch Logsにてスクリプトの実行ログを取得する
- CloudWatchアラームとメトリクスを作成し、ログの出力内容に応じて管理者へメール通知を行う
- 温湿度管理モジュールを利用して下記処理を行う
システム構成図
作成した温湿度管理システムのロジック図を以下の通りとします。
実行環境
- Raspberry Pi Zero W ※サーバ機
- AM2302 ※温湿度センサー
温湿度値取得モジュール
DHT22から温湿度を計測したり管理するモジュールをGitHubからダウンロードします。
下記コマンドを任意の作業ディレクトリで実行して下さい。
git clone https://github.com/chibiharu/TemperatureHumidity-AcquisitionFunctionToRaspberryPi.git
ダウンロードしたディレクトリへ移動すると下記スクリプトが存在します。
それぞれのスクリプトを利用して、センサーから温湿度を取得し管理していきます。
./
├ 01_param/
└ common.conf
├ 02_script/
└ basicdht22.py
└ thputlog.sh
└ thputcsv.sh
└ thputall.sh
└logrotate.sh
└ logrotate_log.sh
├ 03_materials/
└ setup.sh/
└ README.md
本ライブラリは 01_param 配下の common.conf に記載されているパラメータを参照して処理を実行するので、設定ファイルの中身を変えておきます。
※デフォルトでも動作はします
cd TemperatureHumidity-AcquisitionFunctionToRaspberryPi/01_param
vi common.conf
### 定数 ###
# 本ファイルで利用できる定数を下記に記載する
# 定数は各スクリプト共通である
# 定数の定義は各スクリプトで行う
# $data = yyyymmdd
# $today = yyyymmdd
### リソースパス ###
# ログ関連
LogDir="/var/log/ThLog"
LogFile="temp_humi.log"
LogPath=$LogDir"/"$LogFile
LogOldPath=$LogDir"/temp_humi_"$data".log"
LogZip=$LogDir"/temp_humi_"$data".zip"
# CSV関連
CsvDir="/var/log/ThCsv"
CsvFile="temp_humi_$today.csv"
CsvPath=$CsvDir"/"$CsvFile
### SLA値 ###
# 温度SLA
TMax=30
TMin=15
# 湿度SLA
HMax=70
HMin=30
ライブラリの利用にあたって事前に必要なモジュールのインストールやセットアップを行います。
「03_materials」配下の「setup.sh」を実行して下さい。
※ハードウェアによっては処理時間が1時間近くかかる場合があります。
cd TemperatureHumidity-AcquisitionFunctionToRaspberryPi/03_materials
sudo ./setup.sh
スクリプトの定期実行
Cron登録
スクリプトが決められた時間に定期実行されるようにcrontabに登録します。
● スケジュール
thputlog.sh – 15分毎/日 に実行
logrotate.sh – 0:10/日 に実行
● crontab追記コード(例)
# 15分毎/日
*/15 * * * * bash /home/<USER>/TemperatureHumidity-AcquisitionFunctionToRaspberryPi/02_script/thputlog.sh
# 0:10/日
0 0 * * * bash /home/<USER>/TemperatureHumidity-AcquisitionFunctionToRaspberryPi/02_script/loglotate.sh
OSにCloudWatch Agentをダウンロード & 起動
続いて、スクリプトによって出力した実行ログをCloudWatch Logsに送るように設定します。
手順としては以下になります。
● 手順
1:Agentのダウンロード & インストール
2:設定ファイルの作成
3:サービスの起動
CloudWatch Agentのダウンロード
LinuxOS(オンプレ)にAgentのセットアップスクリプトをダウンロードします。
以下コマンドを実行し、カレントディレクトリに Agentのセットアップスクリプト [awslogs-agent-setup.py]が存在することを確認します。
$ # Agentのダウンロード
$ curl https://s3.amazonaws.com/aws-cloudwatch/downloads/latest/awslogs-agent-setup.py -O
$ # スクリプトの確認
$ ls
~~~ awslogs-agent-setup.py ~~~
設定ファイルの作成
ダウンロードしたセットアップスクリプトを起動し、ログの取得設定を行います。
以下コマンドを実行し、各項目に従いパラメータを設定してください。
$ # Agentのセットアップ
$ sudo python ./awslogs-agent-setup.py --region <リージョン名>
Launching interactive setup of CloudWatch Logs agent ...
Step 1 of 5: Installing pip ...DONE
Step 2 of 5: Downloading the latest CloudWatch Logs agent bits ... DONE
### aws アクセスキー情報は適切なものを入力する
# --only-generate-config オプション入れれば再度confファイル作り直せる。
Step 3 of 5: Configuring AWS CLI ...
AWS Access Key ID [****************XXXX]:
AWS Secret Access Key [****************XXXX]:
Default region name [ap-northeast-1]:
Default output format [None]:
#### 以降はawslogsでログの検知対象とするログファイルを指定する。
Step 4 of 5: Configuring the CloudWatch Logs Agent ...
Path of log file to upload [/var/log/messages]:
Destination Log Group name [/var/log/messages]:
Choose Log Stream name:
1. Use EC2 instance id.
2. Use hostname.
3. Custom.
Enter choice [1]:
### 検知するログのタイムスタンプのフォーマット
# ここを間違えるとエラーが出まくるが、あとで書き直せる。
Choose Log Event timestamp format:
1. %b %d %H:%M:%S (Dec 31 23:59:59)
2. %d/%b/%Y:%H:%M:%S (10/Oct/2000:13:55:36)
3. %Y-%m-%d %H:%M:%S (2008-09-08 11:52:54)
4. Custom
Enter choice [1]:
#### ログのどこから検知してくか?だと思う
# たぶん
# From start of file :ファイルの最初から →アプリがまだ起動してなくて最初からcloudwatchに投げたい
# From end of file : ファイルの最後から →アプリがすでに起動してて大量にログが書かれてるから、途中からcloudwatchに投げたい
Choose initial position of upload:
1. From start of file.
2. From end of file.
Enter choice [1]:
More log files to configure? [Y]: n
Step 5 of 5: Setting up agent as a daemon ...DONE
------------------------------------------------------
- Configuration file successfully saved at: /var/awslogs/etc/awslogs.conf
- You can begin accessing new log events after a few moments at https://console.aws.amazon.com/cloudwatch/home?region=ap-northeast-1#logs:
- You can use 'sudo service awslogs start|stop|status|restart' to control the daemon.
- To see diagnostic information for the CloudWatch Logs Agent, see /var/log/awslogs.log
- You can rerun interactive setup using 'sudo python ./awslogs-agent-setup.py --region ap-northeast-1 --only-generate-config'
------------------------------------------------------
また、上記設定は以下設定ファイルに追記されます。
追加でログファイルを追記したい場合、ウィザードから設定を行わなくても設定ファイルに直接追記することができます。
$ sudo vim /var/awslogs/etc/awslogs.conf
~~~ 略 ~~~
# 以下コードを最下行に記載していく
[temp_humi.log]
datetime_format = %Y-%m-%d %H:%M:%S
file = <ディレクトリパス>/temp_humi.log
buffer_duration = 5000
log_stream_name = <ログストリーム名>
initial_position = start_of_file
log_group_name = <ロググループ名>
### テンプレート ###
#[<任意の名前を指定する>]
#datetime_format = %Y-%m-%d %H:%M:%S
#file = <ログファイルのパスを記載する>
#buffer_duration = 5000
#log_stream_name = <ログストリーム名を指定する>
#initial_position = start_of_file
#log_group_name = <ロググループ名を指定する>
サービスの起動
以下コマンドを実行し、Agentを起動(常時起動)します。
$ sudo systemctl enable awslogs
$ sudo systemctl start awslogs
$ sudo systemctl restart awslogs
以上で、CloudWatch Agentの設定が完了しました。
Amazon CloudWatch Logsにて、温湿度ログを確認できるはずです。
CloudWatch アラートを作成
CloudWatch Logsにて取得した温湿度ログのイベントNo.を判定し、特定のイベントNo.を確認したら管理者へメール送信するCloudwatchアラームを作成します。
- 手順として以下の通りとなります。
- CloudWacth Logs メトリクスの作成
- CloudWatch アラームの作成
CloudWacth Logs メトリクスの作成
メトリクスを作成することで、CloudWatch Logsで取得しているログにフィルターをかけることができます。
そのフィルターをあけたログをCloudWatchにて検知した時点で後述のアラームで管理者へメール通知する流れになります。
まずはAmazon CloudWatch logs画面にて対象のロググループをクリックし、管理画面へ遷移します。
[メトリクスフィルター]タブをクリックし、メトリクスフィルター管理画面へ遷移します。画面遷移後、画面右上の[メトリクスの作成]をクリックします。
メトリクス作成画面にて、各項目に従い以下パラメータを設定します。
● ステップ1:パターンの作成
— フィルターパターンを作成 —
フィルターパターン = <フィルターパターン(以下例)>
例:”Error_Code=[101]”
● ステップ2:メトリクスの割り当て
— メトリクスの詳細 —
メトリクス名前空間 = <任意の名前を指定する>
メトリクス名 = <任意のメトリクス名を指定する>
メトリクス値 = 1
デフォルト値(オプション) = 0
Unit = <空白>
● ステップ3:Review and confirm
パラメーター値の確認になります。
各項目の値に問題がなければ、画面右下[変更の保存]をクリックし、メトリクスを作成します。
画面遷移後、作成したメトリクスが表示されていることを確認します。
SNSトピックの作成
続いてメール送信用のSNSトピックを作成致します。
SNSに登録したアドレスにアラート通知を飛ばすことになりますので、自身のメールアドレスを登録します。
AWS管理コンソールの検索バーにて、「SNS」と検索し、表示された
[Simple Notification Service]をクリックします。
SNS左ペインダッシュボードのナビゲーションペインにて、「トピック」をクリックし、画面遷移後、画面右上「トピックの作成」をクリックします。
各項目に従い以下パラメータを設定し、画面右下[トピックの作成]をクリックします。
● トピックの作成
— 詳細 —
タイプ = スタンダード
名前 = <任意のお名前を指定ください>
表示名 – オプション = <任意のお名前を指定ください>
~~~ 以下パラメータはデフォルトのままで問題ありません ~~~
画面遷移後、SNSトピックが作成されていることをご確認ください。
作成されたトピックをクリックし、トピック管理画面にて、[サブスクリプションフィルター]をクリックします。
サブスクリプションフィルター画面にて、[サブスクリプションの作成]をクリックします。
各項目に従い以下パラメーターを設定し、画面右下[サブスクリプションの作成]をクリックします。
● サブスクリプションの作成
— 詳細 —
トピックARN = <ARN>
プロトコル = <Eメール>
エンドポイント = <ご自身のメールアドレス>
~~~ 以下パラメータはデフォルトのままで問題ありません ~~~
画面遷移後、作成したサブスクリプションが登録されていることを確認します。
CloudWatch アラームの作成
続いてCloudWatchアラームの作成を行います。
先程作成したメトリクスフィルターのログが出力された際に、SNSトピックへメールを通知するようにアラームを作成します。
再度、CloudWatch管理画面に遷移します。
該当ロググループのメトリクスフィルターの[ □ ]にチェックを入れ、[アラームの作成]をクリックします。
各項目に従い、以下パラメーターを設定し、画面右下[次へ]をクリックします。
● ステップ1:メトリクスと条件の指定
— メトリクス —
メトリクス名 = <任意の名前を指定してください>
統計 = 合計
期間 = 15分 ※スクリプトの実行期間に合わせます
— 条件 —
しきい値の確認 = 静的
<メトリクス名>が次の時 = より大きい
…よりも = 0
— その他の設定 —
※デフォルト値で問題ありません
● ステップ2:アクションの設定
— 通知 —
アラーム状態トリガー = アラーム状態
SNSトピックの選択 = 既存のSNSトピックを選択
通知の送信先 = <先程作成したSNSトピックを選択>
— Auto Scaling アクション —
※デフォルト値で問題ありません
— EC2アクション —
※デフォルト値で問題ありません
— Systems Manager アクション —
※デフォルト値で問題ありません
● ステップ3:名前と説明を追加
— 名前と説明 —
アラーム名 = <任意の名前を指定してください>
アラームの説明 – オプション = <任意の名前を指定してください>
画面遷移後、アラームが作成されていることを確認します。
まとめ
以上が、温湿度管理システムの紹介、及び構築手順となります。
今後は、エラーの内容によって、室温を自動で調整してくれるようにエアコンやサーキュレータを自動で起動してくれるような 物理環境を巻き込んだ自動化 を目指していきます
コメント