我建立了以下脚本:

import boto
import sys
import gcs_oauth2_boto_plugin

def check_size_lzo(ds):

# URI scheme for Cloud Storage.

    CLIENT_ID = 'myclientid'
    CLIENT_SECRET = 'mysecret'

    GOOGLE_STORAGE = 'gs'

    dir_file= 'date_id={ds}/apollo_export_{ds}.lzo'.format(ds=ds)



    gcs_oauth2_boto_plugin.SetFallbackClientIdAndSecret(CLIENT_ID, CLIENT_SECRET)
    uri = boto.storage_uri('my_bucket/data/apollo/prod/'+ dir_file, GOOGLE_STORAGE)
    key = uri.get_key()



    if key.size < 45379959:
        raise ValueError('umg lzo file is too small, investigate')
    else:
        print('umg lzo file is %sMB' % round((key.size/1e6),2))



if __name__ == "__main__":

     check_size_lzo(sys.argv[1])

它在本地可以正常工作,但是当我尝试在kubernetes集群上运行时,出现以下错误:
boto.exception.GSResponseError: GSResponseError: 403 Access denied to 'gs://my_bucket/data/apollo/prod/date_id=20180628/apollo_export_20180628.lzo'

我已经更新了群集上的.boto文件,并添加了我的oauth客户端ID和密码,但仍然存在相同的问题。

非常感谢您帮助解决此问题。

非常感谢!

最佳答案

如果它在一种环境中工作而在另一种环境中工作失败,那么我认为您是从.boto文件(或可能从OAUTH2_CLIENT_ID环境变量)获取身份验证的,但是您的kubernetes实例缺少这种文件。如果您得到的是403而不是401,则表示您的远程服务器已正确地以某人身份进行身份验证,但是该人无权访问该对象,因此,大概是您以其他用户身份进行 call 。

除非您进行了一些更改,否则我猜您将获得the default Kubernetes Engine auth,意味着a service account associated with your project。该服务帐户可能没有被授予对对象的读取权限,这就是为什么您获得403的原因。向其授予对GCS资源的读取/写入权限,这应该可以解决问题。

另请注意,默认情况下,默认凭据的范围不包括GCS,因此先you'll need to add that as well然后重新启动实例。

关于python - 尝试使用python连接到Google云存储(GCS),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51268208/

10-10 23:14