Я создал следующий скрипт:
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 и секрет, но все еще имею ту же проблему.
Было бы очень полезно помочь решить эту проблему.
Большое спасибо!
Если он работает в одной среде и терпит неудачу в другом, я предполагаю, что вы получаете свой auth из.boto файла (или, возможно, из переменной среды OAUTH2_CLIENT_ID), но в вашем экземпляре kubernetes отсутствует такой файл. То, что у вас есть 403 вместо 401, говорит, что ваш удаленный сервер правильно аутентифицируется как кто-то, но кто-то не имеет права доступа к объекту, так что предположительно вы делаете вызов другим пользователем.
Если вы ничего не изменили, я предполагаю, что вы получаете стандартную версию Kubernetes Engine по умолчанию, со ссылкой на учетную запись службы, связанную с вашим проектом. Эта учетная запись службы, вероятно, не получила разрешения на чтение для вашего объекта, поэтому вы получаете 403. Предоставьте разрешение на чтение/запись для ваших ресурсов GCS, и это должно решить проблему.
Также обратите внимание, что по умолчанию учетные данные по умолчанию не ограничены, чтобы включать GCS, поэтому вам также нужно добавить это, а затем перезапустить экземпляр.
gcloud auth activate-service-account --key-file=service-account-key-file
и попробуйте снова выполнить код. Также убедитесь, что все узлы вашего кластера имеют файл ключа учетной записи службы.