MySQL база данных внутри Сэм локальный
Я пытаюсь выполнить настройку локальной разработки для серверной архитектуры. Для этого Amazon предоставляет 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.
Я установил образ докера mysql и запустил его. После этого я все еще получаю ту же ошибку.
6 ответов
Инструмент SAM Local запускает вашу функцию Lambda в контейнере Docker. localhost
не разрешит IP-адрес хост-машины из контейнера.
Если вы используете Docker для Mac, вы можете использовать специальное имя DNS docker.for.mac.localhost
в качестве хоста базы данных.
В других операционных системах вы можете посмотреть IP-адрес хоста в docker0
сетевой интерфейс и использовать его в качестве хоста базы данных. Например, см.: Как изнутри контейнера Docker я могу подключиться к локальному узлу машины?
Я могу проверить, что на 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. Однако ни один из них не работал для меня.
Нет необходимости в настройке, просто добавьте ниже хост при подключении к вашему 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 : ''
}
});
Просто добавлю сюда свое решение в виде нескольких смесей. Я разрабатываю в WSL2 Ubuntu 20.04 LTS.
У меня есть база данных MySQL, работающая локально, а не в док-контейнере. Чтобы подключиться к нему, мне пришлось включить докер для WSL, см . здесь.
После этого я поставил свой
host
к
host.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()
Мой вопрос заключается в том, что это возможно в SAM local: да, вы можете запускать Lambda и т. Д. В SAM local, SAM local обеспечивает среду, запуская ее в контейнере Docker.
Поэтому для успешной сборки SAM вам необходимо установить докер на локальный компьютер и выполнить сборку SAM.
После успешной сборки SAM вы можете запустить свою программу. Чтобы подключиться к localhost в Mac, используйте host.docker.internal вместо localhost, если вы используете docker 18.03 или выше, для предыдущих версий docker вы можете использовать docker.for.mac.localhost.
Кроме того, чтобы подключиться к вашему mysql, вам не нужно запускать mysql внутри контейнера.
использовать
hostname -I
команду на терминале, затем используйте IP-адрес хоста, который отображается вместо
localhost
или же
127.0.0.1
Если это не сработает, вы можете продолжить и включить доступ к порту MySQL через брандмауэр, например.
sudo ufw allow 3306
затем перезапустите MySQL
sudo systemctl restart mysql