【问题标题】:migrating from boto2 to 3从 boto2 迁移到 3
【发布时间】:2016-06-03 23:22:15
【问题描述】:

我有这个使用 boto2 的代码,我需要移植到 boto3,坦率地说,我在 boto3 文档中有点迷失:

connection = boto.connect_s3(host=hostname,
                             aws_access_key_id=access_key,
                             aws_secret_access_key=secret_key,
                             is_secure=False,
                             calling_format=boto.s3.connection.OrdinaryCallingFormat())
s3_bucket = connection.get_bucket(bucket_name)

我还需要与其他非 aws S3 的对象存储一起使用。

【问题讨论】:

  • 这将不适用于其他对象存储,因为它是特定于 boto 的,并且 boto3 不支持其他对象存储。您必须为您的应用程序编写一个包装器,以便在不直接与后台 API 交互的情况下获取对象。

标签: python-3.x boto boto3


【解决方案1】:
import boto3

s3 = boto3.client('s3', aws_access_key_id=access_key,
                  aws_secret_access_key=secret_key,
                  endpoint_url=hostname, use_ssl=False)
response = s3.get_bucket(Bucket=bucket_name)

client docs

s3 docs

【讨论】:

  • calling_format 参数怎么样?不再使用了吗?
【解决方案2】:

boto3 和 boto 不兼容。大多数命名都不向后兼容。

您必须阅读 boto3 文档才能重新创建脚本。好消息是,Boto3 文档比 boto 更好,虽然不是很好(没有提供许多棘手的参数示例)。

如果您有一些应用程序使用一些旧功能,您应该为其创建一个包装代码以使切换透明。

因此,您通过包装器实例化任何对象存储连接,然后使用不同的连接器实例化各种存储桶。这是一些想法。

#AWS 
# object_wrapper is a your bucket wrapper that All the application willc all 
from object_wrapper import object_bucket
from boto3lib.s3  import s3_connector
connector = s3_connector()
bucket = object_bucket(BucketName="xyz",  Connector=connector)


# say you use boto2 to connect to Google object store
from object_wrapper import object_bucket
from boto2lib.s3 import s3_connector 
connector = s3_connector()
bucket = object_bucket(BucketName="xyz",  Connector=connector)

# say for Azure
from object_wrapper import object_bucket
from azure.storage.blob import BlockBlobService
connector = BlockBlobService(......)
bucket = object_bucket(BucketName="xyz",  Connector=connector)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    • 2019-02-26
    • 2019-09-06
    • 2011-07-30
    • 2020-03-29
    • 2011-07-18
    • 1970-01-01
    相关资源
    最近更新 更多