注意
時間がないため、基本的には書き殴りになっており、表現にブレがあります。
検証できていない部分も多いため、不確実な記事となっておりますので、こんな操作方法もあるんだ程度にお読みください。
また、省略している部分や書き落としている部分もあるので、適宜調べていただく or コメント頂けますと幸いです。
この記事でやりたいこと
GCSにローカルのデータ(ディレクトリ)を簡単にアップロードし、インスタンスから操作できる状態にする。
現時点での問題点
※2020/3/3 時点
$ gsutil cp [コピーしたいファイル or ディレクトリ] [gs://ストレージ名/パス]
でディレクトリをコピーした場合、上記ストレージをマウントしたインスタンスなどから、
コピーしたディレクトリが見れないというバグ?が発生している。
すでに上記コマンドでコピーした場合は、ストレージのマウントを
$ gcsfuse --implicit-dirs [ストレージ名] [パス]
で行うと、ディレクトリが見れるようになっているが、データの読み込み等が遅くなるらしい。(未検証)
解決策
以下3通りの操作でストレージにデータディレクトリをアップロードした場合に、
対象のストレージをマウントしたGCPインスタンスから問題なくアクセスできることを確認。
ただし、データ数が多い場合や、インスタンスとストレージが同じリージョンにないと遅いかもしれない。
前提 :
・ローカルPCに gcloud, gcsfuseをインストール済み
・ローカルPCはmacOS(catalina)で検証。要検討だが、ubuntuでも多分できると思われる。
・今回の検証に使用したインスタンスは Deep Larning VMを使用。
・GCLOUD_WIDE_FLAGに関しては割愛
❶ストレージをマウントしてcp (mv)で直接データをアップロード
操作がローカルのPCだけで完結するので操作が楽。
また、ストレージに直接コピーするので時間的にも早い。
i) ローカルのPCでの操作
# ストレージのマウント
$ gcsfuse [ストレージ名] [パス]
# データのコピー
$ cp -r [コピーしたいディレクトリ] [gcsをマウントしたディレクトリ]
# アンマウント
$ umount [gcsをマウントしたディレクトリ]
・MacBook(catalina)へGCSをマウントする時に、最初の一回はセキュリティ的に弾かれるが、許可して再度実行するとマウントできる。
・マウントしたディレクトリに対象のデータをコピー時にpermission errorが起きることがあるが
「システム環境設定→セキュリティと〜→プライバシータブ→フルディスクアクセス→追加でterminal.app」
をするとできるようになる。
・could not copy extended attributes, unable to copy ACL などのエラーが出る場合もあるが、ファイル自体はコピーされるのでシカトでOK
->
extended attributesはファイルに付けられた属性 (画像であれば撮影地や撮影時間など)
ACLはファイルへのアクセス権限を持つユーザーなどの情報
❷インスタンスを介してアップロード
ローカルからインスタンスへのアップロードをして、インスタンスからGCPにアップロードする方法。
何かしらの理由で、ストレージをローカルのPCにマウントできない場合に有効だと思われる。
i) ローカルPCでの操作
# ローカルのディレクトリをインスタンスにアップロード
$ gcloud compute copy-files [ローカルのコピー元ディレクトリ] [インスタンス名]:[インスタンスのコピー先のディレクトリ]
ii) インスタンスでの操作
# インスタンスにストレージをマウント
$ gcsfuse [ストレージ名] [パス]
# インスタンスからストレージへコピー
$ cp -r [コピーしたいディレクトリ] [gcsをマウントしたディレクトリ]
❸アップロードしたいディレクトリをzip化してアップロード
面倒・時間と手間がかかる
i) ローカルPCでの操作
# 対象のディレクトリをzip化
$ zip [zip化した時の名前] [対象のディレクトリ]
# zipファイルのアップロード
$ gsutil cp [コピーしたいファイル or ディレクトリ] [gs://ストレージ名/パス]
ii) インスタンスでの操作
# ストレージのマウント
$ gcsfuse [ストレージ名] [パス]
# データのunzip (一度インスタンス内のディレクトリにコピーする必要があるかも、、?)
### 直接ストレージ内で解凍しようとすると処理がスタックするので、解凍先はインスタンスのディレクトリへ
$ unzip [対象のzipファイル] [解凍した画像を置くインスタンスのディレクトリ]
# 解凍したデータをストレージにコピー
$ cp [解凍したデータ] [ストレージ]
結論
アップロードしたいデータがあるPCにストレージをマウントして、データをコピーするのが一番早くて楽。