【发布时间】:2020-09-23 02:23:50
【问题描述】:
您好,我正在尝试编写一个 python 脚本,该脚本完全符合以下命令的功能:
gcloud 日志记录读取“logName=projects/[project_name]/logs/[id]”
所以当我从 cli 运行该命令时,它不会给我任何错误,它会按预期输出日志。
但是当我运行我的 python 脚本时:
import argparse
import datetime
import os
import sys
from pprint import pprint
from google.cloud import bigquery
from google.cloud import logging
assert "GOOGLE_APPLICATION_CREDENTIALS" in os.environ
def main():
client = logging.Client()
log_name = 'log_id'
logger = client.logger(log_name)
for entry in logger.list_entries():
print(entry.payload)
if __name__ == "__main__":
main()
我得到错误: google.api_core.exceptions.PermissionDenied: 403 调用者没有权限
我不知道在这里做什么,因为命令行运行,我显然有权限。 任何想法将不胜感激
【问题讨论】:
-
这个脚本在哪里运行?本地? --> 您是否在 GOOGLE_APPLICATION_CREDENTIALS 环境变量上设置了任何路径?你跑了
gcloud auth application-default login。在计算引擎/appengine/cloudfunction上;关联的服务帐号是否有正确的权限? -
它在 docker 容器中本地运行。我在 bashrc 文件中将 GOOGLE_APPLICATION_CREDENTIALS 设置为环境变量。我还没有运行 gcloud auth application-default login。但是,如果 gcloud 日志记录读取“logName=projects/[project_name]/logs/[id]”cli 命令有效。 python脚本不应该也运行吗?即使在尝试 gcloud auth application-default login 之后它也不会运行。
-
不一定,因为 gcloud 可能会在您的许可而不是关联服务帐户密钥文件的许可下进行操作。您能否确认服务帐户具有正确的权限? .愚蠢的问题,在您的 docker 容器上,您是否绑定了包含您的密钥文件的卷?例如 -v local/path/to/keyfile.json:/tmp 然后相应地定义 var:GOOGLE_APPLICATION_CREDENTIALS=/tmp/keyfile.json
-
可以肯定的是,只需运行 gcloud auth list 即可知道使用了哪个帐户。如果是您,则运行
gcloud auth activate-service-account --key-file=/path/keyfile.json并再次运行gcloud logging read...以验证您确实可以在您的服务帐户的权限下阅读。 (最好从运行 python 脚本的容器中) -
你说得对,我的服务帐户权限无法读取日志。
标签: python logging google-cloud-platform cloud google-cloud-dataflow