開発日誌:ラズパイ+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'})