12

我正在尝试为无服务器架构进行本地开发设置。亚马逊为此提供了 SAM Local Beta。但在我的项目中,我们使用的是 mysql 数据库。我正在尝试连接到我的本地 mysql 服务器,但它失败了。

module initialization error:
(2003, "Can't connect to MySQL server on 'localhost'
([Errno 99] Cannot assign requested address)")

下面是我的python代码:

import json
import pymysql


def lambda_sandbox_down_handler(event, context):
    rds_host = 'localhost'
    name = 'localhost'
    password = 'localhost'
    db_name = 'localhost'
    conn = pymysql.connect(rds_host,port=3306, user=name, passwd=password,
                           db=db_name,charset='utf8mb4',connect_timeout=5)
    return conn

我可以使用命令行和 pycharm 进行连接。

我的问题是这在 SAM local 中是可能的。

我已经安装了 mysql 的 docker 映像并启动了它。在此之后,我仍然遇到同样的错误。

4

5 回答 5

16

我可以在 Ubuntu 19.04 上验证这一点,--docker-network host作为参数传递来sam local invoke为我解决问题。

例子:

sam local invoke MyLambdaFunction --event sample-event.json --docker-network host

一些帖子报告说使用host.docker.internal而不是localhost应该工作。另一个建议是使用 docker0 地址(ip addr show在 linux 上查找)。这通常是 172.17.0.1。但是,这些都不适合我。

于 2019-08-18T12:42:23.327 回答
16

SAM Local 工具在 Docker 容器中运行您的 Lambda 函数。localhost不会从容器内部解析到主机 IP。

如果您使用 Docker for Mac,您可以使用特殊的 DNS 名称docker.for.mac.localhost作为数据库主机。

在其他操作系统上,您可以在docker0网络接口中查找主机的 IP 并将其用作数据库主机。例如,请参阅:从 Docker 容器内部,如何连接到机器的本地主机?

于 2018-01-23T03:03:24.227 回答
4

无需配置,只需在连接到您的 mysql 时在主机下方添加

对于 Windows:docker.for.win.localhost 对于 Mac:docker.for.mac.localhost

const con = require('serverless-mysql')({
  config: {
   host     :  'docker.for.win.localhost',
   database : 'db-name',
   user     : 'root',
   connectTimeout : 5000,
   password : ''
 }
}); 
于 2020-07-16T06:22:14.140 回答
2

只是把我的解决方案作为一些混合在这里。我正在 WSL2 ubuntu 20.04 LTS 中开发。

我有一个本地运行的 MySQL 数据库,而不是在 docker 容器中。要连接到它,我确实必须为 WSL 启用 docker,请参见此处

在此之后,我将 my 设置hosthost.docker.internal而不是localhost. 随着我的数据库现在在后台运行,我能够在运行后连接到它,sam build并且在必要时无需额外的命令行sam local invoke参数。

如果你想测试它的小片段

import mysql.connector

cnx = mysql.connector.connect(user='XXX', password='AAA',
                              host='host.docker.internal',
                              port=3306,
                              database='YYY')
cnx.close()
于 2021-03-30T10:09:09.697 回答
0

我的问题是这在 SAM local 中是可能的:是的,您可以在 SAM local 中运行 Lambda 等,SAM local 通过在 docker 容器中运行它来提供环境。

因此,要使 SAM 构建成功,您需要在本地机器上安装 docker 并进行 SAM 构建。

一旦 SAM 构建成功,您就可以运行您的程序。要连接到 mac 中的 localhost,请使用 host.docker.internal 代替 localhost,如果您使用的是 docker 18.03 或更高版本,对于以前版本的 docker,您可以使用 docker.for.mac.localhost。

同样要连接到您的 mysql,您不需要在容器内运行 mysql。

于 2019-07-19T05:00:54.753 回答