【问题标题】:Google Cloud App Engine: Is there an API or SDK call to disable/enable an app (python)Google Cloud App Engine:是否有 API 或 SDK 调用来禁用/启用应用程序(python)
【发布时间】:2021-04-20 19:59:36
【问题描述】:

我一直在阅读文档,但无法找到有关如何启用或禁用实际应用的任何说明。

我尝试运行一个需要 5 分钟到 1 小时来处理的 python 程序。在处理开始之前自动启用应用程序并在完成后禁用它。

感谢任何提示。

【问题讨论】:

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


    【解决方案1】:

    从 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 或任何其他产品来存储您的应用程序生成的某些数据,这些费用仍然会产生.

    【讨论】:

    • 感谢您的建议。我今天会试一试,看看效果如何。
    【解决方案2】:

    从 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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-06
      • 2018-10-20
      • 2021-06-17
      • 2012-01-07
      • 1970-01-01
      • 2019-12-06
      • 1970-01-01
      • 2019-01-17
      相关资源
      最近更新 更多