谷歌云存储权限在谷歌应用程序引擎标准中被拒绝

问题描述:

试图从谷歌应用程序引擎标准运行瓶使用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 '权限被拒绝'))

+0

应用程序引擎应用程序作为特定服务帐户运行。您的应用引擎应用的服务帐号是否有权使用“my-bucket”存储区执行相关操作? –

+0

是的,服务帐户有权限。我认为发生了什么是我需要确保请求使用URLFetch https://cloud.google.com/appengine/docs/standard/python/issue-requests –

回答

(编辑)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

+0

它不是问题信息,它是答案 –

+0

(编辑答案,以清楚说明我不只是增加额外的问题信息) –

代替使用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。唯一缺少的信息是示例中的“文件名”格式为“//”。写操作负责定位和写入正确的存储区(您不需要事先检索存储区)。

+0

谢谢Sarit!.. –