处理使用 docker 向 google big query 读取和写入数据的 python 脚本的自动身份验证

Posted

技术标签:

【中文标题】处理使用 docker 向 google big query 读取和写入数据的 python 脚本的自动身份验证【英文标题】:Handling automatic authentication of a python Script that read and write data to google big query using docker 【发布时间】:2018-03-25 09:58:34 【问题描述】:

我最近在我的本地机器上开发了一个python代码,它从mysql数据库中读取数据并插入google big query。我使用服务帐户进行身份验证,我的代码可以成功执行而不会出错。现在我正在尝试在 docker python 容器中运行我的脚本。一旦我运行我的代码,就会收到一条身份验证消息,我不确定如何在没有用户和系统之间交互的情况下自动处理它。

消息是:

"请访问此 URL 以授权此应用程序: https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=4xxxxxxxk0tmvj2m941jhre2nbqka17vqxxfxxx.apps.googleusercontent.com&redirect_uri=urn%3Aietf%3Awg%3Aoauth%xxxxxxxb&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fbigquery&state=kszePnO3tOxxxxxx&prompt=consent&access_type=offline 输入授权码:Traceback(最近一次通话最后一次):... .........

EOFError:读取一行时出现EOF "

我的 Python 代码:

import mysql.connector
import pandas as pd
from oauth2client.client import GoogleCredentials
from bigquery import get_client
import os
import urllib.request

service_account = 'xxxxx@xxxxxx.gserviceaccount.com'
key = 'xxxxxxxxx.p12'
project_id = 'xxxxxxxxx'
db = mysql.connector.connect(user=$user, 
password=$password,host=$host,database=$database)
df= pd.read_sql(sql_query,db)
....
client = get_client(project_id, service_account=service_account,  
private_key_file=key, readonly=False)

#Push dataframe to google bigquery
 df.to_gbq('GoogleBQDatbaseName.TableName',projectid,verbose=True,if_exists='append')

关于如何在我的脚本中自动处理此身份验证问题的任何建议。 谢谢

【问题讨论】:

【参考方案1】:

我做同样的工作,所以带有 google auth 的 dockerfile 的一部分看起来像这样:

RUN apt-get install -y software-properties-common curl

RUN export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)"; echo "deb http://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list

RUN curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -

RUN apt-get update && apt-get -y install google-cloud-sdk

COPY YOUR_JSON_KEY_HERE.json /keys/ANY_NAME.json

ENV GOOGLE_APPLICATION_CREDENTIALS ANY_NAME.json

RUN gcloud auth activate-service-account --key-file=/keys/ANY_NAME.json

因此,您必须创建 google 服务帐户并从 Google Cloud Console 获取 json 密钥。我也在使用

FROM ubuntu:16.04

在这种情况下,在您的 python 脚本中,您不必进行 google 身份验证。我的意思是你不需要这部分代码:

client = get_client(project_id, service_account=service_account, private_key_file=key, readonly=False) 

【讨论】:

感谢您的详细回答 Vasily... 我会尝试您的解决方案。不幸的是,目前我无法为服务帐户创建 JSON 文件,因为我没有足够的权限。我手里只有 p12 文件、项目 ID 和服务帐户电子邮件文件。由于它在我的本地系统上运行良好,我认为可能有一种解决方案可以在 docker 中处理此问题,而无需像我在我的文件中所做的那样创建 JSON 文件本地 Mac 机器。 你可以尝试 p12 keyfile 代替 json 但我不知道它是否有效

以上是关于处理使用 docker 向 google big query 读取和写入数据的 python 脚本的自动身份验证的主要内容,如果未能解决你的问题,请参考以下文章

Google Big Query 在日期列中期望啥?

将存储过程的结果存储在 Google Big Query 表中

Big Table中文翻译

Google Big Table与广告服务器数据分析的大查询

使用 Google Big Query 在 Google App 脚本上超过最大执行时间

使用 Google Big Query 构建基本漏斗