Python 3.x 获取用于云SQL API的Google云访问令牌,以便在云函数中导入CSV
我正在寻找一个Python3示例,介绍如何获取访问令牌,以便从GCS将csv文件从Google云函数导入云SQL 它来自一个云函数,因此我们期望它运行的服务帐户或云SQL实例的服务帐户在获得访问权限的情况下具有访问权限,但事实并非如此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
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