【问题标题】:Localhost Endpoint to DynamoDB Local with Boto3本地主机端点到 DynamoDB 本地与 Boto3
【发布时间】:2015-08-11 17:56:46
【问题描述】:

虽然 Amazon 提供了有关如何使用 Java、PHP 和 .Net 连接到 dynamoDB local 的文档,但没有描述如何使用 Python 连接到 localhost:8000。网络上的现有文档指出在 boto.dynamodb2.layer1 中使用 DynamoDBConnection method,但这会在使用 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 设置端点。不幸的是,that option 目前似乎不可用。

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

【问题讨论】:

    标签: python amazon-dynamodb dynamo-local


    【解决方案1】:

    它确实支持 DynamoDB Local。您只需要设置适当的端点,就像您可以对其他 language SDKs 做的那样

    这是一段代码 sn-p,说明如何通过 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()))
    

    【讨论】:

    • 感谢您的解释。完美运行,所以我已经在调整我的代码了。您知道此功能是否记录在某处?合乎逻辑的位置是here。但是,我之前环顾了一下,没有发现任何迹象表明 boto3.client 接受 **kwargs。
    • "该功能是否记录在任何地方?"哈!不,不是亚马逊。他们甚至没有记录localhost:8000/shell 有一个 JS Web Shell 即使在那个 shell 中有一个“游览”,也没有你可以在那个 shell 中使用 tutorial.start() 完成的教程文档.有关youtu.be/tDqLwzQEOmM?t=1383 的更多信息最后,他们不会“记录”版本号,因此必须从 Homebrew 中删除该产品。 github.com/Homebrew/homebrew-core/pull/9175叹气。
    • 响应@RJ,您可以找到endpoint_url here 的文档以及客户端方法的其他关键字参数。我是从here 定向到该链接的
    • @Kyle Knapp- 运行此代码需要凭据吗?我收到“无法找到凭据”错误。
    • @kit 也许是迟到的,但我也跳进了“无法找到凭据”错误。可以通过设置AWS_ACCESS_KEY_ID=RANDOMAWS_SECRET_ACCESS_KEY=RANDOM环境变量来简单解决。
    【解决方案2】:

    注意:您需要将上述响应扩展到包括区域。我在上面附加了凯尔的代码。如果您的初始尝试遇到区域错误,这将返回适当的“[]”响应。

    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()))
    

    【讨论】:

    • 运行此代码需要凭据吗?我收到“无法找到凭据”错误。
    • 当您连接到localhost 时,您使用的region_name 真的有区别吗?这没有逻辑意义。
    【解决方案3】:

    使用虚拟访问密钥和 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")
    

    【讨论】:

    【解决方案4】:

    这是 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)。但是,您可以在家中手动创建 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 
    

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

    注意在本地 DynamoDb 开发中regionaws_access_key_idaws_secret_access_key 的值可以是任何东西。但是如果您想在 AWS 中使用 aws cli,那么您必须输入有效区域、有效 id 和密钥。它们在您注册 AWS 服务时可用。

    更多信息,当您致电时

    db = boto3.client('dynamodb')
    

    boto3 连接的主机将基于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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-09
      • 2020-12-10
      • 1970-01-01
      • 2011-01-03
      • 2023-01-26
      • 2013-03-03
      相关资源
      最近更新 更多