【问题标题】:how to get locationId in Google App Engine not using terminal如何在不使用终端的 Google App Engine 中获取 locationId
【发布时间】:2020-08-07 10:50:59
【问题描述】:

要在 Python 中使用 scheduler_v1.CloudSchedulerClient().location_path(),我需要具有 projectId 和 LocationId 的父级。我知道如何从终端获取代码中的 projectId 和 locationId,但是如何在我的代码中获取呢?

我已尝试查看此网站(https://cloud.google.com/functions/docs/reference/rpc/google.cloud.location),但没有示例,不知道如何处理它

from google.cloud import scheduler_v1


from google.oauth2 import service_account

credentials = service_account.Credentials.from_service_account_file('/home/myname/folder/service_account.json')
service = googleapiclient.discovery.build('cloudresourcemanager', 'v1', credentials = credentials)
request = service.projects().list()
response = request.execute()
client = scheduler_v1.CloudSchedulerClient()

for project in response['projects']:
    parent = client.location_path(project['projectId'], ['LocationID'])
    for element in client.list_jobs(parent):
        print(element)

谢谢!

【问题讨论】:

    标签: python google-app-engine location


    【解决方案1】:

    获取项目ID不需要使用cloudresourcemanager,可以使用App Engine环境变量GOOGLE_CLOUD_PROJECT

    您可以使用App engine admin API获取位置ID,请检查此代码sn-p。

        credentials = GoogleCredentials.get_application_default()
        #start discovery service and use appengine admin API
        service = discovery.build('appengine', 'v1', credentials=credentials, cache_discovery=False)
    
        #disable cache for app engine std (avoid noise in logs)
        logging.getLogger('googleapiclient.discovery_cache').setLevel(logging.ERROR)
    
        #take the project ID form the environment variables
        project = os.environ['GOOGLE_CLOUD_PROJECT']
    
        #get App engine application details
        req = service.apps().get(appsId=project)
    
        response =req.execute()
    
        #this is the application location id
        location_id = (response["locationId"])
    

    【讨论】:

      【解决方案2】:

      我最近开始使用http://metadata.google.internal/computeMetadata/v1/instance/region 端点。虽然它可以在 App Engine 中使用,但现在没有明确记录(但它已记录在 Cloud Run 中:https://cloud.google.com/run/docs/reference/container-contract)。

      来自该端点的结果将如下所示:

      projects/12345678901234/regions/us-central1
      

      显然,区域是最后一部分 (us-central1)。

      这是我在 Go 中的一个示例(记得将 Metadata-Flavor 标头设置为 Google):

      var region string
      {
          domain := "http://metadata.google.internal"
          path := "computeMetadata/v1/instance/region"
      
          request, err := http.NewRequest(http.MethodGet, domain+"/"+path, nil)
          if err != nil {
              logrus.Errorf("Could not create request: %v", err)
              panic(err)
          }
          request.Header.Set("Metadata-Flavor", "Google")
          response, err := http.DefaultClient.Do(request)
          if err != nil {
              logrus.Errorf("Could not perform request: %v", err)
              panic(err)
          }
          contents, err := ioutil.ReadAll(response.Body)
          if err != nil {
              logrus.Errorf("Could not read contents: %v", err)
              panic(err)
          }
          originalRegion := string(contents)
          logrus.Infof("Contents of %q: %s", path, originalRegion)
          parts := strings.Split(originalRegion, "/")
          if len(parts) > 0 {
              region = parts[len(parts)-1]
          }
      }
      logrus.Infof("Region: %s", region)
      

      【讨论】:

        【解决方案3】:

        在 Google App Engine 中,有一些环境变量是由运行时环境设置的。 可以通过 os.environ.get(environment_name) 获取。

        https://cloud.google.com/appengine/docs/standard/python3/runtime#environment_variables

        【讨论】:

        • 链接打不开(我有一个环境变量,但是它改变了什么?
        • cloud.google.com/appengine/docs/standard/python3/runtime 环境变量 GAE_APPLICATION 有区域名称,您可以在其中导出位置代码。或者您可以显式指定环境变量 LOCATION_CODE 并使用它。
        • GAE_APPLICATION 基本上是${region-code}~${project}。不幸的是,区域代码没有映射到位置 ID,至少不是以我见过的记录方式。我的us-central1 实例的区域代码为s
        猜你喜欢
        • 1970-01-01
        • 2023-04-06
        • 1970-01-01
        • 2011-10-14
        • 2015-12-09
        • 2012-03-21
        • 2010-11-20
        • 2017-12-04
        • 1970-01-01
        相关资源
        最近更新 更多