我在这里遵循文档https://cloud.google.com/appengine/docs/managing-costs在达到支出限制时禁用使用云功能的应用程序引擎。
我想禁用与同一计费帐户相关的所有项目的应用程序引擎,文档说这应该在以下注释中工作
注意:源代码假设您正在创建的函数和要禁用的应用程序在同一个谷歌云项目中。如果函数和应用程序位于不同的项目中,请更改源代码,以便app_NAME标识包含要禁用的应用程序的项目。
但我得到这个错误
错误:函数已终止。建议操作:检查日志终止原因。详细信息:<请求时出现HttpError 403https://appengine.googleapis.com/v1/apps/other-project?alt=json返回";呼叫者没有权限">
根据文档,我还验证了我使用的是具有管理员角色的应用程序引擎默认服务帐户
选择具有应用程序引擎管理员角色的服务帐户。应用程序引擎默认服务帐户默认具有此角色。
我修改了测试的例子,基本上就是这个
import base64
import json
import os
from googleapiclient import discovery
APP_NAME = os.getenv('GCP_PROJECT')
def limit_use_appengine(data, context):
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']
if cost_amount <= budget_amount:
print(f'No action necessary. (Current cost: {cost_amount})')
appengine = discovery.build(
'appengine',
'v1',
cache_discovery=False
)
apps = appengine.apps()
# for testing
display_status(apps, APP_NAME) # works fine
display_status(apps, "billing-account-project-name") # also works fine
display_status(apps, "other-project") # permission error
return
appengine = discovery.build(
'appengine',
'v1',
cache_discovery=False
)
apps = appengine.apps()
check_app(apps, "APP_NAME")
check_app(apps, "other-project")
def check_app(apps, appName):
# Get the target app's serving status
target_app = apps.get(appsId=appName).execute()
current_status = target_app['servingStatus']
# Disable target app, if necessary
if current_status == 'SERVING':
print(f'Attempting to disable app {appName}...')
body = {'servingStatus': 'USER_DISABLED'}
apps.patch(appsId=appName, updateMask='serving_status', body=body).execute()
def display_status(apps, appName):
target_app = apps.get(appsId=appName).execute()
current_status = target_app['servingStatus']
print(f'Serving status for {appName} is {current_status}')
我错过了什么?
服务帐户要么继承权限,要么被分配项目权限。计费帐户不会影响服务帐户的权限。
解决方案:在项目中为您获得权限错误的服务帐户分配权限。如果您使用的是"组织",请将权限分配到更高的级别,以便服务帐户继承对项目的权限。