【发布时间】:2021-04-20 19:59:36
【问题描述】:
我一直在阅读文档,但无法找到有关如何启用或禁用实际应用的任何说明。
我尝试运行一个需要 5 分钟到 1 小时来处理的 python 程序。在处理开始之前自动启用应用程序并在完成后禁用它。
感谢任何提示。
【问题讨论】:
标签: python python-3.x google-app-engine google-cloud-platform automation
我一直在阅读文档,但无法找到有关如何启用或禁用实际应用的任何说明。
我尝试运行一个需要 5 分钟到 1 小时来处理的 python 程序。在处理开始之前自动启用应用程序并在完成后禁用它。
感谢任何提示。
【问题讨论】:
标签: python python-3.x google-app-engine google-cloud-platform automation
从 Cloud Console 启用/禁用 App Engine 应用程序非常简单。
只需参考these steps as per the public documentation。请注意,该过程只需单击 Cloud Console 中“应用程序设置”页面上的按钮即可。一旦应用程序被禁用,如果您想返回启用应用程序,只需返回同一页面并单击同一按钮(应显示启用应用程序,而不是禁用应用程序)。
以编程方式完成这项任务肯定有点棘手。尽管如此,它可以通过App Engine Admin API 及其客户端库来实现,更具体地说,可以利用apps.patch method。
在文档中有完整的example for disabling an application 使用带有 Python 运行时的云函数。它基于预算警报,但您可以根据您的具体需求对其进行修改,并确定您想要触发云功能的条件。
我会创建两个不同的云函数。一个用于启用应用程序,另一个用于禁用应用程序。代码中最相关的部分将是这个(但请查看example described 了解详细信息):
一个。禁用该功能
import os
from googleapiclient import discovery
APP_NAME = os.getenv('GCP_PROJECT')
def limit_use_appengine():
if [CHANGE CONDITION AS PER YOUR NEEDS]:
print(f'No action necessary.')
return
appengine = discovery.build(
'appengine',
'v1',
cache_discovery=False
)
apps = appengine.apps()
# Get the target app's serving status
target_app = apps.get(appsId=APP_NAME).execute()
current_status = target_app['servingStatus']
# Disable target app, if necessary
if current_status == 'SERVING':
print(f'Attempting to disable app {APP_NAME}...')
body = {'servingStatus': 'USER_DISABLED'}
apps.patch(appsId=APP_NAME, updateMask='serving_status', body=body).execute()
b.启用应用程序
import os
from googleapiclient import discovery
APP_NAME = os.getenv('GCP_PROJECT')
def enable_use_appengine():
if [CHANGE CONDITION AS PER YOUR NEEDS]:
print(f'No action necessary.')
return
appengine = discovery.build(
'appengine',
'v1',
cache_discovery=False
)
apps = appengine.apps()
# Get the target app's serving status
target_app = apps.get(appsId=APP_NAME).execute()
current_status = target_app['servingStatus']
# Disable target app, if necessary
if current_status == 'USER_DISABLED':
print(f'Attempting to enable app {APP_NAME}...')
body = {'servingStatus': 'SERVING'}
apps.patch(appsId=APP_NAME, updateMask='serving_status', body=body).execute()
我还没有测试过代码本身。但我相信它们会起作用。对您来说非常重要的是,禁用 App Engine 应用程序将停止与应用程序服务请求相关的费用,但是如果您使用 Datastore 或 Cloud Storage 或任何其他产品来存储您的应用程序生成的某些数据,这些费用仍然会产生.
【讨论】:
从 python 3.8 开始,由于删除了 GCP_PROJECT 环境变量,此代码不再有效,而且 Google 的代码也不允许测试我添加的云功能
import base64
import json
import os
from googleapiclient import discovery
import google.auth
_, project_id = google.auth.default()
APP_NAME = project_id
def limit_use_appengine(data, context):
if 'data' in data.keys():
pubsub_data = base64.b64decode(data['data']).decode('utf-8')
pubsub_json = json.loads(pubsub_data)
else:
pubsub_json = data
cost_amount = pubsub_json['costAmount']
budget_amount = pubsub_json['budgetAmount']
if cost_amount <= budget_amount:
print(f'No action necessary. (Current cost: {cost_amount})')
return
appengine = discovery.build(
'appengine',
'v1',
cache_discovery=False
)
apps = appengine.apps()
# Get the target app's serving status
target_app = apps.get(appsId=APP_NAME).execute()
current_status = target_app['servingStatus']
# Disable target app, if necessary
if current_status == 'SERVING':
print(f'Attempting to disable app {APP_NAME}...')
body = {'servingStatus': 'USER_DISABLED'}
apps.patch(appsId=APP_NAME, updateMask='serving_status', body=body).execute()
【讨论】: