При попытке подключиться к моей базе данных красного смещения с помощью AWS lambda (используя psycopg2) я получаю сообщение об ошибке:
psycopg2.OperationalError: FATAL: сбой аутентификации по паролю для пользователя "IAM: имя_пользователя" `
У меня есть пользователь get_cluster_credentials()
для получения временного пароля.
Я использую -
- Python 3,6
- BOTO3
- Psycopg2
Что делает код
- Получает временные учетные данные кластера. (Эта часть отлично работает)
def lambda_handler(event, context):
logger = logging.getLogger(__name__)
RS_PORT = ****
RS_USER = 'u_name'
DATABASE = 'd_name'
CLUSTER_ID = 'cluster_name'
RS_HOST = '******.redshift.amazonaws.com'
client = boto3.client('redshift')
cluster_creds = client.get_cluster_credentials(DbUser=RS_USER,
DbName=DATABASE,
ClusterIdentifier=CLUSTER_ID,
DurationSeconds=3600,
AutoCreate=False)
Использует временный пароль для подключения к базе данных красного смещения. (Здесь происходит сбой модуля)
pwd = cluster_creds['DbPassword']
try:
print('##Connecting')
conn = psycopg2.connect(
host=RS_HOST,
port=RS_PORT,
user=cluster_creds['DbUser'],
password=pwd,
database=DATABASE
)
print('##done')
return conn
except psycopg2.Error:
logger.exception('Failed to open database connection.')
Сообщение об ошибке
[ERROR] 2020-03-18T18:36:34.767Z 06695718-5f6a-4a0d-92c8-8f1dd9870215 Failed to open database connection.
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 29, in lambda_handler
database=DATABASE
File "/var/task/psycopg2/__init__.py", line 130, in connect
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: FATAL: password authentication failed for user "IAM:*****"
END RequestId: 06695718-5f6a-4a0d-92c8-8f1dd9870215
REPORT RequestId: 06695718-5f6a-4a0d-92c8-8f1dd9870215 Duration: 1345.97 ms Billed Duration: 1400 ms Memory Size: 128 MB Max Memory Used: 74 MB Init Duration: 177.92 ms
Отправка скомпилированного кода для Цель отдыха -
import json
import boto3
import logging
import psycopg2
def lambda_handler(event, context):
logger = logging.getLogger(__name__)
RS_PORT = 5439
RS_USER = '****'
DATABASE = '***'
CLUSTER_ID = '********'
RS_HOST = '************************.redshift.amazonaws.com'
client = boto3.client('redshift')
cluster_creds = client.get_cluster_credentials(DbUser = RS_USER,
DbName = DATABASE,
ClusterIdentifier = CLUSTER_ID,
DurationSeconds = 3600,
AutoCreate = False)
print(cluster_creds)
pwd = cluster_creds['DbPassword']
try:
print('##Connecting')
conn = psycopg2.connect(
host = RS_HOST,
port = RS_PORT,
user = cluster_creds['DbUser'],
password = pwd,
database = DATABASE
)
print('##done')
return conn
except psycopg2.Error:
logger.exception('Failed to open database connection.')
Обновление-1
Роли и политики выглядели отлично. Так что, на данный момент, я не думаю, что проблема заключается в ролях и политике.
Update-2
Я настроил EC2 с этим лямбда-кодом на том же VP C, что и мой кластер RS. Соединение прошло успешно, и я мог запросить базу данных. Странно!
Я в значительной степени застрял и был бы признателен за любую подсказку по этому вопросу.
Спасибо! :)