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 [关闭]