Sam local

时间:2017-11-22 17:32:51

标签: python mysql aws-sam-cli

我正在尝试为无服务器架构进行本地开发设置。亚马逊提供SAM本地测试版。但在我的项目中我们使用的是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本地。

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

5 个答案:

答案 0 :(得分:6)

SAM Local工具在Docker容器中运行Lambda函数。 localhost将无法从容器内部解析为主机IP。

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

在其他操作系统上,您可以在docker0网络接口中查找主机的IP,并将其用作数据库主机。例如,请参阅:From inside of a Docker container, how do I connect to the localhost of the machine?

答案 1 :(得分:2)

我可以验证在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地址(在Linux上使用ip addr show查找)。通常为172.17.0.1。但是,这些都不对我有用。

答案 2 :(得分:1)

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

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

const con = require('serverless-mysql')({
  config: {
   host     :  'docker.for.win.localhost',
   database : 'db-name',
   user     : 'root',
   connectTimeout : 5000,
   password : ''
 }
}); 

答案 3 :(得分:1)

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

我有一个在本地运行的 MySQL 数据库不在 docker 容器中。要连接到它,我必须为 WSL 启用 docker,请参阅 here

此后,我将 host 设置为 host.docker.internal 而不是 localhost。由于我的数据库现在在后台运行,我能够在运行 sam buildsam local invoke 后连接到它,在必要时没有额外的命令行参数

如果你想测试它的一小段

import mysql.connector

cnx = mysql.connector.connect(user='XXX', password='AAA',
                              host='host.docker.internal',
                              port=3306,
                              database='YYY')
cnx.close()

答案 4 :(得分:0)

我的问题是在SAM本地有可能吗? 是的,您可以在SAM本地运行Lambda等,SAM本地通过在docker容器中运行来提供环境。

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

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

也可以连接到mysql,无需在容器中运行mysql。