本地主机端点与Boto3连接DynamoDB本地

57
虽然亚马逊提供了有关如何使用Java、PHP和.Net连接DynamoDB本地的文档,但没有描述如何使用Python连接localhost:8000。网上现有的文档指向在boto.dynamodb2.layer1中使用DynamoDBConnection方法, 但这会导致在使用boto3协议管理DynamoDB的生产环境和测试环境之间不兼容。
在boto3中,您可以使用以下构造函数和将变量设置到环境中来请求dynamo:
client = boto3.client('dynamodb')
table = client.list_tables()

与 boto.dynamodb2.layer1 包不同,您需要构建以下内容:

client = DynamoDBConnection(
    host='localhost',
    port=8000,
    aws_access_key_id='anything',
    aws_secret_access_key='anything',
    is_secure=False)
table = client.list_tables()

尽管可以创建逻辑来根据本地环境确定正确的构造函数,但我对构建一组将每个构造函数视为相同的方法持谨慎态度。相反,我更喜欢使用boto3来完成所有任务,并能够在环境变量中设置dynamoDB的端点。不幸的是,该选项目前似乎不可用。
有没有办法使用boto3定义一个dynamoDB本地端点(像其他语言一样)?或者亚马逊是否有计划支持此功能?
4个回答

77

它支持DynamoDB本地模式,您只需设置适当的端点,就像您可以使用其他语言SDK一样

以下是如何通过DynamoDB Local使用boto3客户端和资源接口的代码片段:

import boto3

# For a Boto3 client.
ddb = boto3.client('dynamodb', endpoint_url='http://localhost:8000')
response = ddb.list_tables()
print(response)

# For a Boto3 service resource
ddb = boto3.resource('dynamodb', endpoint_url='http://localhost:8000')
print(list(ddb.tables.all()))

感谢您的解释。它完美地运作,所以我已经在调整我的代码了。您知道这个功能是否有文档记录吗?逻辑上应该在这里。但是,在此之前我已经找了一些资料,没有发现任何迹象表明boto3.client接受**kwargs。 - R J
7
这个功能在任何地方都有记录吗?哈!不,亚马逊没有。即使 http://localhost:8000/shell/ 中有一个 JS Web Shell,他们甚至没有记录这一点。尽管在那个 shell 中有一个“导览”,但没有关于使用 tutorial.start() 在该 shell 中进行教程的文档。更多信息请参见 https://youtu.be/tDqLwzQEOmM?t=1383 最后,他们没有“记录”版本号,因此这个产品不得不从 Homebrew 中删除。https://github.com/Homebrew/homebrew-core/pull/9175 叹气。 - Bruno Bronosky
回应@RJ,您可以在此处找到endpoint_url的文档(http://boto3.readthedocs.io/en/latest/reference/core/session.html#boto3.session.Session.client),以及客户端方法的其他关键字参数。我是从这里(http://boto3.readthedocs.io/en/latest/reference/core/boto3.html)被引导到该链接的。 - Mieczysław Daniel Dyba
@Kyle Knapp- 运行这段代码需要凭据吗?我收到了“无法定位凭据”的错误提示。 - ketan
2
@kit 或许有点晚了,但我也遇到了“无法定位凭证”错误。可以通过设置 AWS_ACCESS_KEY_ID=RANDOMAWS_SECRET_ACCESS_KEY=RANDOM 环境变量来简单解决它。 - Dambre

20
注意:您需要扩展上述响应以包含地区。我已将其附加到Kyle的代码中。如果您的初始尝试受到区域错误的影响,这将返回适当的“[]”响应。

注意:您需要在上述响应中添加地区信息。我已经追加在Kyle的代码之后。如果您最初的尝试遇到区域错误,则会返回适当的“[]”响应。

import boto3

## For a Boto3 client ('client' is for low-level access to Dynamo service API)
ddb1 = boto3.client('dynamodb', endpoint_url='http://localhost:8000', region_name='us-west-2')
response = ddb1.list_tables()
print(response)

# For a Boto3 service resource ('resource' is for higher-level, abstracted access to Dynamo)
ddb2 = boto3.resource('dynamodb', endpoint_url='http://localhost:8000', region_name='us-west-2')
print(list(ddb2.tables.all()))

4
运行此代码需要凭据吗?我收到了“无法定位凭据”的错误提示。 - ketan
1
当您连接到localhost时,使用哪个region_name是否真的有区别?这在逻辑上是没有意义的。 - Mark Ransom

16

如果不使用虚拟访问密钥和ID,则运行方法时会引发异常。

import boto3

dynamodb = boto3.session('dynamodb',
                          aws_access_key_id="anything",
                          aws_secret_access_key="anything",
                          region_name="us-west-2",
                          endpoint_url="http://localhost:8000")
抱歉,我无法单独输出之后的内容。请提供完整的文本以便我能够完成任务。

如果您没有使用“-sharedDb”启动DynamoDB本地,则需要执行此操作。 - Erin Schoonover
1
boto3.session(...) 不起作用。它无法识别 endpoint_url。更多信息请参考 http://boto3.readthedocs.io/en/latest/reference/core/session.html。 - Supawat Pusavanno

15

这是关于用Python连接DynamoDB本地实例的教程。

http://docs.aws.amazon.com/amazondynamodb/latest/gettingstartedguide/GettingStarted.Python.01.html

根据 AWS 配置,以下似乎是最少所需的参数。

dynamodb = boto3.resource('dynamodb', endpoint_url='http://localhost:8000/')

当使用aws configure命令配置配置文件参数时,可以省略区域、访问密钥和秘密密钥参数(需要安装aws cli)。但是,在您的home目录下手动创建aws配置文件也是可行的(以防您不想使用aws cli)。

文件~/.aws/config

[default]
output = json
region = anywhere

文件 ~/.aws/credentials

[default]
aws_access_key_id = whatever_id
aws_secret_access_key = whatever_key 
您可以参考http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html中的AWS配置信息。
请注意,在本地DynamoDb开发环境中,那些文件中的regionaws_access_key_idaws_secret_access_key值可以是任意值。但如果您想使用AWS cli与AWS一起使用,则必须放置有效的区域、有效的ID和密钥。当您注册AWS服务时,它们可用。
更多信息,请在调用时查询。
db = boto3.client('dynamodb')

当使用时,主机将基于region参数进行设置,例如:在调用上述API时使用region=us-west-1,它将连接到dynamodb.us-west-1.amazonaws.com。但是,当传递endpoint_url参数时,region将不会被使用。要获取更多AWS终端节点列表,请访问http://docs.aws.amazon.com/general/latest/gr/rande.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接