Mawa Town

Mawaという人が作る小さな町でMawaTownです。技術と音楽が好き。

開発日誌:ラズパイ+AWS S3でネットワークカメラもどきを作ってみるvol.3:カメラで撮った写真をS3へアップロード

これを使って遊びます。

Raspberry Pi Camera V2

Raspberry Pi Camera V2

今までの経緯

カメラを作動させて・・・ k-mawa.hateblo.jp

pythonで動けるようにして・・・ k-mawa.hateblo.jp

今回は、撮影した画像をS3(Amazon AWSのストレージサービス)にアップして見えるようにします。

手順

1:S3でバケットをつくる。

S3でバケットを作ります。アクセス権限はパブリックにしてください。 f:id:k_mawa:20180106144448p:plain

BUKKET NAMEは "picamerakmawa"にしました。

2:boto3をインストール

AWSを動かす用のモジュールはboto3といいます。

(py3env) [USERNAME]:~/py3env $ pip3 install boto3
Collecting boto3
  Downloading boto3-1.5.9-py2.py3-none-any.whl (128kB)
    100% |████████████████████████████████| 133kB 851kB/s 
Collecting botocore<1.9.0,>=1.8.23 (from boto3)
  Downloading botocore-1.8.23-py2.py3-none-any.whl (4.0MB)
    100% |████████████████████████████████| 4.0MB 44kB/s 
Collecting jmespath<1.0.0,>=0.7.1 (from boto3)
  Downloading jmespath-0.9.3-py2.py3-none-any.whl
Collecting s3transfer<0.2.0,>=0.1.10 (from boto3)
  Downloading s3transfer-0.1.12-py2.py3-none-any.whl (59kB)
    100% |████████████████████████████████| 61kB 779kB/s 
Collecting docutils>=0.10 (from botocore<1.9.0,>=1.8.23->boto3)
  Downloading docutils-0.14-py3-none-any.whl (543kB)
    100% |████████████████████████████████| 552kB 254kB/s 
Collecting python-dateutil<3.0.0,>=2.1 (from botocore<1.9.0,>=1.8.23->boto3)
  Downloading python_dateutil-2.6.1-py2.py3-none-any.whl (194kB)
    100% |████████████████████████████████| 194kB 457kB/s 
Collecting six>=1.5 (from python-dateutil<3.0.0,>=2.1->botocore<1.9.0,>=1.8.23->boto3)
  Downloading six-1.11.0-py2.py3-none-any.whl
Installing collected packages: docutils, jmespath, six, python-dateutil, botocore, s3transfer, boto3
Successfully installed boto3-1.5.9 botocore-1.8.23 docutils-0.14 jmespath-0.9.3 python-dateutil-2.6.1 s3transfer-0.1.12 six-1.11.0

無事ダウンロードできました。

3:awscliインストール

これはアクセスキーとかの管理用モジュールかと思われます。とりあえずアクセスキーをラズパイ内部で機能させるのに必要ですのでインストールします。

(py3env) [USERNAME]:~/py3env $ pip3 install awscli
Collecting awscli
  Downloading awscli-1.14.19-py2.py3-none-any.whl (1.2MB)
    100% |████████████████████████████████| 1.2MB 155kB/s 
Collecting rsa<=3.5.0,>=3.1.2 (from awscli)
  Downloading rsa-3.4.2-py2.py3-none-any.whl (46kB)
    100% |████████████████████████████████| 51kB 1.1MB/s 
Requirement already satisfied: botocore==1.8.23 in ./lib/python3.4/site-packages (from awscli)
Requirement already satisfied: s3transfer<0.2.0,>=0.1.12 in ./lib/python3.4/site-packages (from awscli)
Collecting colorama<=0.3.7,>=0.2.5 (from awscli)
  Downloading colorama-0.3.7-py2.py3-none-any.whl
Requirement already satisfied: docutils>=0.10 in ./lib/python3.4/site-packages (from awscli)
Collecting PyYAML<=3.12,>=3.10 (from awscli)
  Downloading PyYAML-3.12.tar.gz (253kB)
    100% |████████████████████████████████| 256kB 596kB/s 
Collecting pyasn1>=0.1.3 (from rsa<=3.5.0,>=3.1.2->awscli)
  Downloading pyasn1-0.4.2-py2.py3-none-any.whl (71kB)
    100% |████████████████████████████████| 71kB 1.1MB/s 
Requirement already satisfied: jmespath<1.0.0,>=0.7.1 in ./lib/python3.4/site-packages (from botocore==1.8.23->awscli)
Requirement already satisfied: python-dateutil<3.0.0,>=2.1 in ./lib/python3.4/site-packages (from botocore==1.8.23->awscli)
Requirement already satisfied: six>=1.5 in ./lib/python3.4/site-packages (from python-dateutil<3.0.0,>=2.1->botocore==1.8.23->awscli)
Building wheels for collected packages: PyYAML
  Running setup.py bdist_wheel for PyYAML ... done
  Stored in directory: /home/[USERNAME]/.cache/pip/wheels/2c/f7/79/13f3a12cd723892437c0cfbde1230ab4d82947ff7b3839a4fc
