使用Boto3将Localhost端点连接到DynamoDB Local

R J*_*R J 33 python amazon-dynamodb dynamo-local

尽管亚马逊提供了有关如何使用Java,PHP和.Net 连接到本地dynamoDB的文档,但没有描述如何使用Python连接到localhost:8000.Web上的现有文档指向在boto.dynamodb2.layer1中使用DynamoDBConnection方法,但这会在使用boto3协议管理dynamoDB的实时环境和测试环境之间创建不兼容性.

在boto3中,您可以使用以下构造函数和设置到环境中的变量向dynamo发出请求:

client = boto3.client('dynamodb')
table = client.list_tables()
Run Code Online (Sandbox Code Playgroud)

而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()
Run Code Online (Sandbox Code Playgroud)

尽管可以创建基于本地环境确定正确构造函数的逻辑,但我对构建一组将每个构造函数视为相同的方法持谨慎态度.相反,我更喜欢使用boto3来处理所有事情,并且能够在环境变量中设置dynamoDB的端点.不幸的是,该选项似乎目前无法使用.

有没有办法使用boto3来定义dynamoDB本地端点(就像其他语言一样)?或亚马逊计划支持此功能的任何机会?

小智 47

它确实支持DynamoDB Local.您只需设置适当的端点,例如您可以使用其他语言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()))
Run Code Online (Sandbox Code Playgroud)

  • “该功能是否记录在任何地方?” 哈!不,不是亚马逊。他们甚至没有记录在 http://localhost:8000/shell/ 上有一个 JS Web Shell 即使在那个 shell 中有一个“游览”,也没有可以使用教程完成的教程文档.start() 在那个 shell 中。有关 https://youtu.be/tDqLwzQEOmM?t=1383 的更多信息 最后,他们没有“记录”版本号,因此必须从 Homebrew 中删除该产品。https://github.com/Homebrew/homebrew-core/pull/9175 叹息。 (6认同)
  • @kit 也许来晚了,但我也跳入了“无法找到凭据”错误。可以通过设置`AWS_ACCESS_KEY_ID=RANDOM`和`AWS_SECRET_ACCESS_KEY=RANDOM`环境变量来简单解决。 (2认同)

Dam*_*bur 17

注意:您需要将上述响应扩展到包含区域.我已经附上了凯尔的代码.如果您的初始尝试遇到区域错误,则会返回相应的"[]"响应.

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()))
Run Code Online (Sandbox Code Playgroud)

  • 运行此代码需要凭据吗?我收到“无法找到凭据”错误。 (2认同)

Sup*_*nno 10

这是教程python DynamoDb.它描述了如何连接到本地实例.

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

在aws配置(下面)的帮助下,似乎所需的最小参数如下.

dynamodb = boto3.resource('dynamodb', endpoint_url='http://localhost:8000/')
Run Code Online (Sandbox Code Playgroud)

使用aws configure命令(require install aws cli)配置配置文件参数时,可以省略区域,访问密钥和密钥参数.但是,您可以在家中手动创建aws配置文件(如果您不想使用aws cli).

文件〜/ .aws/config

[default]
output = json
region = anywhere
Run Code Online (Sandbox Code Playgroud)

文件〜/ .aws /凭证

[default]
aws_access_key_id = whatever_id
aws_secret_access_key = whatever_key 
Run Code Online (Sandbox Code Playgroud)

您可以在http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html中查阅aws配置.

注意在当地DynamoDb发展region,aws_access_key_idaws_secret_access_key在这些文件中的值可以是任何东西.但是如果你想在AWS上使用aws cli,那么你必须放入有效的区域,有效的id和密钥.注册AWS服务时可以使用它们.

您致电时的更多信息

db = boto3.client('dynamodb')
Run Code Online (Sandbox Code Playgroud)

主机boto3 connect将基于region参数,例如region=us-west-1当调用api以上时,它将连接到dynamodb.us-west-1.amazonaws.com.但是,当传递参数时endpoint_url,region将不会使用.有关更多AWS端点列表,请访问http://docs.aws.amazon.com/general/latest/gr/rande.html.


小智 9

使用虚拟访问密钥和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")
Run Code Online (Sandbox Code Playgroud)