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

Другие вопросы по тегам