Google Cloud Storage (GCS)にファイルをアップロード ~ ローカルのPythonで読み込む

# 環境
- MacOS X 10.14.5 (Mojave)
- Homebrew 2.2.5
- Google Cloud SDK 279.0.0
- gsutil 4.47


# GCPアカウント登録
[【画像で説明】Google Cloud Platform (GCP)の無料トライアルでアカウント登録](https://qiita.com/komiya_____/items/14bd06d0866f182ae912)


# Google Cloud SDKのインストール
[Google Cloud SDKのインストール ~ 初期化](https://qiita.com/komiya_____/items/5af0dcc8639fad9fee29)


# プロジェクト作成
[Google Cloud SDKでプロジェクトを作成する](https://qiita.com/komiya_____/items/fb02f38e1886db280d52)


# バケット作成
$ gsutilはstorageを操作するコマンドです。

```bash
$ gsutil mb -l us-central1 gs://バケット名
```

# ファイルのアップロード
※ gcs上にディレクトリがない場合は作成される。

```bash
$ gsutil cp ローカルファイルのパス gs://バケット名/ディレクトリ名/ファイル名
```

# サービスアカウント / サービスアカウントキーの作成
PythonからGCSにアクセスできるうようにするため、サービスアカウント / サービスアカウントキーを作成します。

### サービスアカウント作成

```bash
gcloud iam service-accounts create サービスアカウントネーム \
                                   --display-name サービスアカウントディスプレイネーム \
```
<img width="1137" alt="スクリーンショット 2020-02-10 0.10.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/f50a8e15-dd4f-f488-846b-c6fdf0d8bf85.png">

### 今プロジェクトに紐付いている権限を確認

```bash
gcloud projects get-iam-policy mypj-id

# bindings:
# - members:
#   - user:anata_no_address@gmail.com
#   role: roles/owner
# etag: BwWeTrntoao=
# version: 1
```


### サービスアカウントへ権限付与
ストレージ管理者の権限を付与

```bash
gcloud projects add-iam-policy-binding プロジェクトID \
--member serviceAccount:サービスアカウントネーム@プロジェクトID.iam.gserviceaccount.com \
--role roles/storage.admin
```
<img width="1137" alt="スクリーンショット 2020-02-10 0.16.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/d01bb796-0ab7-211a-2d56-05b7d14bb7aa.png">

### roleリスト
https://cloud.google.com/iam/docs/understanding-roles?hl=ja#predefined_roles


### 再度権限を確認

```bash
gcloud projects get-iam-policy mypj-id

# bindings:
# - members:
#   - user:anata_no_address@gmail.com
#   role: roles/owner
# - members:
#   - serviceAccount:mysa-name@mypj-id.iam.gserviceaccount.com
#   role: roles/storage.admin
# etag: BwWeTz6vIBY=
# version: 1
```


### サービスアカウントキー作成

```bash
$ gcloud iam service-accounts keys create ./service_account_keys/anata_no_key.json \
--iam-account サービスアカウントネーム@プロジェクトID.iam.gserviceaccount.com
```

# ディレクトリ構成

```
.
├── .env
├── service_account_keys/
│      └── anata_no_key.json
└── working/
        └── main.py
```

# .env

環境変数にさっき作ったサービスアカウントキーのパスを設定するためこんな記述で。
**※ 読み込み元ファイル（load_dotenv()してるファイル）からの相対パス**

```:.env
GOOGLE_APPLICATION_CREDENTIALS=./service_account_keys/anata_no_key.json
```


# ライブラリのインストール
`google-cloud-storage` `python-dotenv` `pandas` をpipでインストール

```bash
$ pip install google-cloud-storage python-dotenv pandas
```

# Pythonでダウンロード

```py:main.py
import os
from io import BytesIO

from dotenv import load_dotenv
from google.cloud import storage
import pandas as pd


# .envの内容を環境変数に設定
load_dotenv('./.env')

PROJECT_ID = 'anata_no_project_id'
BUCKET_NAME = 'anata_no_bucket'
FILE_PATH = 'path/to/dir/train.csv' # gs://バケット名/~以下のパス

client = storage.Client(PROJECT_ID)
bucket = client.get_bucket(BUCKET_NAME)
blob = storage.Blob(FILE_PATH, bucket)
data = blob.download_as_string()
df = pd.read_csv(BytesIO(data))
print(df)

# ローカルに保存する場合
blob.download_to_filename('path/to/local/dir')
```

dfとして表示されればOKです。