无法将任何文件写入存储桶,只能在 gcfuse 之后读取

无法将任何文件写入存储桶,只能在 gcfuse 之后读取

我在 Google Cloud 上部署了一个 Wowza Streaming Engine 实例,感谢在 Google Cloud Storage 中创建了一个存储桶,并使用 GCFUSE 将其全部挂载。我的存储桶已成功连接,我可以在存储桶中看到并列出,但我无法使用 gsutil 或任何 FTP 写入任何文件,甚至无法使用 RSA 密钥。我还尝试了 gcsfuse -o allow_other,但没有任何变化。我做错了什么,请帮忙

答案1

默认情况下,GCE VM 实例的Cloud API access scopes范围Storage设置为Read Only。将其设置为 是不够的Read Write。要解决此问题,您应该Full通过编辑 VM 实例或使用gcloud 命令当实例关闭时。

请查看以下步骤:

  1. 创建一个新的虚拟机实例和存储桶(可选):
$ gcloud compute instances create instance-1 --zone=us-central1-a --machine-type=e2-medium --image=ubuntu-1804-bionic-v20201014 --image-project=ubuntu-os-cloud
$ gsutil mb gs://test-prj-fuse-bucket-1
  1. ssh 进入虚拟机实例:
$ gcloud compute ssh instance-1 --zone=us-central1-a
  1. gsfuse按照以下步骤安装本文
instance-1:~$ export GCSFUSE_REPO=gcsfuse-`lsb_release -c -s`
instance-1:~$ echo "deb http://packages.cloud.google.com/apt $GCSFUSE_REPO main" | sudo tee /etc/apt/sources.list.d/gcsfuse.list
instance-1:~$ curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
instance-1:~$ sudo apt-get update
instance-1:~$ sudo apt-get install gcsfuse
  1. 按照以下步骤将 bucket 安装到 VM 实例本文
instance-1:~$ mkdir ~/bucket
instance-1:~$ gcsfuse test-prj-fuse-bucket-1 ~/bucket
Using mount point: /home/username/bucket
Opening GCS connection...
Mounting file system...
File system has been successfully mounted.
instance-1:~$ mount | grep gcsfuse
gcsfuse on /home/username/bucket type fuse (rw,nosuid,nodev,relatime,user_id=1001,group_id=1002,default_permissions)
  1. 检查存储桶的访问权限:
instance-1:~$ cd ~/bucket
instance-1:~/bucket$ touch test
touch: cannot touch 'test': Input/output error

因此,我们无法使用默认值进行写入Cloud API access scopes

  1. 关闭虚拟机实例并Cloud API access scopes使用命令进行更改:
$ gcloud beta compute instances set-scopes instance-1 --scopes=storage-full --zone=us-central1-a

或通过控制台。7.启动虚拟机实例,挂载存储桶并再次检查:

$ gcloud compute ssh instance-1 --zone=us-central1-a
instance-1:~$ gcsfuse test-prj-fuse-bucket-1 ~/bucket
instance-1:~/bucket$ touch test
instance-1:~/bucket$ ls 
test

现在一切正常。

或者,您可以按照如下所述使用服务帐户来解决此问题:

默认情况下,GCE 实例作为“Compute Engine 默认服务帐户”运行,该帐户仅对 GCS 对象具有读取权限。

要从 GCE 实例写入 GCS,请执行以下操作之一:

  • 创建具有roles/storage.objectAdmin角色的服务帐号
  • 将roles/storage.objectAdmin角色添加到您的GCE默认服务帐户

要使用 gcloud 实用程序将角色添加到您的 GCE 服务帐户,请运行

gcloud iam service-accounts list

然后找到标记为“Compute Engine 默认服务帐户”的条目。它将有一个电子邮件地址,例如[email protected].

要将角色添加到 GCE 服务帐户,请运行以下命令:

PROJECT_ID='' # Enter your GCP project ID SERVICE_ACCOUNT_EMAIL='' # Enter the service account email you found above 

gcloud projects add-iam-policy-binding "$PROJECT_ID" \ --member "serviceAccount:${SERVICE_ACCOUNT_EMAIL}" \ --role roles/storage.objectAdmin

看看这个Google 群组主题,以便使用 Cloud Storage Fuse 成功将存储桶挂载为文件系统。有关此主题的更多详细信息,请查看此文档

答案2

总结一下这次的讨论Google 群组主题为了能够使用 Cloud Storage Fuse 成功将存储桶挂载为文件系统,除了适当的 Linux 权限之外,您还需要为 VM 实例使用的服务帐户设置适当的 Google Cloud Storage 权限或角色(通过 IAM)。

因此,由于 Compute Engine 默认服务帐户在项目上具有编辑者角色,因此最简单的方法是将 Cloud Storage Scope 分配给实例本身。有关此主题的更多详细信息,请查看此文档

答案3

默认情况下,GCE 实例作为“Compute Engine 默认服务帐户”运行,该帐户仅对 GCS 对象具有读取权限。

要从 GCE 实例写入 GCS,请执行以下操作之一:

  • roles/storage.objectAdmin创建具有角色的服务帐号
  • roles/storage.objectAdmin角色添加到您的 GCE 默认服务帐户

要使用以下方式将角色添加到您的 GCE 服务帐户:gcloud公用事业, 跑步

gcloud iam service-accounts list

然后找到标记为“Compute Engine 默认服务帐户”的条目。它将有一个电子邮件地址,例如[email protected]

要将角色添加到 GCE 服务帐户,请运行以下命令:

PROJECT_ID='' # Enter your GCP project ID
SERVICE_ACCOUNT_EMAIL='' # Enter the service account email you found above

gcloud projects add-iam-policy-binding "$PROJECT_ID" \
  --member "serviceAccount:${SERVICE_ACCOUNT_EMAIL}" \
  --role roles/storage.objectAdmin

相关内容