我有一个使用Python的lambda的脚本设置,最终将连接到一个DynamoDB表。我使用亚马逊网络服务为DynamoDB提供的docker镜像在本地设置了一切(使用pipenv的虚拟环境),一切都运行得很顺利。然后,我尝试对接Python。当我在本地虚拟环境中运行我的表创建脚本时,它运行起来没有任何问题。当我在我的docker容器中运行相同的脚本时,我得到一个错误。我不确定有什么不同。现在,我使用这行代码来连接:
dynamodb = boto3.resource('dynamodb', endpoint_url="http://dynamodb:8000")
dynamodb
是docker中服务的名称,所以这应该是可行的。当我用localhost:8000
替换dynamodb:8000
时,它在我本地的venv上工作得很好。当我在docker中运行它时,我得到
botocore.exceptions.NoRegionError: You must specify a region.
最大的问题是,为什么它要在docker中寻找一个区域,而不是本地。这是我的docker-compose:
version: '3'
services:
dynamodb:
command: "-jar DynamoDBLocal.jar -sharedDb -optimizeDbBeforeStartup -dbPath ./data"
image: "amazon/dynamodb-local:latest"
container_name: dynamodb
ports:
- "8000:8000"
volumes:
- "./database_data:/home/dynamodblocal/data"
working_dir: /home/dynamodblocal
lambda:
build: .
container_name: user-rekognition-lambda
volumes:
- ./:/usr/src/app
发布于 2021-07-17 03:54:59
在亚马逊网络服务的博客local AWS Glue中,他们使用volume选项在只读模式下与docker容器共享~/.aws/
:
-v ~/.aws:/root/.aws:ro
对于您来说,这是在docker中重用主机工作站凭据的最简单方法。
发布于 2021-07-18 07:17:55
boto3有一个错误,即使您显式地给它一个endpoint_url
,它仍然想知道一个region_name
。为什么?我不知道,据我所知,它似乎没有使用这个名字。
在大多数人的设置中,$HOME/.aws/config
包含一些默认的区域选择,因此boto3从该配置中选择region_name
,然后忽略它……
由于您的docker映像可能没有该文件,简单的解决方案就是(例如)显式地将region_name='us-east-1'
添加到boto3.resource()
调用中。同样,您选择的特定区域名称并不重要- boto3将连接到您提供的网址,而不是连接到该区域。
因此,完整的命令变成:
dynamodb = boto3.resource('dynamodb',
endpoint_url="http://dynamodb:8000",
region_name="us-east-1")
https://stackoverflow.com/questions/68415785
复制相似问题