处理使用 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 Table与广告服务器数据分析的大查询