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
前提
- インスタンスは作成済み
- Google Drive APIは有効済みかつ認証情報の設定済み
- インスタンスを汚さずにdocker内で完結させる
手順
- skickaの設定ファイルを保存するためのDocker Volumeを作成
- 一時的なGoコンテナでskickaの初期設定をする
- 動作確認
手順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となかなか早くていい感じです。