Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

注意

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

jeankenshow
主にpython(scikit-learn, opencv, TensorFlow, Keras)での画像解析をしています。その他、Railsとreact - redux、node.jsを使った、バックエンドと少しのフロントエンドをば。Rも少しだけ触れます(物理的に)
rist-co
最新の人工知能(Deep Learning)を用いて人の視覚情報が関わる全ての業務の自動化を目指しています
https://www.rist.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away