我在我的项目中设置了一个 Google Cloud BigTable 集群。该项目的主要代码库在标准 Python App Engine 环境中运行,由于依赖 grpcio,因此无法使用 gcloud-python 库。为了解决这个问题,我在同一个项目中设置了一个 Python App Engine 灵活环境服务,并编写了一个非常简单的 Flask 服务器来运行它,然后我可以从我的标准环境中访问它。代码看起来像这样:
from gcloud import bigtable
app = Flask(__name__)
client = bigtable.Client(project=bigtable_config.PROJECT_ID, read_only=True)
cluster = client.cluster(bigtable_config.ZONE_ID, bigtable_config.CLUSTER_ID)
table = cluster.table(bigtable_config.TABLE_ID)
@app.route("/query/<start_key>/<end_key>")
def run_query(start_key, end_key):
if not client.is_started():
client.start()
row_data = table.read_rows(start_key=start_key, end_key=end_key)
row_data.consume_all()
// do some stuff to the row data here, get results
return jsonify(results)
我可以在本地运行此代码,并且效果很好。我可以将它部署到我的服务中,并且它继续运行良好。但是,如果服务闲置了一段时间(我通常会在大约一个小时后注意到它),那么我发出的每个请求都会开始失败并出现以下错误:
NetworkError(code=StatusCode.UNAUTHENTICATED, details="Request had invalid authentication credentials.")
如果我重新部署该服务,它会再次开始工作。当我在本地运行服务时,我没有观察到这种行为。
我究竟做错了什么?我假设我在客户端设置中犯了一些错误,它没有正确使用应用程序引擎凭据。遇到此错误时是否需要终止客户端并重新启动它?