Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google cloud platform 从云函数授权云SQL管理API调用_Google Cloud Platform_Google Cloud Functions_Google Cloud Storage_Google Cloud Sql - Fatal编程技术网

Google cloud platform 从云函数授权云SQL管理API调用

Google cloud platform 从云函数授权云SQL管理API调用,google-cloud-platform,google-cloud-functions,google-cloud-storage,google-cloud-sql,Google Cloud Platform,Google Cloud Functions,Google Cloud Storage,Google Cloud Sql,我正在尝试构建一个小函数(后来部署到云函数)来将BAK文件恢复到云sql。此函数将由cron触发。 在阅读关于授权此API的文档时,我有点不知所措: 已创建服务帐户,其中包括以下角色:云SQL管理员、存储管理员、存储对象管理员、存储对象查看器,并在创建云功能但不工作时从下拉列表中选择该服务帐户 阅读以下内容后,还尝试生成API密钥: 所以我的帖子url变成了: https://www.googleapis.com/sql/v1beta4/projects/project-id/instances

我正在尝试构建一个小函数(后来部署到云函数)来将BAK文件恢复到云sql。此函数将由cron触发。 在阅读关于授权此API的文档时,我有点不知所措:

已创建服务帐户,其中包括以下角色:云SQL管理员、存储管理员、存储对象管理员、存储对象查看器,并在创建云功能但不工作时从下拉列表中选择该服务帐户

阅读以下内容后,还尝试生成API密钥:

所以我的帖子url变成了:

https://www.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/import?key=generatedAPIKey

但仍然有一个错误:

  "error": {
    "code": 401,
    "message": "Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
    "errors": [
      {
        "message": "Login Required.",
        "domain": "global",
        "reason": "required",
        "location": "Authorization",
        "locationType": "header"
      }
    ],
    "status": "UNAUTHENTICATED"
  }
}
我需要为此使用Oauth 2吗?这是我在云函数中的代码:

import http.client
import mimetypes

def restore_bak(request):
    conn = http.client.HTTPSConnection("www.googleapis.com")
    payload = "{\r\n \"importContext\":\r\n   {\r\n      \"fileType\": \"BAK\",\r\n      \"uri\": \"gs://{bucket_name}/{backup_name}.bak\",\r\n      \"database\": \"{database_name}\"\r\n    }\r\n}\r\n"
    headers = {
      'Content-Type': 'application/json'
    }
    conn.request("POST", "/sql/v1beta4/projects/{project_id}/instances/{instance_name}/import", payload, headers)
    res = conn.getresponse()
    data = res.read()
    print(data.decode("utf-8"))
    return(data.decode("utf-8"))

这看起来像python,因此我建议使用。此库为SQL Admin API提供了一个方便的包装器:

#构造与云SQL管理API交互的服务对象。
service=discovery.build('sqladmin','v1beta4',http=http)
req=service.instances().list(project=“project\u ID”)
resp=req.execute()
打印json.dumps(resp,indent=2)
默认情况下,此库使用“”策略从环境中获取凭据

您还可以通过创建oauth2令牌并将其设置为请求中的头来手动验证您的请求(例如,如果您想使用asyncio)。最简单的方法是使用google auth包获取ADC并将其设置为标头:

导入google.auth
导入google.auth.transport.requests
凭据,project_id=google.auth.default()
credentials.refresh(google.auth.transport.requests.Request())
标题={
“授权”:“持有者{}”.format(credentials.token),
“内容类型”:“应用程序/json”
}

这看起来像python,因此我建议使用。此库为SQL Admin API提供了一个方便的包装器:

#构造与云SQL管理API交互的服务对象。
service=discovery.build('sqladmin','v1beta4',http=http)
req=service.instances().list(project=“project\u ID”)
resp=req.execute()
打印json.dumps(resp,indent=2)
默认情况下,此库使用“”策略从环境中获取凭据

您还可以通过创建oauth2令牌并将其设置为请求中的头来手动验证您的请求(例如,如果您想使用asyncio)。最简单的方法是使用google auth包获取ADC并将其设置为标头:

导入google.auth
导入google.auth.transport.requests
凭据,project_id=google.auth.default()
credentials.refresh(google.auth.transport.requests.Request())
标题={
“授权”:“持有者{}”.format(credentials.token),
“内容类型”:“应用程序/json”
}

我尝试使用google auth软件包手动验证我的请求,并在requirements.txt上列出了google auth==1.20.1,但仍然没有成功,并得到了相同的错误。有什么我遗漏了吗?如果您设置了“Authorization”标题,您应该会得到不同的错误(或成功)。我会检查您是否正确设置了标题,或者使用Python discovery客户端来为您处理所有这些。对不起,如果要求太多,我是一个比较新的人,我是否需要在google.auth.default()之前更改project/project_id?下面是我如何设置从您那里复制的标题:
credentials,project=google.auth.default()headers={'Authorization':'Bearer{}.format(credentials.token),'Content Type':'application/json'}print(headers)
当我在安装了gcloud sdk的本地系统上运行时,它将返回无承载,也许这就是我仍然未经身份验证的原因:
{'Authorization':'Bearer None','Content Type':'application/json'}
部署到云时的输出相同function@Chairul,在应用程序引擎和云功能等无服务服务中,无法访问或安装Gcloud SDK,在云函数上使用SQL admin API的最佳方法是使用此方法,它将使用与您关联的服务帐户function@Chairul-我已更新示例,以包含刷新令牌所需的缺失步骤。您可以在这里找到关于库如何工作的更多说明:我尝试使用GoogleAuth包手动验证我的请求,并在requirements.txt上列出了GoogleAuth==1.20.1,但仍然没有成功,并得到了相同的错误。有什么我遗漏了吗?如果您设置了“Authorization”标题,您应该会得到不同的错误(或成功)。我会检查您是否正确设置了标题,或者使用Python discovery客户端来为您处理所有这些。对不起,如果要求太多,我是一个比较新的人,我是否需要在google.auth.default()之前更改project/project_id?下面是我如何设置从您那里复制的标题:
credentials,project=google.auth.default()headers={'Authorization':'Bearer{}.format(credentials.token),'Content Type':'application/json'}print(headers)
当我在安装了gcloud sdk的本地系统上运行时,它将返回无承载,也许这就是我仍然未经身份验证的原因:
{'Authorization':'Bearer None','Content Type':'application/json'}
部署到云时的输出相同function@Chairul,在应用程序引擎和云功能等无服务服务中,无法访问或安装Gcloud SDK,在云函数上使用SQL admin API的最佳方法是使用此方法,它将使用与您关联的服务帐户function@Chairul-我已更新示例,以包含刷新令牌所需的缺失步骤。您可以在此处找到有关库如何工作的更多说明: