docker AWS SAM 本地未连接到 docker dynamodb

如何解决docker AWS SAM 本地未连接到 docker dynamodb

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

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

解决方法

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

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

,

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

,

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?