允许Google Cloud Compute Engine实例将文件写入Google存储桶-Python

时间:2019-04-20 05:20:02

标签: python google-compute-engine gcsfuse

在运行于google cloud VM实例上的python服务器脚本中,它尝试将图像(jpeg)保存在存储中。但是会引发以下错误。

  

文件“ /home/thamindudj_16/server/object_detection/object_detector.py”,   109行,在检测手中       new_img.save(“ slicedhand / {}#sliced_image {}。jpeg” .format(threadname,   i))文件

     

“ / home / thamindudj_16 / .local / lib / python3.5 / site-packages / PIL / Image.py”,   行2004,保存       fp = builtins.open(文件名,“ w + b”)

     

OSError:[Errno 5]输入/输出错误:'slicedhand / thread_1#sliced_image0.jpeg'

所有文件(包括python脚本)均位于 google存储桶中,并已使用gcsfuse 挂载至VM实例。应用程序尝试将新图像保存在 slicedhand 文件夹中。

保存图像的Python代码段。

from PIL import Image

...
...

i = 0
new_img = Image.fromarray(bounding_box_img)      ## conversion to an image
new_img.save("slicedhand/{}#sliced_image{}.jpeg".format(threadname, i))

我认为可能是权限访问存在问题。 Doc说要使用--key_file。但是我应该使用什么密钥文件以及在哪里可以找到它。我不清楚这是问题还是其他原因。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我了解到您正在Linux VM实例上使用gcfuse访问Google Cloud Storage。

密钥文件是服务帐户凭据密钥,可让您将Cloud SDK或客户端库初始化为另一个服务帐户。 You can download key file from Cloud Console。但是,如果您使用的是VM实例,则会自动使用Compute Engine默认服务帐户。您可以使用控制台命令$ gcloud init进行检查。

configure properly your credentials, please follow the documentation

Compute Engine默认服务帐户,需要具有enabled Access Scope Storage > Full。访问范围是一种限制对Cloud API的访问级别的机制。这可以在计算机创建过程中或停止VM实例时完成。

请注意,Access Scopes是为您为VM实例选择的服务帐户明确定义的。

  

云存储objects names have requirements。强烈建议避免在对象名称中使用哈希符号“#”。