LoginSignup
0
0

More than 3 years have passed since last update.

GCSへデータをアップロードする時「フォルダが見えない」状態を回避する方法

Last updated at Posted at 2020-03-03

注意

時間がないため、基本的には書き殴りになっており、表現にブレがあります。
検証できていない部分も多いため、不確実な記事となっておりますので、こんな操作方法もあるんだ程度にお読みください。
また、省略している部分や書き落としている部分もあるので、適宜調べていただく 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にストレージをマウントして、データをコピーするのが一番早くて楽。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0