Python 3.x 获取用于云SQL API的Google云访问令牌,以便在云函数中导入CSV

Python 3.x 获取用于云SQL API的Google云访问令牌,以便在云函数中导入CSV,python-3.x,google-cloud-platform,google-cloud-functions,google-cloud-sql,Python 3.x,Google Cloud Platform,Google Cloud Functions,Google Cloud Sql,我正在寻找一个Python3示例,介绍如何获取访问令牌,以便从GCS将csv文件从Google云函数导入云SQL 它来自一个云函数,因此我们期望它运行的服务帐户或云SQL实例的服务帐户在获得访问权限的情况下具有访问权限,但事实并非如此 Response HTTP Response Body: { "error": { "code": 401, "message": "Request is missing required authentication credential. Expecte

我正在寻找一个Python3示例,介绍如何获取访问令牌,以便从GCS将csv文件从Google云函数导入云SQL

它来自一个云函数,因此我们期望它运行的服务帐户或云SQL实例的服务帐户在获得访问权限的情况下具有访问权限,但事实并非如此

Response HTTP Response Body: {
 "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"
 }
}

下面是代码,我很好奇是否有人有一些关于如何让它进行身份验证的示例代码

response = requests.post(
            url="https://www.googleapis.com/sql/v1beta4/projects/redacted-project/instances/redacted-instance/import",
            headers={"Content-Type": "application/json; charset=utf-8"
            },
            data=json.dumps({
                "importContext": {
                    "fileType": "CSV",
                    "csvImportOptions": {
                        "table": "service_data"
                    },
                    "uri": "gs://redacted-bucket/log/" + blob.name + "",
                    "database": "redacted-db"
                }
            })
        )
        print('Response HTTP Status Code: {status_code}'.format(status_code=response.status_code))
        print('Response HTTP Response Body: {content}'.format(content=response.content))
您应该使用构造此API的服务,而不是尝试直接发出请求。这将允许它获取云功能的默认服务帐户:

来自GoogleAppClient.discovery导入生成的

service=build('sql','v1beta4')
...

这里有更多详细信息:

在谷歌云函数中,您可以通过获取身份验证令牌

但是,有一个更简单的选择:使用。这将自动为您获取身份验证令牌


这两个选项都将通过服务帐户进行身份验证。如果您正在进行跨项目调用等,您可能需要授予该帐户权限。

1.从您的Google云功能中,假设您的云功能在默认服务帐户(即App Engine默认服务帐户)下运行,并具有角色
编辑器,则通过查询元数据服务器获取身份验证令牌

import requests
import json

METADATA_URL = 'http://metadata.google.internal/computeMetadata/v1/'
METADATA_HEADERS = {'Metadata-Flavor': 'Google'}
SERVICE_ACCOUNT = 'default'


def import_table(request):
    url = '{}instance/service-accounts/{}/token'.format(
        METADATA_URL, SERVICE_ACCOUNT)

    # Request an access token from the metadata server.
    r = requests.get(url, headers=METADATA_HEADERS)
    r.raise_for_status()

    # Extract the access token from the response.
    access_token = r.json()["access_token"]


    body = json.dumps({'importContext': {'fileType': 'CSV',
        'csvImportOptions': {'table': 'your_table'},
        'uri': 'gs://temprun/your_dump_file',
        'database': 'your_database'}})

    response = requests.post(
            url="https://www.googleapis.com/sql/v1beta4/projects/your_project/instances/your_sql_instance/import",
            headers={"Content-Type": "application/json; charset=utf-8",
                     "Authorization": "Bearer {}".format(access_token)
            },
            data=body)    

    return  str(response)



2.使用客户端库
google-api-python-client

def import_table(request):

    from googleapiclient.discovery import build
    service = build('sqladmin', 'v1beta4')

    body = {'importContext': {'fileType': 'CSV',
        'csvImportOptions': {'table': 'your_table'},
        'uri': 'gs://temprun/your_dump_file',
        'database': 'your_database'}}

    service.instances().import_(project='your_project', instance='your_instance', body=body).execute()

    return "Table was imported"
如果成功,响应主体将包含一个操作实例

{'kind': 'sql#operation',
 'targetLink': 'https://sqladmin.googleapis.com/sql/v1beta4/projects/your-project/instances/instance',
 'status': 'PENDING',
 'user': 'youraccount,
 'insertTime': '2020-03-18T09:02:55.437Z',
 'operationType': 'IMPORT',
 'importContext': {'uri': 'gs://yourbucket/dumpfile',
  'database': 'yourdatabase',
  'kind': 'sql#importContext',
  'fileType': 'CSV',
  'csvImportOptions': {'table': 'sql-table}},
 'name': 'cdcd53d4-96fe-41cf-aee4-12cf6ec6394e',
 'targetId': 'instance_name',
 'selfLink': 'https://sqladmin.googleapis.com/sql/v1beta4/projects/project/operations/cdcd53d4-96fe-41cf-aee4-12cf6ec6394e',
 'targetProject': 'your-project'}

谢谢,这个链接帮我指明了正确的方向。我想弄清楚的唯一一个小问题是错误返回“接收到无效的JSON有效负载。未知名称”“:根元素必须是一条消息。”>``使用客户端库帮助,尽管我从GoogleAppClient.errors.HttpError收到了一条消息:我求助于上面的选项1,一切正常。欣赏这个例子。好的,我也修复了选项2,它要求body是dict,选项1要求body是string