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. インスタンスは作成済み
  2. Google Drive APIは有効済みかつ認証情報の設定済み
  3. インスタンスを汚さずにdocker内で完結させる

手順

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

手順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

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

試しに1.5GBくらいのファイルをアップロードしたときのアップロード速度は8.5MiB/sとなかなか早くていい感じです。