docker AWS SAM 本地未连接到 docker dynamodb

时间:2021-01-03 15:40:52

标签: amazon-web-services docker aws-lambda amazon-dynamodb sam

因此,在生成 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 容器?

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

3 个答案:

答案 0 :(得分:1)

我几乎可以向你保证这是一个 Docker 网络问题。当您有两个这样的容器需要相互通信时,几乎总是如此。我建议您使用 Docker Compose,它为您设置了所有这些,而且要容易得多。 DynamoDB documentation gives you a template

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

答案 1 :(得分:1)

问题在于您尝试在 endpoint: 'http://127.0.0.1:8000/' 处访问本地 dynamodDb 端点的方式

在 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 用于其他任何事情,但仍然很高兴能够做到这一点。

答案 2 :(得分:0)

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

相关问题