Google Cloud Datastore 模拟器不使用默认凭据
Google Cloud Datastore Emulator does not use default credentials
根据 Google's Cloud Datastore Emulator installation instructions,我能够在 bash 终端 window 中安装和 运行 模拟器,没有问题gcloud beta emulators datastore start --project gramm-id
.
我还在另一个终端 $(gcloud beta emulators datastore env-init)
中设置了环境变量 per the instructions 并验证了它们是否已定义。
但是,当我 运行 我的 python 脚本使用以下代码将实体添加到本地数据存储时:
from google.cloud import datastore
print(os.environ['DATASTORE_HOST']) # output: http://localhost:8081
print(os.environ['DATASTORE_EMULATOR_HOST']) # output: localhost:8081
client = datastore.Client('gramm-id')
kind = 'Task'
name = 'simpleTask'
task_key = client.key(kind, name)
task = client.Enity(key=task_key)
task['description'] = 'Buy milk'
client.put(task)
我收到错误:
Traceback (most recent call last):
File "tools.py", line 237, in <module>
client = datastore.Client('gramm-id')
File "/home/.../lib/python3.6/site-packages/google/cloud/datastore/client.py", line 205, in __init__
project=project, credentials=credentials, _http=_http)
... long stack trace ....
File "/home/.../lib/python3.6/site-packages/google/auth/_default.py", line 306, in default
raise exceptions.DefaultCredentialsError(_HELP_MESSAGE)
google.auth.exceptions.DefaultCredentialsError: Could not automatically determine credentials. Please set GOOGLE_APPLICATION_CREDENTIALS or explicitly create credentials and re-run the application. For more information, please see https://developers.google.com/accounts/docs/application-default-credentials.
我认为我不需要 create a GCP service account and provide access credentials 在我的机器上使用数据存储模拟器。
我的系统:
- Ubuntu 18.04
- 蟒蛇python3.6.6
- Google 云 SDK 215.0.0
- 云数据存储模拟器 2.0.2.
我错过了什么?
gcloud auth application-default login
这将提示您通过浏览器登录 window 并会为您正确设置 GOOGLE_APPLICATION_CREDENTIALS。 [1]
理论上您应该能够使用模拟凭证,例如:
class EmulatorCreds(google.auth.credentials.Credentials):
def __init__(self):
self.token = b'secret'
self.expiry = None
@property
def valid(self):
return True
def refresh(self, _):
raise RuntimeError('Should never be refreshed.')
client = datastore.Client(
project='gramm-id',
credentials=EmulatorCreds() ,
_http=requests.Session() # Un-authorized
)
但是 it seems like this doesn't currently work,所以现在您需要设置 GOOGLE_APPLICATION_CREDENTIALS
根据 Google's Cloud Datastore Emulator installation instructions,我能够在 bash 终端 window 中安装和 运行 模拟器,没有问题gcloud beta emulators datastore start --project gramm-id
.
我还在另一个终端 $(gcloud beta emulators datastore env-init)
中设置了环境变量 per the instructions 并验证了它们是否已定义。
但是,当我 运行 我的 python 脚本使用以下代码将实体添加到本地数据存储时:
from google.cloud import datastore
print(os.environ['DATASTORE_HOST']) # output: http://localhost:8081
print(os.environ['DATASTORE_EMULATOR_HOST']) # output: localhost:8081
client = datastore.Client('gramm-id')
kind = 'Task'
name = 'simpleTask'
task_key = client.key(kind, name)
task = client.Enity(key=task_key)
task['description'] = 'Buy milk'
client.put(task)
我收到错误:
Traceback (most recent call last):
File "tools.py", line 237, in <module>
client = datastore.Client('gramm-id')
File "/home/.../lib/python3.6/site-packages/google/cloud/datastore/client.py", line 205, in __init__
project=project, credentials=credentials, _http=_http)
... long stack trace ....
File "/home/.../lib/python3.6/site-packages/google/auth/_default.py", line 306, in default
raise exceptions.DefaultCredentialsError(_HELP_MESSAGE)
google.auth.exceptions.DefaultCredentialsError: Could not automatically determine credentials. Please set GOOGLE_APPLICATION_CREDENTIALS or explicitly create credentials and re-run the application. For more information, please see https://developers.google.com/accounts/docs/application-default-credentials.
我认为我不需要 create a GCP service account and provide access credentials 在我的机器上使用数据存储模拟器。
我的系统:
- Ubuntu 18.04
- 蟒蛇python3.6.6
- Google 云 SDK 215.0.0
- 云数据存储模拟器 2.0.2.
我错过了什么?
gcloud auth application-default login
这将提示您通过浏览器登录 window 并会为您正确设置 GOOGLE_APPLICATION_CREDENTIALS。 [1]
理论上您应该能够使用模拟凭证,例如:
class EmulatorCreds(google.auth.credentials.Credentials):
def __init__(self):
self.token = b'secret'
self.expiry = None
@property
def valid(self):
return True
def refresh(self, _):
raise RuntimeError('Should never be refreshed.')
client = datastore.Client(
project='gramm-id',
credentials=EmulatorCreds() ,
_http=requests.Session() # Un-authorized
)
但是 it seems like this doesn't currently work,所以现在您需要设置 GOOGLE_APPLICATION_CREDENTIALS