【发布时间】:2021-03-30 17:54:22
【问题描述】:
我想要做什么:
- 运行一些 BigQuery 查询
- 以 JSON 文件形式输出结果
- 将 JSON 文件上传到 GCS
我是如何做到的:
- 安装并初始化 Google Cloud SDK:
gcloud auth activate-service-account --key-file="gcp-credentials.json" - 启用 API:
gcloud services enable \
bigquery.googleapis.com \
cloudbuild.googleapis.com \
cloudfunctions.googleapis.com \
cloudscheduler.googleapis.com \
pubsub.googleapis.com \
serviceusage.googleapis.com \
storage-component.googleapis.com
- 编写代码:
src
|__data
|__queries
|__test_query_1.sql
|__test_query_2.sql
|__test_query_3.sql
|__scripts
|__config.py
|__log.txt
|__main.py
|__requirements.txt
requirements.txt
google-cloud-bigquery
google-cloud-storage
config.py:
from pathlib import Path
src_dir = Path(__file__).absolute().parent
config_vars = {
"data_dir": src_dir.parent / "data",
"queries_dir": src_dir.parent / "queries",
"bucket": "...",
}
main.py:
import ...
data_dir = config.config_vars["data_dir"]
queries_dir = config.config_vars["queries_dir"]
def main(data, context):
...
if __name__ == "__main__":
main("data", "context")
所以main.py 脚本会获取查询文件夹中的所有查询,运行它们,将它们输出为 JSON,然后将它们上传到名为“test-bucket-20201219”的存储桶中。如果存储桶不存在,则创建它。
脚本在本地运行良好,但是当它通过 PubSub 和 Google Scheduler 在 GCP 中部署和调度时,它会运行并创建存储桶,但不会上传文件...我不确定我做错了什么。任何帮助将非常感激。尝试了一切 - 例如允许 PROJECTID@appspot.gserviceaccount.com 将对象添加到存储桶。
记录语句:
2020-12-20 18:43:50,656 | INFO | Uploading test_query_2.json to test-bucket-20201219.
2020-12-20 18:43:50,962 | DEBUG | https://storage.googleapis.com:443 "POST /upload/storage/v1/b/test-bucket-20201219/o?uploadType=multipart HTTP/1.1" 200 776
2020-12-20 18:43:50,963 | INFO | Uploading test_query_3.json to test-bucket-20201219.
2020-12-20 18:43:51,238 | DEBUG | https://storage.googleapis.com:443 "POST /upload/storage/v1/b/test-bucket-20201219/o?uploadType=multipart HTTP/1.1" 200 776
2020-12-20 18:43:51,239 | INFO | Uploading test_query_1.json to test-bucket-20201219.
2020-12-20 18:43:51,466 | DEBUG | https://storage.googleapis.com:443 "POST /upload/storage/v1/b/test-bucket-20201219/o?uploadType=multipart HTTP/1.1" 200 775
【问题讨论】:
-
假设代码在某个时候失败了,我们应该查看 Cloud Logging 日志以查看记录的内容(如果有的话)。还可以考虑将日志语句添加到您的代码中以进行调试并验证我们是否已达到预期的所有点。
-
Cloud Logging 日志显示一切正常,但没有显示文件已上传。我添加了日志语句,但是当我转到 Cloud Functions 页面并尝试检查源时,我收到一条通用错误消息:“Cloud Functions 中发生未知错误。尝试的操作失败,请重试。”在它应该显示源代码的地方我得到一个“获取档案时出现未知错误”。我要关闭项目然后重新启动它,希望这会创建缺少的依赖项?
-
从下载 zip 文件中获取日志。将它们添加到描述中
-
如果您在 main.py 中提供整个代码,您是如何上传文件或创建存储桶的,也会有所帮助。尝试启用
storage.googleapis.com,以下是其他链接可能有助于上传https://stackoverflow.com/a/37102815/8753991、https://cloud.google.com/storage/docs/uploading-objects...
标签: python python-3.x google-cloud-functions