我正试图部署以下云函数来从云存储写入bigquery表:
def csvloader(data,context):
from google.cloud import bigquery
client = bigquery.Client()
table_ref = client.dataset("dataset").table("table")
job_config = bigquery.LoadJobConfig()
job_config.write_disposition = bigquery.WriteDisposition.WRITE_TRUNCATE
job_config.skip_leading_rows = 1
job_config.source_format = bigquery.SourceFormat.CSV
uri = "gs://xxxx/xxx.csv"
load_job = client.load_table_from_uri(uri, table_ref, job_config=job_config)
load_job.result()
destination_table = client.get_table(table_ref)
运行时是Python 3.8和区域europe-west3
我收到的错误是:
Build failed: could not resolve storage source: googleapi: Error 404: Not Found, notFound
存储被很好地引用并存在,并且服务帐户具有以下权限
role: roles/bigquery.admin
role: roles/bigquery.dataEditor
role: roles/bigquery.dataOwner
role: roles/cloudfunctions.serviceAgent
您的问题似乎来自权限,为了解决这个问题:
- 单击UI上的云功能
- 单击页面顶部的
EDIT
按钮 - 单击部分
VARIABLES, NETWORKING AND ADVANCED SETTINGS
以打开它 - 在底部验证您是否使用了正确的服务帐户
- 如果服务帐户是正确的,则添加
Storage Admin
角色,等待几分钟,然后重试云功能
还有问题中提到的原始问题:
Error: Not found: URI gs://bucket/file.csv at new ApiError
由于所提到的对象不在所提到的路线中,请确保:
uri = "gs://xxxx/xxx.csv"
正在指向正确的bucket/文件夹/对象,请尝试按照注释部分所述查找:
gsutil ls gs://sp500components/SP500stocks.csv
我发现这个是因为我遇到了同样的问题。你似乎已经检查了角色,所以这可能不是你的解决方案,但这对我来说是有效的:
我正在使用GCP(云运行(的其他部分,我意识到CLI登录到了我的计算引擎默认服务帐户,而不是我的应用程序引擎默认服务账户。切换到应用程序引擎解决了错误。
我相信你有两个单独的账户是有遗留原因的,但似乎你必须使用正确的账户登录,这取决于你使用的是GCP的哪一部分。
您可以列出您的帐户:
gcloud iam service-accounts list
然后登录到正确的:
gcloud config set account <ACCOUNT>
gcloud auth login