Cloud StorageへPythonを使ってファイルをアップロードする方法【RaspberryPIで定点カメラを作る #1】

# 最初に
RaspberryPIで定点カメラを作ったので備忘録 第一弾です。
動画も作成したのでよろしく！
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/rqwImAxRjec/0.jpg)](http://www.youtube.com/watch?v=rqwImAxRjec)

# 分かること
 * google cloud storageのアップロード方法

# 作成
## 用意するもの

 * GoogleCloudPlatformのアカウント


## 手順
### １．GoogleCloudPlatform関連

#### GoogleCloudPlatform(GoogleCloudStorage)って？
基本的には下記のようなサービスです。
>Googleが提供するクラウドにある巨大なフォルダのようなもので、ファイルを書き込んだり 読み込んだりが簡単に出来るサービスです。
>価格は無料分もありますが、読み込み・書き込み・存在するデータサイズで課金されていきます。

**Cloud側設定**
GoogleCloudPlatformにログインしていただき、横の`Storage`>`ブラウザ`をクリックします。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/45436381-c1c7-1218-5e6a-c9e9f220fd37.png">

表示されたページで`バケットを作成`をクリックします。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/a81ff541-1fb0-ca5d-a789-f70c47d7d84f.png">

こんな感じでバケットを作成します。
バケット名は自由でいいです。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/1d59c314-c50c-c04c-e2d2-29a383f186d5.png">
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/fa2c3b5a-7db9-13e8-02f2-ff088324b648.png">
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/36717546-906d-6149-b03d-55f7ec94b1a4.png">

作成が完了したら、アクセスするサービスアカウントを作成します。
左のメニューから`IAMと管理`>`サービスアカウント`をクリックします。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/23dced2d-cdf3-86ab-e6aa-60fe45ea62d1.png">

画面上部の`サービスアカウントを作成`をクリックします
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/3e0016be-3079-be39-074d-988481afb7eb.png">

名前は適当でいいです。わかりやすいものにしてください。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/b42570f6-8c35-1540-a2c7-d0048b527299.png">

`サービスアカウントの権限`ではCloud Storageの権限を付与します。
ロールでは`Cloud Storage`>`ストレージの管理者`としておいてください
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/06bc4579-beed-b8e3-4215-551c066ba527.png">

最後に`キーの作成`をクリック
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/f1ef2fd5-87fb-4d02-120b-c47677f39313.png">

`JSON`タイプを選択した状態で`作成`をクリックするとダウンロードできます。
このファイルは後で利用するので大切に保管しておいてください。
また、この情報が公になると大量の請求が来たりするのでご注意ください。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/6c48b0d0-2fbe-fdb9-adad-42003c178d57.png">

**ローカル側で確認**
Pythonの環境を構築していきます。
今回、`python3`を利用するため、下記のコマンドで環境を入れます。

```shell
sudo apt install python3 python3-pip
```

インストールが完了したら、Cloud Storageにアクセスするため、`google-cloud-storage`というpythonのモジュールをインストールします。

```shell
pip3 install google-cloud-storage
```

そして、テスト用のコードを作成します。
下記のコードをnanoなどで作成してください。

```shell
#nano で作る場合
nano file2gs.py
```

※バケット名の部分は自分のバケット名を入れてください。

```python:file2gs.py
# /home/pi/image.jpgをアップロードするお試しコード
from google.cloud import storage
import os
os.environ["GOOGLE_APPLICATION_CREDENTIALS"]="/home/pi/gkey.json"
client = storage.Client()
bucket = client.get_bucket('{バケット名}')
blob2 = bucket.blob('test.txt')
blob2.upload_from_filename(filename='/home/pi/test.txt')

```

実行する前に先程ダウンロードしたjsonファイルを開いてコピーして`gkey.json`というファイルに書き込みます。

```shell
#nano で作る場合
nano gkey.json
```

開いたファイルに内容をコピーしてください。
また、アップロードするファイルも作成しておきます。

```shell
echo "hi. this is text file">test.txt
```

この状態で、下記のコマンドを入力し、実行します。

```shell
python3 file2gs.py

```

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/6479f06a-23b8-1a25-bb56-981eec3722b8.png">

下のリンクをクリックすれば内容も確認できます。
デフォルトでは世界には公開されないのでご安心を…
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/068c372d-7f2f-8af6-88bc-ac315f1ae15c.png">

これで、クラウドにデータをアップロードすることができました。