我建立了以下脚本:
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/