Не могу записать в базу данных с AWS лямбда - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь записать файлы в базу данных postgres с AWS Lambda, но я сталкиваюсь с ошибкой:

Ошибка вызова действия API вызова с этим сообщением: Ошибка сети

Мой код выглядит следующим образом:

from sqlalchemy import create_engine
import pandas as pd

def test(event=None, context=None):
    conn = create_engine('postgresql://user:password@url:5439/database')

    df = pd.DataFrame([{'A': 'foo', 'B': 'green', 'C': 11},{'A':'bar', 'B':'blue', 'C': 20}])

    df.to_sql('your_table', conn, index=False, if_exists='replace', schema='schema')

test()

Ресурсы: Память - 1280 МБ Тайм-аут - 2 минуты

В чем здесь проблема и как еще можно написать pandas Кадр данных в базу данных с AWS Лямбда?

1 Ответ

0 голосов
/ 19 апреля 2020

Я предполагаю, что экземпляр Postgres находится в RDS.

Является ли ваша лямбда в вашем VP C? Вы можете проверить это на странице функции в консоли администратора, в окне VP C. По умолчанию это не так, и в окне VP C указано «Нет».

Случай 1: лямбда не входит в VP C

Тогда проблема может быть что группа безопасности, связанная с вашим экземпляром RDS, не разрешает подключения извне VP C. Это по умолчанию, если вы не трогали группу безопасности. Найдите группу безопасности для своего экземпляра RDS от администратора RDS, а затем ознакомьтесь с «Правилами входящего трафика» для этой группы безопасности. Лямбды не имеют IP-адреса, поэтому вам нужно добавить правило входящего трафика, разрешающее по крайней мере postgres traffi c для источника "0.0.0.0/0", то есть целое число rnet.

Этого должно быть достаточно, но учтите, что это не очень хорошо для безопасности, поскольку теперь любой теоретически может получить доступ к вашей БД (и хуже, если он сможет угадать пароль). Но в зависимости от вашего проекта это может быть не проблемой для вас. Если это проблема для вас, вы можете вместо этого связать свою лямбду с тем же VP C, в котором находится экземпляр RDS, чтобы обеспечить лучшую сетевую безопасность, и перейти на Случай 2.

Случай 2: лямбда находится в VP C

Я предполагаю, что вы помещаете лямбду в тот же VP C, что и экземпляр RDS для простоты - если нет, вы, вероятно, знаете, что вы ' делает.

Все, что вам нужно сделать сейчас (при условии, что вы не трогали другие сетевые конфигурации), это убедиться, что группа безопасности вашего экземпляра RDS разрешает доступ из группы безопасности вашего lambda. Таким образом, вы можете поместить оба в группу безопасности по умолчанию или в отдельные группы, но убедитесь, что у RDS есть входящее правило, разрешающее лямбда-правило.

Обратите внимание, что если вашему лямбда-серверу также необходимо вызывать внешние службы ( так как вы упоминаете запрос API), для того чтобы включить его, после привязки его к вашему VP C вам также потребуется создать NAT-шлюз, как я описал здесь: { ссылка }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...