создать объект с python ibm-cos-sdk get не работает - PullRequest
0 голосов
/ 21 ноября 2018

Мне нужна помощь ... Я не могу получить доступ к корзине в моей COS, которую я создал с помощью панели инструментов IBM Cloud, из своей записной книжки, которую я создал в Watson Studio.Назовите это bucket3.

Изначально я создал bucket2 из одного файла f2.zip (csv), используя IBM Watson «Добавить актив», и я могу получить доступ к f2.zip.Назовите это bucket2.

Файл f2.zip был загружен в bucket2 - позже выяснилось, что он был создан ранее в хранилище COS;то есть.ресурс, созданный в IBM Cloud 'cloud-object-storage-nl'.Назовите это ведро1.У меня есть одна Lite COS в IBM Cloud name = 'cloud-object-storage-xx'.

Я могу прочитать файл f2.zip и создать новый файл f2.zip в bucket2, используя учетные данные, сгенерированные (cred_b2_editor) с помощью кнопки «Файловый интерфейс».

Панель инструментов IBM Cloudпоказывает:

bucket1 us-geo Standard
bucket2 us-geo Standard
bucket3 us-east Standard

Я использую пример из Creating a new text file в Использование Python ibm-cos-sdk.

Сбой с "ClientError: Произошла ошибка (413) при вызове операции PutObject: «Запросить объект слишком большой» в 2 случаях:

  1. при использовании endpoint_url = «конечные точки» образуют учетные данные корзины, сгенерированные IBM Cloud) - ibm_api_key_id не имеет значения.

Успешно: когда я использую endpoint_url = 'endpoint_url', формирую учетные данные watson, сгенерированные Watson Studio ... записывает в bucket2 независимо от ibm_api_key_id (bucket2 или bucket3)

CODE:

# Point to generated credentials
credDict = dict(b2 = cred_b2_editor,
                b3 = cred_b3_writer,
                watson = cred_watson
                )


bucketName = 'b3'
kwargs = dict(
    ibm_api_key_id=credDict[bucketName]['ibm_api_key_id'],
    ibm_service_instance_id=credDict[bucketName]['cred']['iam_serviceid_crn'], #COS_RESOURCE_CRN,
    ibm_auth_endpoint=COS_AUTH_ENDPOINT,
    config=Config(signature_version="oauth"),
    endpoint_url=credDict[bucketName]['ep_private']
    )
buckName = bucketDict[bucketName].split(':')[-1:][0]

print(buckName, kwargs['ibm_api_key_id'], kwargs['endpoint_url'])
cos = ibm_boto3.resource("s3", **kwargs)

#---> fix: bucketname needed to change with each bucket...
#---> fix: endpoint_url needs to point to private/public endpoint 
cos.Object(buckName, csvBN.replace('.csv','.zip')).put(
                Body=zbuf
            )

Код учетных данных - сгенерировано все следующее

'''
Cloud Resource Name or 'bucket ID string'

The last field is the `bucketName`
'''
bucketDict = dict(b2 = 'crn:v1:bluemix:public:cloud-object-storage:global:a/<IDNum>:<serviceID-seperated>:bucket:bucket2',
               b3 = 'crn:v1:bluemix:public:cloud-object-storage:global:a/<IDNum>:<serviceID-seperated>:bucket:bucket3'
              )

# Bucket2 Editor credentials - created by IBM Watson automatically
cred_b2_editor = {
  "apikey": "....",
  "cos_hmac_keys": {
    "access_key_id": "...",
    "secret_access_key": "..."
  },
  "endpoints": "https://cos-service.bluemix.net/endpoints",
  "iam_apikey_description": "Auto generated apikey during resource-key operation for Instance - crn:v1:bluemix:public:cloud-object-storage:global:a/<ServiceIDNum>:<COS_ID>::",
  "iam_apikey_name": "auto-generated-apikey-<apikey_2>",
  "iam_role_crn": "crn:v1:bluemix:public:iam::::serviceRole:Writer",
  "iam_serviceid_crn": "crn:v1:bluemix:public:iam-identity::a/<ServiceIDNum>::serviceid:ServiceId-<serviceID_2>",
  "resource_instance_id": "crn:v1:bluemix:public:cloud-object-storage:global:a/<ServiceIDNum>:<COS_ID>::"
}

## Bucket3 Create via IBM Cloud "New Credentials"
cred_b3_writer = {
  "apikey": "4hEJq-slh28Atvq3XnekZ4YOl0yWiv4LbFigoPS3oiuL",
  "endpoints": "https://cos-service.bluemix.net/endpoints",
  "iam_apikey_description": "Auto generated apikey during resource-key operation for Instance - crn:v1:bluemix:public:cloud-object-storage:global:a/<ServiceIDNum>-<COS_ID>::",
  "iam_apikey_name": "auto-generated-apikey-<apikey_3>",
  "iam_role_crn": "crn:v1:bluemix:public:iam::::serviceRole:Writer",
  "iam_serviceid_crn": "crn:v1:bluemix:public:iam-identity::a/<ServiceIDNum>::serviceid:ServiceId-<ServiceID_3>",
  "resource_instance_id": "crn:v1:bluemix:public:cloud-object-storage:global:a/<ServiceIDNum>:<COS_ID>::"
}

# Created inside juptyer notebook 10/01 button
cred_b2_cos = dict(ibm_api_key_id=cred_b2['apikey'],
                   ibm_auth_endpoint="https://iam.ng.bluemix.net/oidc/token",
                   config=Config(signature_version='oauth'),
                   ep_private='https://s3-api.us-geo.objectstorage.service.networklayer.com',
                   ep_public = 'https://s3-api.us-geo.objectstorage.softlayer.net',
                   cred = cred_b2_editor
                   )
cred_b3_cos = dict(ibm_api_key_id=cred_b3['apikey'],
                   ibm_auth_endpoint="https://iam.ng.bluemix.net/oidc/token",
                   config=Config(signature_version='oauth'),
                   ep_private = 'https://s3.us-east.objectstorage.service.networklayer.com',
                        ep_public = 'https://s3.us-east.objectstorage.softlayer.net',
                   cred = cred_b3_writer
                   )

1 Ответ

0 голосов
/ 21 ноября 2018

Требуемое решение:

  1. import bucket.configuration.CRN, который имеет имя сегмента
  2. , импортировать ServiceCredential 'Writer' и
  3. , задавая имя bucketName и соответствующее емуkwargs при вызове cos.Object ().

Ключ устанавливал сегмент endpoint_url в частную / общедоступную конечную точку для соответствующего сегмента.

Примеры кода были исправлены с учетом изменений.

...