【问题标题】:GCP-The App Engine APIs are not available, with py 3GCP-App Engine API 不可用,py 3
【发布时间】:2019-09-21 11:47:23
【问题描述】:

我正在尝试使用具有域范围委派的服务帐户从 App Engine 使用 Admin SDK API,该服务帐户允许它模拟管理员。

我找到了几个指南,但没有一个能像我预期的那样工作。

以下代码已部署到 App Engine 标准中。

main.py

from flask import Flask
from google.auth import app_engine
import google.auth


try:
    import googleclouddebugger
    googleclouddebugger.enable()
except ImportError:
    pass

SCOPES = ['https://www.googleapis.com/auth/admin.directory.user']

app = Flask(__name__)

@app.route('/')
def hello():
    credentials, project = google.auth.default()

    appIdentity = app_engine.app_identity

    credentials = app_engine.Credentials(scopes=SCOPES)

    ret = "Expired:{}".format(credentials.expired)
    ret += "\nvalid:{}".format(credentials.valid)
    return 'Hello World!\n'+ret


if __name__ == '__main__':
    app.run(host='127.0.0.1', port=8080, debug=True)

app.yaml

runtime: python37

代码credentials = app_engine.Credentials(scopes=SCOPES) 将导致应用程序出现500 错误消息,因为app_engine.app_identity 始终为none

"Traceback (most recent call last):
  File "/env/lib/python3.7/site-packages/flask/app.py", line 2446, in wsgi_app
    response = self.full_dispatch_request()
  File "/env/lib/python3.7/site-packages/flask/app.py", line 1951, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/env/lib/python3.7/site-packages/flask/app.py", line 1820, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/env/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/env/lib/python3.7/site-packages/flask/app.py", line 1949, in full_dispatch_request
    rv = self.dispatch_request()
  File "/env/lib/python3.7/site-packages/flask/app.py", line 1935, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/srv/main.py", line 52, in hello
    credentials = app_engine.Credentials(scopes=SCOPES)
  File "/env/lib/python3.7/site-packages/google/auth/app_engine.py", line 107, in __init__
    'The App Engine APIs are not available.')
OSError: The App Engine APIs are not available." 

你可以看到错误报告The App Engine APIs are not available但是GCP项目中没有同名的API。

在我为项目启用的所有 API 之下,试图实现它的要求。当然,错误还是会出现。

这是一个测试环境,如果有人需要访问,请询问,我很乐意为您提供 GCP 项目的查看权限

感谢您的宝贵时间:)

【问题讨论】:

    标签: python-3.x google-app-engine google-cloud-platform google-admin-sdk


    【解决方案1】:

    您正在使用与应用引擎 API 不兼容的 python37 运行时(第 2 代标准环境)(只有 python27/第 1 代兼容)。来自Understanding differences between the Python 2 and Python 3 environments

    专有的 App Engine API 在 Python 3 中不可用。这 部分列出了推荐的替代品。

    from google.auth import app_engine 实际上是不可用的,因为它们是基于 App Identity API,其中一个专有的。

    对于 python37 运行时中的身份验证,请遵循 Granting your app access to Cloud services 部分。基本上与 App Identity API 不同,在其中您调用一次 Credentials() 然后使用应用程序身份访问服务,在 python37 中,您使用相应的服务 API Client() 调用(或等效)对您需要的每个服务进行身份验证:

    # If you don't specify credentials when constructing the client, the
    # client library will look for credentials in the environment.
    storage_client = storage.Client()
    

    如果您要使用的服务帐号不是应用的默认服务帐号,则需要指定:

    您可以通过执行以下任一操作来覆盖此默认流程:

    • 设置GOOGLE_APPLICATION_CREDENTIALS 环境变量。如果设置了此变量,云服务将使用指定的凭据 变量而不是默认服务帐户。

    • 在为云服务实例化 Client 对象时指定凭据。例如,如果您的应用正在调用云服务 不同的项目,你可能需要pass credentials manually

    【讨论】:

    • 非常感谢。如果在那之后我需要从 appengine 服务帐户开始使用域范围的委派,你有什么建议吗?我搜索了几次,但似乎唯一的方法是使用服务帐户 json 密钥作为 SA 进行身份验证,然后模拟另一个帐户。你知道从 che .Client() 方法开始的一些方法吗?
    • 很遗憾,我没有在该地区玩。但我偶然发现了this,它听起来可能相关。
    猜你喜欢
    • 1970-01-01
    • 2019-08-25
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 2020-10-23
    • 2021-01-06
    • 2021-01-22
    • 1970-01-01
    相关资源
    最近更新 更多