繁体   English   中英

从 boto3 访问本地 DynamoDB

[英]Accessing DynamoDB Local from boto3

我正在做 AWS 教程 Python 和 DynamoDB。 我下载并安装了 DynamoDB Local。 我得到了访问密钥和秘密访问密钥。 我为 python 安装了 boto3。我剩下的唯一步骤是设置身份验证凭据。 我没有下载 AWS CLI,那么我应该在哪里包括访问密钥和秘密密钥以及区域?

我是否将其包含在我的 python 代码中?

我是否在放置此信息的目录中创建一个文件? 那么我是否应该在我的 python 代码中写任何东西以便它可以找到它?

您可以尝试在代码中传递 accesskey 和 secretkey,如下所示:

import boto3
session = boto3.Session(
    aws_access_key_id=ACCESS_KEY,
    aws_secret_access_key=SECRET_KEY,
)
client = session.client('dynamodb')
OR
dynamodb = session.resource('dynamodb')

AWS 文档

在您以编程方式或通过 AWS 命令行界面 (AWS CLI) 访问 DynamoDB 之前,您必须配置您的凭证以启用对您的应用程序的授权。 可下载的 DynamoDB 需要任何凭证才能工作,如以下示例所示。

AWS 访问密钥 ID:“fakeMyKeyId”

AWS 秘密访问密钥:“fakeSecretAccessKey”

您可以使用 AWS CLI 的 aws configure 命令设置凭证。 有关更多信息,请参阅使用 AWS CLI。

因此,您需要在您的主目录中创建一个.aws文件夹。 在那里创建credentialsconfig文件。 以下是如何执行此操作:

https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html

如果您想编写可移植代码并保持开发12 因素应用程序的精神,请考虑使用环境变量。 优点是在本地,CLI 和代码中的 boto3 python 库(以及几乎所有其他官方 AWS SDK语言、PHP、Go 等)都旨在查找这些值。

使用官方Docker镜像快速本地启动DynamoDB示例:

# Start a local DynamoDB instance on port 8000
docker run -p 8000:8000 amazon/dynamodb-local

然后在终端中,设置 CLI 和 SDK(如 boto3)正在寻找的一些默认值。 请注意,在您关闭终端 session 之前,这些将可用。

# Region doesn't matter, CLI will complain if not provided
export AWS_DEFAULT_REGION=us-east-1

# Set some dummy credentials, dynamodb local doesn't care what these are
export AWS_ACCESS_KEY_ID=abc
export AWS_SECRET_ACCESS_KEY=abc

如果您安装了 CLI,那么您应该能够运行以下命令(在同一个终端会话中)。 请注意--endpoint-url标志。

# Create a new table in DynamoDB Local
aws dynamodb create-table \
  --endpoint-url http://127.0.0.1:8000 \
  --table-name tmp \
  --attribute-definitions AttributeName=id,AttributeType=S \
  --key-schema AttributeName=id,KeyType=HASH \
  --billing-mode PAY_PER_REQUEST

然后您应该能够列出表格:

aws dynamodb list-tables --endpoint-url http://127.0.0.1:8000

并得到如下结果:

{
  "TableNames": [
    "tmp"
  ]
}

那么我们如何让我们在 CLI 中指定的endpoint-url在 Python 中工作? 不幸的是,boto3 代码库中没有端点 url 的默认环境变量,因此我们需要在代码运行时将其传入。 .NETJava的文档很全面,但 Python 的文档有点难以捉摸。 boto3 github 回购中也看到了这个很好的答案,我们需要使用endpoint_url关键字创建clientresource 在下面,我们正在寻找一个名为AWS_DYNAMODB_ENDPOINT_URL的自定义环境变量。 关键是如果指定,它将被使用,否则将回退到平台默认值,使您的代码可移植。

# Run in the same shell as before
export AWS_DYNAMODB_ENDPOINT_URL=http://127.0.0.1:8000
# file test.py
import os
import boto3

# Get environment variable if it's defined
# Make sure to set the environment variable before running
endpoint_url = os.environ.get('AWS_DYNAMODB_ENDPOINT_URL', None)
# Using (high level) resource, same keyword for boto3.client
resource = boto3.resource('dynamodb', endpoint_url=endpoint_url)
tables = resource.tables.all()
for table in tables:
    print(table)

最后,运行这个片段

# Run in the same shell as before
python3 test.py

# Should produce the following output:
# dynamodb.Table(name='tmp')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM