Python 使用谷歌云功能禁用谷歌云上的计费(Keyerror:';data';)

Python 使用谷歌云功能禁用谷歌云上的计费(Keyerror:';data';),python,google-cloud-platform,google-cloud-functions,google-cloud-billing,Python,Google Cloud Platform,Google Cloud Functions,Google Cloud Billing,我正试图编写一个谷歌云函数来设置上限,以禁用超过一定限制的使用。我按照这里的说明进行操作: 这就是我的云功能的样子(我只是从上面链接的Google cloud docs页面复制和粘贴): 知道为什么吗 相关堆栈溢出帖子:谷歌提供的代码中似乎有错误。当我更改停止计费功能时,它开始工作: def stop_billing(data, context): if 'data' in data.keys(): pubsub_data = base64.b64decode(data[

我正试图编写一个谷歌云函数来设置上限,以禁用超过一定限制的使用。我按照这里的说明进行操作:

这就是我的云功能的样子(我只是从上面链接的Google cloud docs页面复制和粘贴):

知道为什么吗


相关堆栈溢出帖子:

谷歌提供的代码中似乎有错误。当我更改
停止计费
功能时,它开始工作:

def stop_billing(data, context):
    if 'data' in data.keys():
        pubsub_data = base64.b64decode(data['data']).decode('utf-8')
        pubsub_json = json.loads(pubsub_data)
        cost_amount = pubsub_json['costAmount']
        budget_amount = pubsub_json['budgetAmount']
    else:
        cost_amount = data['costAmount']
        budget_amount = data['budgetAmount']
    if cost_amount <= budget_amount:
        print(f'No action necessary. (Current cost: {cost_amount})')
        return    
    if PROJECT_ID is None:
        print('No project specified with environment variable')
        return
    billing = discovery.build('cloudbilling', 'v1', cache_discovery=False, )
    projects = billing.projects()
    billing_enabled = __is_billing_enabled(PROJECT_NAME, projects)
    if billing_enabled:
        __disable_billing_for_project(PROJECT_NAME, projects)
    else:
        print('Billing already disabled')
def停止计费(数据、上下文):
如果data.keys()中有“data”:
pubsub_data=base64.b64解码(data['data']).decode('utf-8')
pubsub_json=json.load(pubsub_数据)
成本金额=pubsub\u json['costAmount']
预算金额=pubsub\u json['budgetAmount']
其他:
成本金额=数据['costAmount']
预算金额=数据['budgetAmount']

如果是成本金额,请尝试打印“数据”好吗?您的问题在于调用
停止计费的代码。您试图访问的键
数据
不在第9行的字典
数据
中。由于您的问题中没有该代码,因此很难找到答案。注意:不要将代码显示为图片。编辑您的问题,并将代码作为格式化的代码块包含在内。看起来您的函数是由发布/订阅调用的。第一个参数是
事件
。这通常具有键
数据
。我会将字典记录到Stackdriver,以调试您实际收到的内容。另外,如果“数据”中的“数据”:
,我会添加类似这样的代码以防止崩溃。将
数据
重命名回
事件
,使变量名有意义。@JohnHanley--谢谢,我会尝试一下。编辑原始帖子以显示实际代码;然而,我只是从Google Cloud文档中复制和粘贴:(我没有做任何更改)我尝试设置了这个,但没有任何问题,您是否按照文档中提到的那样将需求添加到函数的requirements.txt文件中?
Expand all | Collapse all{
 insertId: "000000-69dce50a-e079-45ed-b949-a241c97fdfe4"  
 labels: {…}  
 logName: "projects/stanford-cs-231n/logs/cloudfunctions.googleapis.com%2Fcloud-functions"  
 receiveTimestamp: "2020-02-06T16:24:26.800908134Z"  
 resource: {…}  
 severity: "ERROR"  
 textPayload: "Traceback (most recent call last):
  File "/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py", line 383, in run_background_function
    _function_handler.invoke_user_function(event_object)
  File "/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py", line 217, in invoke_user_function
    return call_user_function(request_or_event)
  File "/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py", line 214, in call_user_function
    event_context.Context(**request_or_event.context))
  File "/user_code/main.py", line 9, in stop_billing
    pubsub_data = base64.b64decode(data['data']).decode('utf-8')
KeyError: 'data'
"  
 timestamp: "2020-02-06T16:24:25.411Z"  
 trace: "projects/stanford-cs-231n/traces/8e106d5ab629141d5d91b6b68fb30c82"  
}
def stop_billing(data, context):
    if 'data' in data.keys():
        pubsub_data = base64.b64decode(data['data']).decode('utf-8')
        pubsub_json = json.loads(pubsub_data)
        cost_amount = pubsub_json['costAmount']
        budget_amount = pubsub_json['budgetAmount']
    else:
        cost_amount = data['costAmount']
        budget_amount = data['budgetAmount']
    if cost_amount <= budget_amount:
        print(f'No action necessary. (Current cost: {cost_amount})')
        return    
    if PROJECT_ID is None:
        print('No project specified with environment variable')
        return
    billing = discovery.build('cloudbilling', 'v1', cache_discovery=False, )
    projects = billing.projects()
    billing_enabled = __is_billing_enabled(PROJECT_NAME, projects)
    if billing_enabled:
        __disable_billing_for_project(PROJECT_NAME, projects)
    else:
        print('Billing already disabled')