Google Cloud FUSE 与 Cloud Run [Errno 5] 输入/输出错误:'/database' 但已授予存储对象管理员访问权限

Posted

技术标签:

【中文标题】Google Cloud FUSE 与 Cloud Run [Errno 5] 输入/输出错误:\'/database\' 但已授予存储对象管理员访问权限【英文标题】:Google Cloud FUSE with Cloud Run [Errno 5] Input/output error: '/database' but already granted Storage Object Admin accessGoogle Cloud FUSE 与 Cloud Run [Errno 5] 输入/输出错误:'/database' 但已授予存储对象管理员访问权限 【发布时间】:2022-01-18 02:03:24 【问题描述】:

我正在使用 GCP 的 Cloud FUSE 和 Cloud Run,正如 google (https://cloud.google.com/run/docs/tutorials/network-filesystems-fuse#cloudrun_fs_code-python) 在本教程中所述。但是,在我部署该应用程序后,该应用程序无法访问该文件夹,而是在日志[Errno 5] Input/output error: '/database' 中出现此错误,其中“数据库”是文件夹名称根据我在线阅读的内容,这通常是由于没有足够的许可。但是,我检查了 Cloud FUSE 的仪表板,并且我已经授予 Storage Object Admin 访问应用程序服务帐户的权限。

该应用程序是用 python 3.9 编写的。我无法执行os.listdir('/database')。但是,当我使用os.listdir('/') 时,“数据库”是列表中的一项,os.path.isdir('/database') 返回 true。

【问题讨论】:

【参考方案1】:

我不清楚你为什么要找/database

您是通过--update-env-vars=MNT_DIR=/database,BUCKET=... 部署的吗?

应用默认为MNT_DIR=/mnt/gcs,因为这是在gcsfuse.Dockerfile中设置的

[Errno 5] 错误源自何处?

我按照教程中的原样部署了代码,它对我有用。

它使用/mnt/gcs(通过 Cloud Run 端点 url +/mnt/gcs 显示。

文件在刷新时创建,并且在 GCS 存储桶中可见。

更新

这是我的端到端脚本:

Q=70354313

BILLING="..." # Your Billing Account
PROJECT="$(whoami)-$(date +%y%m%d)-$Q" # Or ...
BUCKET="$(whoami)-$(date +%y%m%d)-$Q" # Or ...
REGION="us-west1" # Or ...

NAME="***"

MNT_DIR="/database"

ACCOUNT="***"
EMAIL="$ACCOUNT@$PROJECT.iam.gserviceaccount.com"

git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
cd python-docs-samples/run/filesystem/

# Use FUSE not Filestore
rm Dockerfile 
cp gcsfuse.Dockerfile Dockerfile

# GCP stuff
gcloud projects create $PROJECT

gcloud beta billing projects link $PROJECT \
--billing-account=$BILLING

SERVICES=(
    "artifactregistry"
    "cloudbuild"
    "run"
)
for SERVICE in $SERVICES[@]
do
  gcloud services enable $SERVICE.googleapis.com \
  --project=$PROJECT
done

# Create GCS Bucket
gsutil mb -l $REGION -p $PROJECT gs://$BUCKET

# Create Service Account
gcloud iam service-accounts create $ACCOUNT \
--project=$PROJECT

gcloud projects add-iam-policy-binding $PROJECT \
--member=serviceAccount:$EMAIL \
--role=roles/storage.objectAdmin

gcloud beta run deploy $NAME \
--source=$PWD \
--execution-environment=gen2 \
--allow-unauthenticated \
--service-account=$ACCOUNT \
--update-env-vars=MT_DIR=$MNT_DIR,BUCKET=$BUCKET \
--region=$REGION \
--project=$PROJECT 

然后:

ENDPOINT=$(\
  gcloud run services describe $NAME \
  --region=$REGION \
  --platform=managed \
  --project=$PROJECT \
  --format="value(status.url)") && echo $ENDPOINT

# Curl the Cloud Run service endpoint 5 times
for test in 1..5
do
  curl \
  --silent \
  --location \
  --output /dev/null \
  --write-out "%response_code\n" \
  $ENDPOINT
  # Files are only differentiated at minute accuracy
  sleep 60s
done

# Enumerate the GCS Bucket
gsutil ls gs://$BUCKET

【讨论】:

是的,我将MNT_DIR设置为/database。当我尝试访问/database 中的文件或文件夹时,会出现[Errno 5] 知道了!谢谢。当您写“访问”时,您的意思是“当您浏览 Cloud Run 服务端点时”?您确定将 Cloud Run 服务作为服务帐户运行吗?您可以gcloud iam service-accounts list --project=$PROJECT 并且您可以确认服务帐户正在应用(从内存中)gcloud run services describe $NAME --region=$REGION --platform=managed --project=$PROJECT --format="value(spec.template.spec.ServiceAccountName)" 我猜,另一个问题|建议是,如果你不覆盖MNT_DIR的默认值会发生什么? 当我运行gcloud iam service-accounts list --project=$PROJECT 时,它会列出我打算使用的帐户(以及其他帐户)。当我运行`gcloud run services describe $NAME --region=$REGION --platform=managed --project=$PROJECT --format="value(spec.template.spec.ServiceAccountName)",它返回一个空的新行 今天早上我会尝试重现您的问题。我有一些其他的事情要做第一件事,但我会在这个(我的)早上完成它。【参考方案2】:

改为在/mnt/gcs目录下挂载fuse即可解决。

【讨论】:

我刚刚使用/database 重新运行了脚本,它对我有用。我一直无法让它工作。我会在我的回答中发布我的脚本,也许你会看到你的问题出现在哪里。

以上是关于Google Cloud FUSE 与 Cloud Run [Errno 5] 输入/输出错误:'/database' 但已授予存储对象管理员访问权限的主要内容,如果未能解决你的问题,请参考以下文章

Google Cloud Compute Engine 是不是与 Google Cloud SQL 分开

在 Google Cloud Datastore 与 Google Cloud Bigtable 中存储用户事件历史记录

Google Cloud Platform:Cloud Functions 与 App Engine

具有 Google Cloud Functions 的 Google Cloud Endpoints [关闭]

Google Cloud Endpoints 与 Cloud Datastore api 服务之间的比较

将 google-cloud 与 webpack 集成时遇到问题