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

- 出版社/メーカー: Raspberry Pi
- メディア: Personal Computers
- この商品を含むブログを見る
今までの経緯
カメラを作動させて・・・ k-mawa.hateblo.jp
pythonで動けるようにして・・・ k-mawa.hateblo.jp
今回は、撮影した画像をS3(Amazon AWSのストレージサービス)にアップして見えるようにします。
手順
1:S3でバケットをつくる。
S3でバケットを作ります。アクセス権限はパブリックにしてください。

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'という名称でアップロードしてね。」という意味です。
バケットを見ると、無事アップロードされていますね!

ちょっと見てみましょう・・・

おや!ダイアログで選択しないと見れないとかなんとか・・・これは不便・・・

これを解説するには、オプションのプロパティをくっつけときます。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はすぐ閲覧できました。

まとめたコードがこちら(セキュリティ上パス一部改変)
"""
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'})