Google CloudとローカルPCでファイルの送受信、クエリ実行する方法

# 紹介

イオンリテール（株）デジタル戦略部データソリューションGの丸尾です。
当チームは実店舗出身&非エンジニア人材のみで構成された
システムの内製化チームとなっておりまして、
今回はその中で利用しているものを共有します。

# 概要
本投稿ではGoogle Cloud Platform(GCP)とローカルPCを、
特定のCLI(SDK)ツールを利用してファイルの送受信や、
Biqueryからのデータ抽出を行う際のコンフィグ設定を説明します。

実際のイントラネットを介した連携は、
詳細なシステムを組んだ方が良いですが、
POC検証やクイックに試したい場合は参考にして下さい。

投稿はいくつか分けて投稿しますので各リンク先をご参照下さい。


# 稼働環境
💻windowsマシン(windows10)
弊社の従業員向けPCが基本windowsなのでwindowsマシンの方法を記載
公式リファランスにはmac,linuxマシンでの導入方法が記載されています

# 対象者
①本投稿はGCP初心者の方
②Azcopyなど別クラウドのsdkを使っていた方
③ベンダーに特定ファイルの連携行わせたい方

# 想定シナリオ
①ローカルPC→GCloudStorageへのファイル転送
②GCloudStorage→ローカルPCへのファイル取得
③ローカルPC→Bigqueryへのファイルデータアップロードとクエリ稼働
④Bigquery→ローカルPCへのクエリ結果ファイル取得
※+おまけ：これらをRPAで回すバッチファイル作成

# 実施方法

Google Cloud CLI(SDK)を導入したらまず初めに以下を実行
※CLIの導入方法は➡[こちら](https://qiita.com/bleachonn77/items/8beb3bad335be39bb7bf)

実施内容に応じてコンフィグ設定を実行
※コンフィグ設定方法は➡[こちら](https://qiita.com/bleachonn77/items/ad939e578408c85cace9)



①ローカルPC→GCloudStorageへのファイル転送

ローカルPCからGCS（Google Cloud Storage）にファイルをアップロードするには、gsutil cp コマンドを使用します。

コマンド例
```bash
gsutil cp ./local-file-path gs://your-bucket-name/destination-path/
```

./local-file-path：ローカルPC上のファイルパス。
gs://your-bucket-name/destination-path/：アップロード先のGCSバケットパス。

以下の様に実行すればファイルの一括送受信も可能
```bash
for %f in (source-dir-path\l0_*.csv) do (call gsutil cp %f "gs://your-bucket-name/%~nxf")
```

②GCloudStorage→ローカルPCへのファイル取得

GCSからローカルPCにファイルをダウンロードする場合も、gsutil cp コマンドを使用します。

```bash
gsutil cp gs://your-bucket-name/source-file-path ./local-destination-path
```

source-file-path：ダウンロード元のGCSファイルパス。
./local-destination-path：ローカルPC上の保存先パス。

以下の様に実行すればファイルの一括送受信も可能
```bash
for %f in (gs://your-bucket-name/l0_*.csv) do (call gsutil cp %f C:\Users\~~\source-dir-path\)
```



③ローカルPC→Bigqueryへのファイルデータアップロードとクエリ稼働

◆ファイルデータのアップロード

```bash
bq load --source_format=CSV dataset_name.table_name ./local-file-path ./schema.json
````
dataset_name：データセット名。
table_name：テーブル名。
./local-file-path：ローカルPC上のCSVファイルパス。
./schema.json：テーブルスキーマ定義ファイル。

◆クエリの実行

```bash
bq query --use_legacy_sql=false 'SELECT * FROM `project_id.dataset_name.table_name` WHERE column_name = "value"'
```
--use_legacy_sql=false：標準SQLを使用。
クエリ内のproject_id.dataset_name.table_nameはBigQueryのテーブル参照。

④Bigquery→ローカルPCへのクエリ結果ファイル取得

◆一度gcsを経由する方法
・クエリ結果をGCSにエクスポート
```bash
bq extract --destination_format CSV 'project_id.dataset_name.table_name' gs://your-bucket-name/destination-file.csv
```

・GCSからローカルPCにダウンロード

```bash
gsutil cp gs://your-bucket-name/destination-file.csv ./local-destination-path
```

◆直にbq結果をローカルPCにcsvで落とす方法

```csv
bq query --use_legacy_sql=false "SELECT DISTINCT columns1,columns2,columns3 FROM `project.dataset.table`"　> C:\\~~~~\\test.csv
```

※+おまけ：これらをRPAで回すバッチファイル作成

```bash
@echo off
chcp 65001
cd /d "%~dp0"

gcloud config configurations activate my-config && gcloud config set account my-account@gmail.com &&for %%f in (C:\Users\~~\source-dir-path\l0_*.csv) do (call gsutil cp %%f "gs://your-bucket-name/%~nxf") && python main.py 
 
@REM エラーが発生する際はpauseのコメントアウトを外す
@REM pause
```
注意：cmdからの実行ですと「%f」で実行できていた部分を「%%f」に変更する必要があります。
　　　また、日本語のフォルダだと処理がややこしくなるので可能な限りフォルダ名は英語で統一するのが望ましいです


# 結果

GoogleCloudとローカルPCでファイルの送受信、クエリ実行ができる

batを少しいじって処理が成功した時だけ次の処理を実行したりすれば、以下のような実行ができますので、
業務改善に役立てていただければと思います

・クラウドから店舗リスト取得→ローカルで保持している情報と当て込むRPA処理→成功した時だけ取得したデータ付きでクラウドに返す
・ローカルで保持しているcsvをアップロード→クエリ1を起動→成功した時だけクエリ2を起動

※もちろん個人情報や会社情報の取り扱いは注意です