RaspberryPiで撮影した画像・動画をS3・DynamoDBに転送する(Python)

kosa3
7 min readFeb 12, 2020

--

# はじめに

今回はRaspberryPiとカメラモジュールを利用して画像・動画を撮影し、S3に転送し、更新トリガーでDynamoDBにデータを挿入してみます。

# 準備するもの

・Raspberry Pi 3 model B
・Camera Module 2
・AWS (S3・Lambda・DynamoDB)

※事前にMacなどからRaspberryPiにssh接続できるようにしておくこと。
その際、Raspberry PiのIPはDHCPからstatic IPに固定しておくと便利です。

それではRaspberry Piにカメラモジュールを接続してみます。
以下写真の黒いカートリッジのような箇所を少し上にあげてカメラモジュールの銀の接続部分を接続するだけです。

ここまでできれば電源を入れ、RaspberryPiのconfig設定でCameraを有効にしたあと、接続ができていることが確認できます。

$ sudo raspi-config //interfacing optionでcamera設定ON$ vcgencmd get_camera // 前コマンドでrebootされたあとから実行
supported=1 detected=1

# 撮影

Cameraモジュールを操作するコマンドですが画像は `raspistill` 動画は `raspivid`という便利なコマンドがあります。それぞれ以下のように利用できます。

$ raspistill -o test.jpg
$ raspistill -vf -hf -o test.jpg // 画像の縦横回転
$ raspivid -o test.h264 // 動画撮影(デフォルト5秒)
$ raspivid -o test.h264 10000 // 動画撮影(10秒)

これで画像データや動画データを保存することができました。
h264という拡張子はあまり聞きなれていませんが、高画質の動画を取るために情報を最小限に抑えたフォーマットになっていて、監視カメラなどでも利用されています。
手持ちのパソコンなどでh264に対応しているメディアプレイヤーがない場合はraspividの公式にも記載されているmp4Boxを使って変換するか、ffmpegなどの変換ソフトウェアを用いるかになります。

# AWS S3に転送

まずは先ほど撮影した画像をawscliコマンドでS3に転送していきます。
pipでawscliをインストールしaws configureで設定をしていきます。
設定ができればS3のリストが表示されるか確認します。

※IAMには事前にS3の権限を与えておきます。

以下コマンドでS3に画像を転送することができます。

$ sudo pip3 install awscli — upgrade
$ aws --version
aws-cli/1.17.13 Python/3.7.3 Linux/4.19.75-v7+ botocore/1.14.13
$ aws configure
AWS Access Key ID [None]: xxxxxxxxxxxx
AWS Secret Access Key [None]: xxxxxxxxxxxx
Default region name [None]: xxxxxxx
Default output format [None]: text
$ aws s3 ls // バケット一覧が表示できたらOK$ aws s3 mv test.jpg s3://bucket-name/test.jpg

また、上記と同様なことをするPythonでスクリプトを書いてみたのが以下です。このぐらいならシェルスクリプトでもいけそうですが、標準ライブラリの便利さなどからPythonなどのツールを使うことがベターかなと思いました。

その他にも、AWS S3に転送する方法としてサーバー上でディスクのように見立ててS3をマウントして利用するGoで作られたgoofysなどツールがあります。

ただしS3をマウントする方法は、AWSのBlackbeltでも紹介されている通りサーバーのディスクのようにマウントすることは非推奨で、理由としてはAPIでの通信時や大量のデータへの更新などでラグが発生する原因にもなりうるためです。

今回は(goofysがうまく入らなかったので非推奨を言い訳に)awscliやboto3などで対応することにしました。

※ 一応Goのインストール手順だけやってみたので紹介。

$ wget https://golang.org/dl/go1.11.3.linux-armv6l.tar.gz
$ sudo tar -C /usr/local -xzf go1.11.3.linux-armv6l.tar.gz
$ cat /usr/local/go/VERSION
go1.11.3
$ export PATH=$PATH:/usr/local/go/bin > vi ~/.bashrc
$ which go
$ source ~/.bashrc
$ which go
/usr/local/go/bin/go

# LambdaとDynamoDBの連携

次にS3に画像が配置されたことをトリガーに動くLambdaを作成します。
AWS Management Consoleからlambda関数を作成し、関数に割り当てられているロールに対してDynamoDBのポリシーをアタッチします。

S3をトリガーイベントに設定し、Objectが更新(Put)されたタイミングでDynamoDBに更新日時とBucketキー(ファイルパス)を挿入します。

実際に以下のようにデータが確認ができれば成功です。

左) S3 右)DynamoDB

まとめ

モジュールをRaspberryPiに接続するだけで簡単に操作できるのはとても便利でした。また、他のクラウドサービスやセンサーなどと連携させることで、毎日の部屋掃除状態や冷蔵庫の中身の確認など日常でも使えそうな可能性が広がるのでハードは夢があって面白い。。(まだまだ初心者だけど)

また、RaspberryPiに諸々インストールをしている間にCPUの使用率、温度など見てみると使用率の増減や熱が短時間で10度以上も差があることがわかりました。普段アプリケーション開発や特にクラウド環境などではあまり意識していなかったところなのでRaspberryPiの状態を都度確認してみると面白そうです。Mackerelとか入れてRaspberryPiの監視を入れても良さそう。

--

--