ラズパイZEROとモーションセンサーで見守りシステムをつくる(その5 プログラムを動作させるまで)
Contents
前回からのつづき
ラズパイとモーションセンサーで実家用の見守りシステムを構築した時の5回目。
モーションセンサーで検知した件数をLINEを通して見守り元に通知する。
また各種設定値をGoogleスプレッドシートから読み込んで通知時間などを変更することができる。
プログラム作成まで終了したので今回はプログラムを動作させるまでの環境の設定についての記事とする。
具体的には、
- プログラムのファイル・ディレクトリ構成
- ファイルのアクセス権
- ラズパイゼロをデスクトップからCLI(Command Line Interface)に変更
- プログラムの自動起動
- sshで外部から遠隔操作できるような設定
などについての記事とする。
尚、記事の最後に動画で説明をしているので参考にしてみてほしい。
プログラムのファイル・ディレクトリ構成
プログラムのファイル・ディレクトリ構成は以下の通り。
├─opt
│ │
│ ├─WatchOver
│ │ │ WatchOver.py
│ │ │ initial.json
│ │ │
│ │ ├──cert
│ │ │ XXXXXXXXXX-certificate.pem.crt
│ │ │ XXXXXXXXXX-private.pem.key
│ │ │ AmazonRootCA1WatchOver.pem
│ │ │ watchoverproject-2019-XXXXXXXXXXXX.json
│ │ │
│ │ ├──csv
│ │ │ count_data.csv
│ │ │
│ │ └──log
│ │ error.log
│ │
/opt/WatchOverディレクトリ | プログラムをこのディレクトリに格納した。 ubuntuの説明で「主にサードパーティー製アプリのインストール先」で「自分で作成したアプリをインストールしてもOK」とあったのでここにディレクトリを作成してインストールすることにした。 2021年04月29日 追記 今回は /opt/ 配下に格納したが、特定のユーザからしか起動しないプログラムなので /usr/local/ への格納でも良かったのかも知れない。 | ||||||||||||||||||
WatchOver.py | プログラム本体 プログラム内容の説明はこちらの記事を参照 | ||||||||||||||||||
initial.json | 初期設定ファイル
| ||||||||||||||||||
cert ディレクトリ | 証明書類を格納するディレクトリ | ||||||||||||||||||
XXXXXXXXXX-certificate.pem.crt | モノの証明書 | ||||||||||||||||||
XXXXXXXXXX-private.pem.key | プライベートキー | ||||||||||||||||||
AmazonRootCA1WatchOver.pem | ルート CA | ||||||||||||||||||
watchoverproject-2019-XXXXXXXXXXXX.json | Googleスプレッドシートのサービスアカウントキー | ||||||||||||||||||
csvディレクトリ | CSVデータ保存用ディレクトリ | ||||||||||||||||||
count_data.csv | 過去30日間の10分間隔での検知件数のCSV | ||||||||||||||||||
logディレクトリ | ログファイルを格納するディレクトリ | ||||||||||||||||||
error.log | 何らかの原因でプログラムが異常終了した時にエラー原因を書き出すCSVファイル |
ファイルのアクセス権
プログラム類
ファイルのアクセス権は最小にしておいた方がリスクが少なくなる。
プログラムと初期設定ファイルをchmodコマンドで最小のアクセス権に変更した。
sudo chmod 400 initial.json
sudo chmod 400 WatchOver.py
証明書など
certディレクトリに移動して証明書類も全て権限を変更した。
cd cert
sudo chmod 400 *.*
ラズパイゼロをデスクトップからCLIに変更
OSの初期設定はデスクトップだったが、そのままにしておくとリソースも余計に消費するのでブートオプションをCLI(Command Line Interface)に変更してインターフェースのVNCも無効にする。
この後はコマンドラインベースでの操作になる。
ブートをCLIに変更する
RaspberryPiのメニューから”Raspberry Piの設定”でシステムタブから、
- ブートをデスクトップからCLIに変更する
- 現在のユーザとしてログインするのチェックを外す
VNCを無効にする
インターフェースタブに移動してVNCを無効にする。
SSHは使うので有効のままにしておき、再起動を行えば次回からはCLIベースのラズパイになる。
プログラムの自動起動
ラズパイのOSが起動した時に見守りシステムのプログラムが自動起動されるようにsystemdに設定する。
systemdの細かい設定については以前の記事を参照。
Serviceファイルの作成
watch-over.serviceファイルを/etc/systemd/system/配下に作成する。
sudo vi /etc/systemd/system/watch-over.service
[Unit]
Description = WatchOver
After=network-online.target
[Service]
ExecStart=/usr/bin/python /opt/WatchOver/WatchOver.py
Restart=always
Type=simple
[Install]
WantedBy=multi-user.target
サービスのスタート
以下のコマンドでサービスをスタートする。
※スタートと自動起動は別
sudo systemctl start watch-over.service
ステータスの確認
以下のコマンドでサービスのステータスを確認する。
sudo systemctl status watch-over.service
この時、何らかのエラーが出ているときには/var/log/syslogを確認する。
今回はgspreadのModule Not Foundのエラーが出ていたのでプログラム中で明示的にPathを指定する様に修正を行っている(以前の記事参照)
自動起動の設定
以下のコマンドでOS起動時にプログラムを自動起動するようにする。
また前述のServiceセクションで”Restart=always”としているので何らかの原因でプログラムが終了してしまったとしてもプログラムは再起動される。
sudo systemctl enable watch-over.service
sshで外部から遠隔操作できるように設定
ラズパイゼロは実家の両親の見守りに使おうと思っているので他県に設置する。
また両親にラズパイの操作は全く期待できないので遠隔で操作が出来る様に設定をしておく必要がある。
VPNの構築も考えたが両親の住居のルーターの機種の対応状況が分からないのでsshのポートフォワード(トンネリング)を使って遠隔ログインする事にした。
インターネット経由でssh接続できるサーバーを用意する必要があるがこのブログが入っているAWS EC2があるのでそれを使おうと思う。
ラズパイからsshでポートフォワーディング
まずはラズパイ側からAWS EC2にsshで接続する。
この際に-R ‘port番号2:localhost:port番号3’とパラメーターを設定して接続すると接続先側(AWS EC2)で自分自身(localhost)にport番号2で接続すると接続元(ラズパイ)へport番号3で接続ができる。
つまりAWS EC2→ラズパイへの逆方向への接続が可能になる(トンネリング)。
プライベートキーのコピー
AWS EC2はセキュリティの為、パスワード認証によるssh接続は不可にしており秘密鍵、公開鍵を使う公開鍵暗号方式にしている。
AWS EC2に接続するための秘密鍵(privatekey_to_ec2.pem)をラズパイの/home/login名/.ssh/配下にコピーする。
.sshディレクトリが無い場合は作成する。
cd ~/
mkdir .ssh
privatekey_to_ec2.pemを.ssh配下にWinSCP等でコピー
権限を最小限に変更する。
cd .ssh
sudo chmod 400 privatekey_to_ec2.pem
sshで接続
下記のコマンドでラズパイからAWS EC2にssh接続する。
ラズパイ起動時に自動的にコマンドを自動実行する設定(systemd)は後述する。
ssh -o ExitOnForwardFailure=yes -o ServerAliveInterval=20 -o TCPKeepAlive=yes -N -p port番号1 -i /home/login名/.ssh/privatekey_to_ec2.pem -R 'port番号2:localhost:port番号3' login名2@52.197.230.xxx
-o ExitOnForwardFailure=yes | フォワード接続に失敗したら終了する 後ほど、systemdで終了時には再接続するように設定するので問題ない |
-o ServerAliveInterval=20 | 20秒以内に接続確認ができないと終了する デフォルトは0で「応答確認しない」なので明示的に秒数を指定して指定した秒数での接続確認を行うように設定する |
-o TCPKeepAlive=yes | デフォルトはyesだが明示的に指定した TCPKeepAliveメッセージをサーバーに送信するかどうかの指定。 Yesの場合、何らかの接続の切断があった時にサーバーに通知されのだが一時的なダウンでも接続が切断されてしまうので、あえてnoで運用しているケースもある模様。 一方、TCPKeepAliveメッセージが送信されない場合はセッションがサーバー上で無期限にハングしてゴーストユーザーが残ってサーバーリソースが消費されてしまう可能性がある とりあえずyesで様子を見ることにした。 |
-N | 対話シェル画面を出さない -N無しで接続するとシェルが表示されて対話形式でコマンド入力を受け付ける画面になる 今回は裏で接続していれば良いだけなのでシェルを表示させない-Nを指定した |
-p port番号1 | AWS EC2にsshで接続する時のポート番号を指定する EC2ではセキュリティの為、デフォルトの22からは変更している またこのポート番号をAWSのセキュリティグループの設定で開けておく必要がある |
-i /home/login名/.ssh/privatekey_to_ec2.pem | -iで秘密鍵を指定する AWS EC2に接続する為の秘密鍵(事前にコピーしておく) |
-R ‘port番号2:localhost:port番号3’ | ポートフォワード接続 AWS EC2上でlocalhostに対してport番号2でssh接続をするとport番号3でラズパイにssh接続される 尚、ラズパイ側もデフォルトの22からポート番号3に変更している(変更した時の記事はこちら) ポート番号はユーザが自由に使える49152~65535番の任意の番号を割り当てている |
login名2@52.197.230.xxx | login名2:AWS EC2のログイン名 52.197.230.xxx:AWS EC2のIP Address 名前解決をしていればドメイン指定でもOK |
AWS EC2にpuTTYで接続する
まずはAWS EC2にターミナルソフト(puTTY)で接続する。
その後、AWS EC2上で自分自身(locahhost)にポート指定で接続する以下のコマンドを実行するとラズパイに接続することになる。
自分のパソコン→AWS EC2→ラズパイと接続される。
尚、ラズパイ側も公開鍵暗号方式にしているので接続時にパスフレーズを聞かれるので入力する。
ssh -p ポート番号2 -i /home/login名/.ssh/privatekey_to_rasppizero.pem login名@localhost
-p ポート番号2 | 前述のポート番号2を指定する EC2のlocalhostのポート番号 |
-i /home/login名/.ssh/privatekey_to_rasppizero.pem | AWS EC2上の.sshディレクトリにラズパイの秘密鍵ファイル(privatekey_to_rasppizero.pem)を保存しておく Raspbianはデフォルトでは公開鍵暗号方式では無くパスワード認証なのでデフォルトの設定のままであればこのパラメーターは不要 セキュリティを高めるためにラズパイゼロのsshを公開鍵暗号方式に変更している 変更方法に関する記事はこちら |
login名@localhost | ラズパイへのログイン名 デフォルトのpiからは変更している 変更方法の記事はこちら |
ラズパイゼロへ接続
ラズパイゼロへ接続される。
自動起動の設定
ラズパイからAWSへのssh接続は常時接続させておく必要がある。
何らかの原因でssh接続が切れてしまった時やラズパイを遠隔で再起動した時に自動的にssh接続されるようにしておきたい。
前述のプログラムの自動起動と同様にsystemdのserviceを登録する。
Serviceファイルの作成
ssh-to-ec2.serviceファイルを/etc/systemd/system/配下に作成する。
sudo vi /etc/systemd/system/ssh-to-ec2.service
[Unit]
Description = Connect to EC2 with ssh
After=network-online.target
[Service]
ExecStart=/usr/bin/ssh -o ExitOnForwardFailure=yes -o ServerAliveInterval=20 -o TCPKeepAlive=yes -N -p port番号1 -i /home/login名/.ssh/privatekey_to_ec2.pem -R 'port番号2:localhost:port番号3' login名2@52.197.230.xxx
User=login名
Restart=always
Type=simple
RestartSec=30s
[Install]
WantedBy=multi-user.target
User=login名としているのは秘密鍵ファイルのアクセス権を400に変更しているので特定のlogin名でしか読み取ることができないので指定している。
自動起動
プログラムの時と同様にスタートしてステータスを確認して問題がなければ自動起動の設定をする。
また”Restart=always”としているので何らかの原因でsshが切断されてしまっても再接続される。
sudo systemctl enable ssh-to-ec2.service
続く
以上でプログラム周りの環境設定は終了する。
次回はラズパイゼロ、モーションセンサーを納める外箱を100均のMDF材で作る記事とする。
動画
この記事の内容を動画で説明している。
systemdによる自動起動
まずはsystemdによる自動起動。
遠隔操作の為のポートフォワードsshの設定
自宅からプライベートネットワーク内のラズパイを遠隔操作する為にsshのポートフォワード設定を行った時の動画。
セッションが切れても自動的に再接続するようにsystmdの設定も行っている。
最近のコメント