Successfully built PyYAML
Installing collected packages: pyasn1, rsa, colorama, PyYAML, awscli
Successfully installed PyYAML-3.12 awscli-1.14.19 colorama-0.3.7 pyasn1-0.4.2 rsa-3.4.2

できた〜

4:AWSアクセスキーなどラズパイ内部に登録

次に実際にawscliを使ってアクセスキーを入れます。

(py3env) [USERNAME]:~/py3env $ aws configure
AWS Access Key ID [None]: ***********
AWS Secret Access Key [None]: ***********
Default region name [None]: ***********
Default output format [None]: json

"Default output format"はjsonと入れとけばとりあえずはOK。(デフォルト設定)

configure fileができてるかなと、ためしに見てみると・・・

(py3env) [USERNAME]:~/py3env $ ls
bin  include  lib  pip-selfcheck.json  test_by_python.jpg
(py3env) [USERNAME]:~/py3env $ ls -a
.  ..  bin  include  lib  pip-selfcheck.json  test_by_python.jpg

ないですね。それで大丈夫です。一番上のディレクトリに隠れフォルダで".aws"というフォルダに格納されています^^

(py3env) [USERNAME]:~/py3env $ cd ../
(py3env) [USERNAME]:~ $ ls -a
.              .config          .python_history                        public_html
..             .dbus            .ssh                                   py3env
.Xauthority    .dmrc            .themes                                ダウンロード
.anthy         .gstreamer-0.10  .thumbnails                            テンプレート
.asoundrc      .idlerc          .viminfo                               デスクトップ
.aws           .ipython         .xsession-errors                       ドキュメント
.bash_history  .local           .xsession-errors.old                   ビデオ
.bash_logout   .minecraft       2018-01-06-114036_1280x1024_scrot.png  音楽
.bashrc        .pip             2018-01-06-114041_1280x1024_scrot.png  画像
.cache         .profile         2018-01-06-114043_1280x1024_scrot.png  公開

なかを見てみると・・・

(py3env) [USERNAME]:~ $ cd .aws
(py3env) [USERNAME]:~/.aws $ ls
config  credentials

ありましたね。打ち間違えたりしたらここから直接書き換えればOKです。

5:Pythonアップローダー実装

ようやくPythonコードが打てます。次のようにします。

>>> import boto3
>>> BUCKET_NAME = 'picamerakmawa'
>>> s3 = boto3.resource('s3')
>>> s3.Object(BUCKET_NAME, 'test_by_python.jpg').upload_file('/home/[ユーザー名]/py3envt_by_python.jpg')

解説をしておくと、

s3.Object(BUCKET_NAME, 'test_by_python.jpg').upload_file('/home/[ユーザー名]/py3envt_by_python.jpg')

BUCKET_NAMEで指定したバケット('picamerakmawa')に'/home/[ユーザー名]/py3envt_by_python.jpg'パスの画像を、'test_by_python.jpg'という名称でアップロードしてね。」という意味です。

バケットを見ると、無事アップロードされていますね! f:id:k_mawa:20180106145854p:plain

ちょっと見てみましょう・・・ f:id:k_mawa:20180106145909p:plain

おや!ダイアログで選択しないと見れないとかなんとか・・・これは不便・・・ f:id:k_mawa:20180106145919p:plain

これを解説するには、オプションのプロパティをくっつけときます。ExtraArgsの部分です。

>>>s3.Object(BUCKET_NAME, 'test_by_python2.jpg').upload_file('/home/[ユーザー名]/py3env/test_by_python.jpg', ExtraArgs={'ContentType': 'image/jpg', 'ACL': 'public-read'})

これでtest_by_python2.jpgはすぐ閲覧できました。 f:id:k_mawa:20180106145930p:plain

まとめたコードがこちら(セキュリティ上パス一部改変)

"""
capture
"""

import picamera
from datetime import datetime #本番では時間も計測してファイル名に埋め込んでいる

cam = picamera.PiCamera()
cam.resolution = (640,480)

image_name = "/home/[ユーザー名]/image_rooms/pycamera.jpg"

cam.capture(image_name)

"""
upload
"""

import boto3

BUCKET_NAME = 'picamerakmawa'
s3 = boto3.resource('s3')

s3.Object(BUCKET_NAME, 'pycamera.jpg').upload_file('/home/[ユーザー名]/image_rooms/pycamera.jpg', ExtraArgs={'ContentType': 'image/jpg', 'ACL': 'public-read'})