谷歌云存储权限在谷歌应用程序引擎标准中被拒绝
试图从谷歌应用程序引擎标准运行瓶使用client library for Python访问谷歌云存储桶。谷歌云存储权限在谷歌应用程序引擎标准中被拒绝
(编辑)没有正式支持。请参阅解决方法的答案。
代码看起来是这样的..
from flask import Flask
from google.cloud import storage
# UNCOMMENT THIS FOR SOLUTION
#import requests_toolbelt.adapters.appengine
#requests_toolbelt.adapters.appengine.monkeypatch()
app = Flask(__name__)
@app.route('/endpoint', methods=['POST', 'PUT'])
def upload_to_storage():
try:
# file info
filename = secure_filename(file.filename)
mimetype = file.content_type
# connect to bucket
client = storage.Client(project='projectName')
bucket = client.get_bucket('bucketName')
# upload file to bucket
blob = storage.Blob(filename, bucket)
blob.upload_from_file(file, content_type=mimetype, num_retries=10)
return jsonify({'status':200})
except:
return jsonify({'status':500})
错误消息:
( '连接中断。',错误(13 '权限被拒绝'))
回答
(编辑)google.cloud.storage在GAE标准中没有正式支持,为了使验证正常工作(google-auth)需要做一些额外的步骤:
更新requirements.txt
请求,工具区
假设你使用一个名为“lib”目录下的第三方供应商来库
$ pip install -r requirements.txt -t lib
更新appengine_config.py from google.appengine.ext import vendor vendor.add('lib')
更新main.py(或等同物) import requests_toolbelt.adapters.appengine requests_toolbelt.adapters.appengine.monkeypatch()
更新的app.yaml libraries: - name: ssl version: latest
它不是问题信息,它是答案 –
(编辑答案,以清楚说明我不只是增加额外的问题信息) –
代替使用google.cloud.storage模块,请使用专为GAE标准操作而设计的GCS客户端: https://cloud.google.com/appengine/docs/standard/python/googlecloudstorageclient/setting-up-cloud-storage#downloading_the_client_library。 此客户端将隐式执行认证,避免出现“Permission denied”错误。
以下页面演示如何使用客户端编写:h ttps://cloud.google.com/appengine/docs/standard/python/googlecloudstorageclient/read-write-to-cloud-storage#writing_to_cloud_storage。唯一缺少的信息是示例中的“文件名”格式为“//”。写操作负责定位和写入正确的存储区(您不需要事先检索存储区)。
谢谢Sarit!.. –
应用程序引擎应用程序作为特定服务帐户运行。您的应用引擎应用的服务帐号是否有权使用“my-bucket”存储区执行相关操作? –
是的,服务帐户有权限。我认为发生了什么是我需要确保请求使用URLFetch https://cloud.google.com/appengine/docs/standard/python/issue-requests –