skickaでGCP無料インスタンスからGoogleDriveにファイルをアップロードする方法

# skickaでGCP無料インスタンスからGoogleDriveにファイルをアップロードする方法

## なぜこんなことをする必要があるの？
自宅のネットワークが不安定なため、データ収集の途中で失敗することがある。
GCPにインスタンスを立てて、処理を完了させたあとでローカルに落とせばいいのでは？
しかし、外部向けの下り1GBを超えると課金が発生してしまう。
インスタンスからGoogle Drive にアップロードしてから、ローカルにダウンロードすれば無料枠で解決できそう。

## 環境

* ゾーン
us-west1-a

* ディスクサイズ
30GB

* ソースイメージ
cos-dev-88-15978-0-0

* マシンタイプ
f1-micro（vCPU x 1、メモリ 0.6 GB）

* `docker -v`
Docker version 20.10.3, build 48d30b5b32

* `cat /etc/os-release`
* 
```
NAME="Container-Optimized OS"
ID=cos
PRETTY_NAME="Container-Optimized OS from Google"
HOME_URL="https://cloud.google.com/container-optimized-os/docs"
BUG_REPORT_URL="https://cloud.google.com/container-optimized-os/docs/resources/support-policy#contact_us"
GOOGLE_METRICS_PRODUCT_ID=26
GOOGLE_CRASH_ID=Lakitu
KERNEL_COMMIT_ID=dfd65b9b9fe80d8ba3e4410d2dd0fe2c16303b6d
VERSION=93
VERSION_ID=93
BUILD_ID=16379.0.0
```

## 前提

1. インスタンスは作成済み
1. Google Drive APIは有効済みかつ認証情報の設定済み
1. インスタンスを汚さずにdocker内で完結させる

## 手順

1. skickaの設定ファイルを保存するためのDocker Volumeを作成
1. 一時的なGoコンテナでskickaの初期設定をする
1. 動作確認


### 手順1/3 skickaの設定ファイルを保存するためのDocker Volumeを作成

volumeを作成するには `docker volume create` を使用します。

```
# skickaの設定ファイルを保存するvolumeを作成
$ docker volume create --name skicka-config-volume
skicka-config-volume
$ docker volume ls
DRIVER    VOLUME NAME
local     skicka-config-volume
```

### 手順2/3 一時的なGoコンテナでskickaの初期設定をする

```
# golangイメージをダウンロード
# さきほどのvolumeをマウントしつつgolangコンテナを作成
$ docker run --rm -v skicka-config-volume:/mnt/skicka-config/ -it golang bash
```
```
## skickaをインストール
$$ go get github.com/google/skicka

## skickaの設定
$$ skicka init
$$ cat > .skicka.config
[google]
	clientid=YOUR_GOOGLE_APP_CLIENT_ID(変更してください)
	clientsecret=YOUR_GOOGLE_APP_SECRET(変更してください)
    apikey=YOUR_API_KEY(変更してください)
[encryption]
[upload]

## リンクにアクセスして表示されたコードを入力する
$$ skicka -no-browser-auth df
Go to the following link in your browser:
https://accounts.google.com/o/oauth2/auth?client_id=*****************************...
Enter verification code: ***********
Capacity     2.00 TiB
Trash           0 B       0.00%
Drive           0 B       0.00%
Gmail       30.06 MiB     0.00%
Photos          0 B       0.00%
Free space   2.00 TiB    100.00%

## 設定ファイルをvolumeにコピーする
$$ cp -vipr .skicka.config .skicka.metadata.cache .skicka.tokencache.json /mnt/skicka-config/
'.skicka.config' -> '/mnt/skicka-config/.skicka.config'
'.skicka.metadata.cache' -> '/mnt/skicka-config/.skicka.metadata.cache'
'.skicka.tokencache.json' -> '/mnt/skicka-config/.skicka.tokencache.json'
```

### 手順3/3 動作確認

```
# skickaコンテナを実行（さきほどと同じような出力になるかを確認する）
# ソースを見たところかなりシンプルに作ってあったので選びました。他のイメージでも構いません。
$ docker run --rm -it -v skicka-config-volume:/mnt/skicka-config/ --name skicka satackey/skicka \
>  -config /mnt/skicka-config/.skicka.config \
>  -metadata-cache-file /mnt/skicka-config/.skicka.metadata.cache \
>  -tokencache /mnt/skicka-config/.skicka.tokencache.json \
>  df
Capacity     2.00 TiB
Trash           0 B       0.00%
Drive           0 B       0.00%
Gmail       30.06 MiB     0.00%
Photos          0 B       0.00%
Free space   2.00 TiB    100.00%

$ cat > /tmp/test.txt
てすと

# ファイルアップロードの動作確認
# アップロードしたいファイルのディレクトリ（フルパス）を/tmpにマウントしておく
$ docker run --rm -it \
 -v skicka-config-volume:/mnt/skicka-config/ \
 -v /tmp:/tmp \
 satackey/skicka \
 -config /mnt/skicka-config/.skicka.config \
 -metadata-cache-file /mnt/skicka-config/.skicka.metadata.cache \
 -tokencache /mnt/skicka-config/.skicka.tokencache.json \
 upload /tmp/test.txt /test.txt
```

![test.txt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1390481/032fe0ad-4836-752b-36a8-d29f297b09ab.png)

無事アップロードされています。

試しに1.5GBくらいのファイルをアップロードしたときのアップロード速度は8.5MiB/sとなかなか早くていい感じです。
![monitoring.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1390481/4899090a-4e4a-b5ab-3a83-aeef34c77acd.png)