2016-07-26 204 views
1

用于python的AWS库(boto)具有两种不同类型的AWS工作接口,低级别client和更高级别pythonic resourceboto3从客户端获取资源

我的代码部分使用一个,而其他部分使用另一个。

从文档中找到从client获得resource

# Create the resource 
sqs_resource = boto3.resource('sqs') 

# Get the client from the resource 
sqs = sqs_resource.meta.client 

我的问题是,如果有客户sqs,我怎么得到这个boto3.resource

(我不能简单地调用boto3.resource('sqs'),因为客户端有其他的东西,比如证书已经连接到它,由于某些设计原因资源试图从一堆我不想要的地方获取AWS证书它,我想它使用任何凭据/帐户设置在客户端上)

+0

另请参阅https://github.com/boto/boto3/issues/747,如果实施,您可以获取它。 – copumpkin

回答

2

没有办法做到这一点。如果你想同时使用,你应该创建一个资源并使用嵌入式客户端。您可以使用与客户端完全相同的配置来实例化资源。资源的底层客户端以完全相同的方式创建。使用完全相同的参数创建的资源的客户端和客户端之间唯一的区别在于资源客户端将“资源”添加到用户代理。

1

我想你应该创建资源和客户端如下分别:

import boto3 
sqs_resource = boto3.resource("sqs") 
sqs_client = boto3.client("sqs") 

print dir(sqs_resource) 
print dir(sqs_client) 

输出:

[u'Message', u'Queue', '__class__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', u'create_queue', 'get_available_subresources', u'get_queue_by_name', 'meta', u'queues'] 
['_PY_TO_OP_NAME', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_cache', '_client_config', '_convert_to_request_dict', '_endpoint', '_force_path_style_s3_addressing', '_force_virtual_style_s3_addressing', '_get_waiter_config', '_loader', '_make_api_call', '_register_handlers', '_register_s3_specific_handlers', '_request_signer', '_response_parser', '_serializer', '_service_model', u'add_permission', 'can_paginate', u'change_message_visibility', u'change_message_visibility_batch', u'create_queue', u'delete_message', u'delete_message_batch', u'delete_queue', 'generate_presigned_url', 'get_paginator', u'get_queue_attributes', u'get_queue_url', 'get_waiter', u'list_dead_letter_source_queues', u'list_queues', 'meta', u'purge_queue', u'receive_message', u'remove_permission', u'send_message', u'send_message_batch', u'set_queue_attributes', 'waiter_names'] 

从上面的输出中,您将始终通过sqs_resource.meta.client从资源获取客户端。

但反之亦然是不可能的。

相反,创建资源和客户端,并使用你需要的任何东西。 请让我知道这是否有用。

相关问题