Ошибка аутентификации по паролю для пользователя: AWS Лямбда в Redshift - PullRequest
0 голосов
/ 19 марта 2020

При попытке подключиться к моей базе данных красного смещения с помощью AWS lambda (используя psycopg2) я получаю сообщение об ошибке:

psycopg2.OperationalError: FATAL: сбой аутентификации по паролю для пользователя "IAM: имя_пользователя" `

У меня есть пользователь get_cluster_credentials() для получения временного пароля.

Я использую -

  1. Python 3,6
  2. BOTO3
  3. Psycopg2

Что делает код

  1. Получает временные учетные данные кластера. (Эта часть отлично работает)
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. Соединение прошло успешно, и я мог запросить базу данных. Странно!

Я в значительной степени застрял и был бы признателен за любую подсказку по этому вопросу.

Спасибо! :)

Ответы [ 2 ]

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

Фон

Этот вариант полезен для вас, если вы уверены, что -

  1. Вы правильно настроили роли IAM.
  2. Ваш VP C Конфигурации идеальны, но вы не можете подключиться к базе данных RS.

Решение

Итак, в конце концов я обнаружил, что используемая мной сборка psycopg2 - не была совместим с AWS лямбда-функцией . Итак, вот что я сделал -

  • Установил psycopg2 с помощью pip. Убедитесь, что вы делаете этот шаг, используя linux OS , поскольку в среде выполнения лямбды используется Linux.
pip3 install psycopg2 -t ./
  • Создан пакет развертывания для лямбды и загружен в вашу лямбду.

Надеюсь, это поможет другим. Ура! :)

PS- Использование Linux для сборки пакета psycopg - ключ.

0 голосов
/ 19 марта 2020

Я полагаю, вы неправильно настроили политику ресурсов в кластере красных смещений.

У него должны быть необходимые разрешения для использования get_cluster_credentials

Пожалуйста, обратитесь по этой ссылке, чтобы установить соответствующие разрешения кластера, чтобы разрешить вызов API https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-identity-based.html#redshift resources.getclustercredentials-под политикой-ресурсы

...