Как подключить Lambda в VPC к RDS?

Для этого есть несколько вопросов/ответов, но ни одно из решений не работает.

Моя текущая настройка:

  • Lambda (со средой выполнения python 2.7) в VPC
  • Экземпляр RDS (postgres) в том же VPC
  • Роль Lambda имеет политику чтения/записи для определенных корзин S3 и AWSLambdaVPCAccessExecutionRole.
  • Таблица маршрутов подсети Lambda имеет доступ к локальным IP-адресам и к конечной точке VPC для S3.
  • Таблица маршрутов подсети RDS имеет доступ к локальным IP-адресам
  • Группа безопасности Lambda (SG) имеет входящие и исходящие правила для конечной точки Postgres и VPC.
  • RDS SG имеет входящие и исходящие правила для идентификатора Lambda SG.

Я использую для подключения psycopg2, который находится в моем файле requirements.txt. Я попробовал простой запрос SELECT, как показано ниже:

conn = psycopg2.connect(dbname=os.environ['DB_NAME'], user=os.environ['USERNAME'], password=os.environ['PASSWORD'])
cursor = conn.cursor()
query = "SELECT * from {};".format(os.environ['TABLE'])
cursor.execute(query)
records = cursor.fetchall()

Что дает мне ошибку:

could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
: OperationalError
Traceback (most recent call last):
File "/var/task/mylambda.py", line 31, in call
conn = psycopg2.connect(dbname=os.environ['DB_NAME'], 
user=os.environ['USERNAME'], password=os.environ['PASSWORD'])
File "/tmp/sls-py-req/psycopg2/__init__.py", line 130, in connect
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)

Что мне не хватает? Как я могу успешно подключиться к RDS из моей Lambda? Спасибо!


person Katherine    schedule 04.04.2018    source источник
comment
Если вы запустите это на экземпляре EC2 в той же подсети, что и функция Lambda, и с той же SG, сможете ли вы подключиться?   -  person jarmod    schedule 04.04.2018
comment
В вашем фрагменте кода не отображаются значения для host или port в вызове connect(). Вы просто не скопировали их в вопрос или их нет в вашем реальном коде?   -  person kdgregory    schedule 04.04.2018
comment
@kdgregory о боже, ты прав! Я добавлю это и посмотрю, исправит ли это это.   -  person Katherine    schedule 04.04.2018
comment
@kdgregory вот оно! Я смотрел на это слишком долго и полностью пропустил это. У меня даже хост был включен в переменные среды, но я не думал, что он отсутствует в моем коде. Спасибо!   -  person Katherine    schedule 04.04.2018
comment
@Katherine, раздача здесь была в сообщении об ошибке ... Is the server running locally and accepting connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"? ... это дает вам две части информации, которые указывают, что ваш код не пытался подключиться к отдельному серверу: сервер работает локально? Вы не пытались подключиться к локальному серверу, вы пытались подключиться к удаленному... и сокет домена unix никогда не соединяет вас с другим компьютером, только с локальным.   -  person Michael - sqlbot    schedule 05.04.2018
comment
Это имеет смысл @Michael-sqlbot, спасибо за это объяснение.   -  person Katherine    schedule 05.04.2018