1

所以在生成 AWS SAM 模板 'web-backend' lambda 后,我的函数没有连接到我的 dynamodb docker 实例。

这是我正在使用的 JavaScript 代码:

const docClient = new dynamoDb.DocumentClient({region: 'localhost', endpoint: 'http://127.0.0.1:8000/'});
const data = await docClient.scan(params).promise();

并在我的终端中运行:

sam local start-api --docker-network lambda-local

&

docker run -d -p 8000:8000 --network=lambda-local amazon/dynamodb-local

点击生成的端点http://127.0.0.1:3000/,终端会给出错误:

ERROR   Invoke Error    {"errorType":"NetworkingError","errorMessage":"connect ECONNREFUSED 127.0.0.1:8000","code":"NetworkingError","message":"connect ECONNREFUSED 127.0.0.1:8000","errno":"ECONNREFUSED","syscall":"connect","address":"127.0.0.1","port":8000,"region":"localhost","hostname":"localhost","retryable":true,"time":"2021-01-03T15:21:11.468Z","stack":["Error: connect ECONNREFUSED 127.0.0.1:8000","    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1144:16)"]}

如果我尝试通过邮递员击中 dynamodb,我会得到:

{
    "__type": "com.amazonaws.dynamodb.v20120810#MissingAuthenticationToken",
    "message": "Request must contain either a valid (registered) AWS access key ID or X.509 certificate."
}

所以 dynamodb 服务器正在运行,因为我可以通过 noSQL 工作台连接到它,但我的假设是 sam 本地 api 的 docker 容器看不到 dynamodb 的 docker 容器?

任何想法将不胜感激!谢谢。

4

3 回答 3

2

我几乎可以向你保证这是一个 Docker 网络问题。当您有两个像这样需要相互通信的容器时,几乎总是这样。我建议您使用 Docker Compose,它会为您设置所有这些,而且要容易得多。DynamoDB文档为您提供了一个模板

对于访问 ID 错误的事情,您需要在aws configure运行 Postman 的地方运行。ID 等可以是任何东西,但它必须填充一些东西。

于 2021-01-03T21:05:52.920 回答
1

问题是您尝试在以下位置访问本地 dynamodDb 端点的方式endpoint: 'http://127.0.0.1:8000/'

在 sam 本地容器中127.0.0.1是指该容器,而不是 dynamodb 本地容器。

为了解决这个问题,您可以在启动 dynamodb 本地容器时为其命名,然后将端点更改为http://name_of_the_dynamodb_container:8000,它就会工作。

例如,像这样启动您的 dynamodb 本地:

docker run -name ddb_local -d -p 8000:8000 --network=lambda-local amazon/dynamodb-local

然后像这样在其他容器中配置连接:

const docClient = new dynamoDb.DocumentClient({region: 'localhost', endpoint: 'http://ddb_local:8000/'});
const data = await docClient.scan(params).promise();

这不是唯一的方法,但它应该适合你。

我认为 Eric Johnson 是对的,在进行本地开发时,除了运行密封单元测试之外,您几乎从不想将 dynamodb local 用于其他任何事情,但能够做到这一点还是很好的。

于 2021-01-06T09:10:19.240 回答
0

全面披露:我作为无服务器开发倡导者在 AWS 工作,并且经常直接与 SAM 合作。这不是您问题的答案,但我会大力鼓励您远离这种模式。SAM 本地可以像访问 DDB 本地一样轻松访问云中的 DynamoDB。事实上,这更容易,因为您不必与 Docker 网络搏斗。我在这个视频中谈论它。希望能帮助到你!https://youtu.be/NzPqMrdgD1s

于 2021-01-05T22:28:34.270 回答