web-dev-qa-db-ja.com

gcsfuse入力/出力エラー

Linux(Ubuntu 15.10)ディレクトリにマウントされたGoogleクラウドストレージバケットにディレクトリまたはファイルを作成しようとすると、入出力エラーが発生します。

私が行った手順:

  • Transferという名前のユーザーを作成しました
  • /mnt/backupsディレクトリを作成し、chown -R transfer /mnt/backupsを実行しました
  • ユーザー転送として、gcsfuse --implicit-dir backup01-bucket /mnt/backupsを実行しました。ファイルシステムが正常にマウントされます
  • mkdir testを実行し、エラーmkdir: cannot create directory test: Input/output errorを取得します

見逃したことはありますか?私がやろうとしているのは、ファイルをサーバーにftpで送信し、ローカルストレージではなくGoogleストレージバケットに保存できるようにすることです。

更新デバッグ情報を取得するようにコマンドを変更しました:

gcsfuse --implicit-dirs --foreground --debug_gcs --debug_Fuse backup01-bucket /mnt/backups

次に、transferユーザーとしてmkdir /mnt/backups/testを実行しました。

次のbedug情報が出ました:

Fuse_debug: Op 0x00000060        connection.go:395] <- GetInodeAttributes (inode 1)
Fuse_debug: Op 0x00000060        connection.go:474] -> OK
Fuse_debug: Op 0x00000061        connection.go:395] <- LookUpInode (parent 1, name "test")
gcs: Req             0x3a: <- StatObject("test/")
gcs: Req             0x3b: <- ListObjects()
gcs: Req             0x3c: <- StatObject("test")
gcs: Req             0x3c: -> StatObject("test") (53.375107ms): gcs.NotFoundError: googleapi: Error 404: Not Found, notFound
gcs: Req             0x3b: -> ListObjects() (59.061271ms): OK
gcs: Req             0x3a: -> StatObject("test/") (71.666112ms): gcs.NotFoundError: googleapi: Error 404: Not Found, notFound
Fuse_debug: Op 0x00000061        connection.go:476] -> Error: "no such file or directory"
Fuse_debug: Op 0x00000062        connection.go:395] <- MkDir
gcs: Req             0x3d: <- CreateObject("test/")
gcs: Req             0x3d: -> CreateObject("test/") (22.090155ms): googleapi: Error 403: Insufficient Permission, insufficientPermissions
Fuse_debug: Op 0x00000062        connection.go:476] -> Error: "CreateChildDir: googleapi: Error 403: Insufficient Permission, insufficientPermissions"
Fuse: 2016/04/04 06:51:02.922866 *fuseops.MkDirOp error: CreateChildDir: googleapi: Error 403: Insufficient Permission, insufficientPermissions
2016/04/04 06:51:08.378100 Starting a garbage collection run.
gcs: Req             0x3e: <- ListObjects()
gcs: Req             0x3e: -> ListObjects() (54.901164ms): OK
2016/04/04 06:51:08.433405 Garbage collection succeeded after deleted 0 objects in 55.248203ms.

注: Webコンソールでディレクトリを作成すると、ディレクトリが正常に表示されます。

10
user1476207

デバッグ出力のInsufficient Permissionエラーから、gcsfuseにはバケットに対する十分な権限がないようです。おそらく読み取り専用アクセスがあります。

Gcsfuseの credentials ドキュメントを必ずお読みください。特に、GCEでサービスアカウントを使用している場合はVM storage-fullアクセススコープでVM)を設定してください。

12
jacobsa

問題は不十分な権限に起因しますが、notを破棄して再作成する必要はありませんVMこの問題を解決するためのさまざまなスコープ。本番システムにより適した別のアプローチは次のとおりです。

  1. サービスアカウントを作成する
  2. サービスアカウントのキーを作成し、JSONファイルをダウンロードします
  3. サービスアカウントに適切な役割を付与する
  4. バケットのサービスアカウントに適切な権限を付与します
  5. サービスアカウントのJSON資格情報をVMにアップロードします

最後に、コマンドラインからgcsfuseを呼び出すときに、サービスアカウントの資格情報へのパスを含む環境変数を定義します。

GOOGLE_APPLICATION_CREDENTIALS=/root/credentials/service_credential_file.json gcsfuse bucket_name /my/mount/point

key_fileオプションを使用して、fstabで同じことを実行します。これらのオプションは両方とも gcsfuse資格情報のドキュメント に記載されています。 (編集:このオプションは文書化されていますが、私には機能しません。)

興味深いことに、VM)でサービスアカウントを構成した場合でも、環境変数またはkey_fileオプションを使用する必要があります。

gcloud auth activate-service-account --key-file /root/credentials/service_credential_file.json

何らかの理由で、gcsfuseはアクティブな資格情報アカウントを無視します。

VM)を作成するときにstorage-fullスコープを使用すると、VMが属するすべてのバケットに完全にアクセスできるため、セキュリティと安定性に影響があります。ファイルストレージサーバーは、ログバケットのログを本当に上書きできるのでしょうか、それとも別のバケットのデータベースバックアップを読み取ることができるのでしょうか。

12
Craig Finch

この問題は、資格情報ファイルがないために発生します。

go tohttps://cloud.google.com/docs/authentication/production

サービスアカウントの作成

  • アカウントの作成後にjsonファイルを取得します。
  • VMインスタンスにjsonをアップロードします。
  • / etc/fstabに以下を入力します。

    {{gcpバケット名}} {{マウントパス}} gcsfuse rw、noauto、user、key_file = {{/ path/to/key.json}}

    すでにマウントを解除している場合は、最初にアンマウントします。

  • $マウント-a

このリンクをたどる

https://github.com/GoogleCloudPlatform/gcsfuse/blob/master/docs/mounting.md#credentials

0
Abhimanyu Kmar

この問題は、そのバケットに保持ポリシー/ルールを設定した場合にも発生する可能性があります。私と同じように、マウントされたフォルダー内のファイルを更新しようとすると、同じ入出力エラーが発生しました。根本的な原因は、1か月前にファイルを削除しないという保持ポリシーを追加したことです。

0
Mukesh Rajput