【问题标题】:Google cloud functions python script creates bucket - doesn't upload files谷歌云函数 python 脚本创建存储桶 - 不上传文件
【发布时间】:2021-03-30 17:54:22
【问题描述】:

我想要做什么:

  • 运行一些 BigQuery 查询
  • 以 JSON 文件形式输出结果
  • 将 JSON 文件上传到 GCS

我是如何做到的:

  1. 安装并初始化 Google Cloud SDK:gcloud auth activate-service-account --key-file="gcp-credentials.json"
  2. 启用 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
  1. 编写代码:
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/8753991https://cloud.google.com/storage/docs/uploading-objects...

标签: python python-3.x google-cloud-functions


【解决方案1】:

感谢大家的帮助 - 不知何故让它也发挥了作用。我想我错过了一个在您的云功能第一次运行/部署时自动生成的存储桶 (staging.PROJECT_ID.appspot.com)。此外,由于我不想将凭据与函数的 repo 一起存储,我使用 --service-account 标志和 PROJECT_ID@appspot.gserviceaccount.com 的形式从 gcloud 部署了函数...我不完全确定我是什么我做的是正确的,但这对我有用。

Unable to deploy google cloud functions

【讨论】:

    猜你喜欢
    • 2016-01-31
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 2021-08-25
    • 2016-08-09
    • 1970-01-01
    相关资源
    最近更新 更多