![](/img/trans.png)
[英]Improving cold start up times on Google App Engine running Django on Python 3.7 Standard environment
[英]How to signed url for Google cloud storage on Google App Engine Standard environment with Python3.7?
我找不到使用 Python3.7 在 Google App Engine 标准环境中使用签名网址的方法。
我在这里查看文档: https : //cloud.google.com/storage/docs/access-control/signing-urls-manually
在 Google App Engine 应用程序中,您可以使用App Engine App Identity服务来签署您的字符串。
但是 App Engine App Identity 依赖于google.appengine
包,这在 python 3.7 env 上不可用,如解释here
专有 App Engine API 在 Python 3 中不可用。本节列出了推荐的替代品。
总体目标是您的应用程序应该是完全可移植的,并且可以在任何标准 Python 环境中运行。 您编写的是标准 Python 应用程序,而不是 App Engine Python 应用程序。 作为这一转变的一部分,您不再需要为应用的核心功能使用专有的 App Engine API 和服务。 目前,App Engine API 在 Python 3.7 运行时中不可用。
sdk 上的所有 api 都依赖于google.appengine
并在 python 3.7 env 上引发异常: EnvironmentError('The App Engine APIs are not available.')
在此处引发依赖专有 api 的异常:
try:
from google.appengine.api import app_identity
except ImportError:
app_identity = None
我知道我可以使用许多解决方案,例如ServiceAccountCredentials.from_json_keyfile_dict(service_account_dict)
但我必须直接在应用引擎上上传带有凭据的文件,我不能这样做,因为项目凭据将在 git 或 ci 上公开。
我真的很想依赖来自应用引擎的默认凭据,比如其他 Google Cloud api,比如storage.Client()
,例如开箱即用。
有什么建议吗?
对于Python与Google Cloud的交互,请使用App Engine标准Python 3运行时支持的Python客户端 。
要使用App Engine Standard中的google-cloud-storage访问云存储:
storage.Client()
身份验证。 根据您需要实现的目标,我还建议您尝试不同的方法:
也可以使用appengine api对blob进行签名 :
google.appengine.api.app_identity.sign_blob()
这个问题可能很老,但它是第一个在 Google 搜索中显示的问题,所以我认为它可能会帮助将来寻找的人也在这里发布这个问题。
此处发布的答案@guillaume-blaquiere确实有效,但它需要一个未提及的额外步骤,即将 IAM 中的Service Account Token Creator
角色添加到您的默认服务帐户,这将允许所述默认服务帐户“模拟服务帐户” (创建 OAuth2 访问令牌、签署 blob 或 JWT 等)。”
这允许默认服务帐户根据signBlob 文档对 blob 进行签名。
我在 AppEngine 上尝试过,一旦获得许可,它就可以完美运行。
import datetime as dt
from google import auth
from google.cloud import storage
# SCOPES = [
# "https://www.googleapis.com/auth/devstorage.read_only",
# "https://www.googleapis.com/auth/iam"
# ]
credentials, project = auth.default(
# scopes=SCOPES
)
credentials.refresh(auth.transport.requests.Request())
expiration_timedelta = dt.timedelta(days=1)
storage_client = storage.Client(credentials=credentials)
bucket = storage_client.get_bucket("bucket_name")
blob = bucket.get_blob("blob_name")
signed_url = blob.generate_signed_url(
expiration=expiration_timedelta,
service_account_email=credentials.service_account_email,
access_token=credentials.token,
)
我下载了 AppEngine默认服务帐户的密钥以进行本地测试,为了使其在 AppEngine 环境之外正常工作,我必须根据设置SCOPES
的注释行向凭据添加适当的范围。 如果仅在 AppEngine 本身中运行,您可以忽略它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.