【问题标题】:google-cloud-storage permission denied in google-app-engine standardgoogle-app-engine 标准中的 google-cloud-storage 权限被拒绝
【发布时间】:2018-01-15 09:23:13
【问题描述】:

尝试使用 client library for Python 从谷歌应用引擎标准运行烧瓶内部访问谷歌云存储桶。

(edit) 不受官方支持。查看解决方法的答案。

代码看起来像这样..

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})

错误信息:

('Connection aborted.', error(13, 'Permission denied'))

【问题讨论】:

  • App 引擎应用程序作为特定服务帐户运行。您的应用引擎应用的服务帐户是否有权使用存储桶“my-bucket”执行操作?
  • 是的,服务帐号有权限。我认为发生的事情是我需要确保 Requests 使用 URLFetch cloud.google.com/appengine/docs/standard/python/issue-requests

标签: python google-app-engine flask google-cloud-storage


【解决方案1】:

回答

(编辑)GAE 标准不正式支持 google.cloud.storage,要使身份验证工作 (google-auth) 需要做一些额外的步骤:

更新 requirements.txt

请求工具带

假设您在 3rd 方库中使用名为“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 工作的正确答案。当您需要从 devserver 访问在线存储桶时需要它。
【解决方案2】:

不要使用 google.cloud.storage 模块,而是使用专为在 GAE 标准中运行而设计的 GCS 客户端: https://cloud.google.com/appengine/docs/standard/python/googlecloudstorageclient/setting-up-cloud-storage#downloading_the_client_library。 此客户端将隐式执行身份验证,避免出现“权限被拒绝”错误。

以下页面演示了如何使用客户端编写:https://cloud.google.com/appengine/docs/standard/python/googlecloudstorageclient/read-write-to-cloud-storage#writing_to_cloud_storage。唯一缺少的信息是示例中的“文件名”格式为“//”。写入操作负责定位和写入正确的存储桶(您不需要事先检索存储桶)。

【讨论】:

  • 有时需要从开发服务器访问在线存储桶(只读操作是安全的)。您不能使用标准开发服务器执行此操作。上面的答案是一个很好的解决方法。
猜你喜欢
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
  • 2019-10-25
  • 2016-06-02
  • 2020-08-05
  • 2014-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多