首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用python创建对象ibm-cos-sdk get不起作用。

使用python创建对象ibm-cos-sdk get不起作用。
EN

Stack Overflow用户
提问于 2018-11-21 03:13:37
回答 1查看 967关注 0票数 2

我需要帮助..。我无法从我在Watson Studio中创建的笔记本中访问我用IBM仪表板创建的COS中的一个桶。这叫bucket3。

最初,我使用IBM‘Asset’从一个f2.zip (csv)文件创建了一个bucket2,并且能够访问f2.zip。这叫bucket2。

f2.zip上传到bucket2 --后来发现它是在以前的COS存储上创建的;即。在IBM上创建的资产‘云-对象-存储-nl’。这叫bucket1。我在IBM名称=‘云对象-存储-xx’上有一个Lite COS。

我可以读取f2.zip,并且能够使用"Files“按钮生成的凭据(cred_b2_editor)在cred_b2_editor中创建一个新的f2.zip。

IBM仪表板显示:

代码语言:javascript
复制
bucket1 us-geo Standard
bucket2 us-geo Standard
bucket3 us-east Standard

我使用的例子来自 in Using Python ibm sdk。

在2种情况下调用ClientError操作:请求实体太大时发生了“PutObject :一个错误(413)”失败:

  1. 当我使用endpoint_url =‘端点’形式时,IBM生成的桶凭据- ibm_api_key_id并不重要。

成功:当我使用endpoint_url = 'endpoint_url‘形成由沃森工作室生成的沃森凭证.写入bucket2,而不考虑ibm_api_key_id (bucket2或bucket3)

代码:

代码语言:javascript
复制
# 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
            )

凭据代码-生成了以下所有内容

代码语言:javascript
复制
'''
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
                   )
EN

回答 1

Stack Overflow用户

发布于 2018-11-21 05:47:02

所需的解决办法:

  1. 导入具有桶名的bucket.configuration.CRN
  2. 导入一个'Writer‘ServiceCredential,并且
  3. 在调用bucketName ()时设置cos.Object和相应的kwargs。

键是将存储桶endpoint_url设置为相应桶的私有/公共端点。

对代码示例进行了更正,以反映更改。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53404771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档