我在GCP上执行Cloud Function时遇到问题,该功能试图更新我的某些Google工作表。我在Jupyter中使用了该脚本,但实际上很难将其部署为Cloud Function。我的问题似乎是授权CF发布到Google表格。
我已经尝试了6个多小时的很多事情,大多数关于stackoverflow的问题,中等水平的文章github,但是还没有找到适合我的解决方案。我认为这不是角色/权限问题。我了解当您不在云功能内部但不在云功能内部时,其中某些功能可能会起作用。
最终,我认为从我所看到的最佳方法来看,是将我的JSON秘密密钥托管在一个存储桶中并调用它,但我没有尝试成功,这似乎有些令人费解,因为一切都是从Google服务。
老实说,我回到了原始代码,所以回到了第一个错误,那就是找不到与我在Jupyter中运行它的JSON密钥相同的目录中的JSON密钥...因此,为什么我创建了一个Google存储桶以尝试链接。
import pandas as pd
import gspread
from oauth2client.service_account import ServiceAccountCredentials
import google.cloud
from df2gspread import df2gspread as d2g
from df2gspread import gspread2df as g2d
import datetime
import time
import numpy as np
def myGet(event, context):
scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive']
credentials = ServiceAccountCredentials.from_json_keyfile_name('my-key-name.json', scope)
gc = gspread.authorize(credentials)
spreadsheet_key = '--removed actual key/id--'
错误:from_json_keyfile_name中的文件“ /env/local/lib/python3.7/site-packages/oauth2client/service_account.py”,行219,以file_obj的形式打开(文件名,“ r”):FileNotFoundError:[Errno 2]没有这样的文件或目录:'my-key-name.json'
非常感谢您对此提供的任何指导和支持。我不停地寻找并试图自己解决这个问题。编辑:请记住,这不是一个驻留在目录中的.py文件,这是我的问题的一部分,据我所知,我不知道要链接到其孤立的“云函数”。 / p>
在20多个尝试解决此问题的过程中,我查看了一些链接,仅举几例:
How can I get access to Google Cloud Storage using an access and a secret key
Accessing google cloud storage bucket from cloud functions throws 500 error
https://cloud.google.com/docs/authentication/getting-started#auth-cloud-implicit-python
https://cloud.google.com/docs/authentication/getting-started#setting_the_environment_variable
更新: 我意识到您可以上载文件的zip,以便在嵌入式编辑器中显示三个文件。起初我没有这样做,所以无法弄清楚将JSON密钥放在哪里。现在我可以看到它了,需要弄清楚如何在方法中调用它。
当我对CF进行测试运行时,我得到一个非描述性错误,该错误不会显示在日志中,并且无法像以前一样从Cloud Schedular中对其进行测试。我在堆栈溢出时发现了这一点,觉得我现在需要相同的版本,但要使用python,并弄清楚从Google文档中调用什么。
Cloud Functions: how to upload additional file for use in code?
答案 0 :(得分:2)
我的建议是不要在您的Cloud Functions(以及所有GCP产品)中使用JSON密钥文件。与其他GCP产品一样,借助Cloud Function,您可以在部署期间自动加载服务帐户。
Cloud Function Identity的优点是您无需秘密存储密钥文件,不必旋转密钥文件来提高安全性,并且没有密钥文件泄漏的风险,...
顺便说一句,在代码中使用default service account。
如果需要获取凭据对象,可以为此使用oauth2 python library。
import google.auth
credentials, project_id = google.auth.default()
答案 1 :(得分:0)
您需要指定一个相对文件名,例如./my-key-name.json
,并假设文件与main.py
文件位于同一目录。
答案 2 :(得分:0)
我遇到了同样的问题,并像这样解决了它:
import google.auth
credentials, _ = google.auth.default()
gc = gspread.authorize(credentials)
这应该对您有用。