Конфигурация Conn для аутентификации AWS Lambda Python RDS Postgres IAM - PullRequest
0 голосов
/ 04 октября 2018

Недавно была создана возможность доступа к экземплярам RDS с пользователями и ролями IAM.Я не совсем понимаю, как настроить соединение Python, поскольку я не буду использовать данные аутентификации базы данных с psycopg2.

Теперь я использую вот так:

conn = psycopg2.connect("dbname='%s' user='%s' host='%s' password='%s'" % (db_name, db_user, db_host, db_pass))

Я не знаю, как использовать учетные данные IAM для соединения моей лямбда-функции с аутентификацией IAM.

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 04 октября 2018

Сначала необходимо создать политику IAM и пользователя БД, как описано здесь:

https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.html

Затем необходимо создать роль IAM для вашей функции Lambda и подключить IAMполитика, созданная выше к нему.Ваша функция Lambda должна быть выполнена с этой ролью, чтобы иметь возможность создать временный пароль БД для пользователя БД.

Наконец, вы можете сгенерировать временный пароль для вашего пользователя БД (создан выше) в вашей Lambda.используя следующий фрагмент кода:

from urllib.parse import quote_plus
import boto3

def get_password(rds_hostname, db_user, aws_region=None, url_encoded=True):
    if (not aws_region):
        aws_region = boto3.session.Session().region_name
        if (not aws_region):
            raise Exception("Error: no aws_region given and the default region is not set!")

    rds_port = 5432
    if (":" in rds_hostname):
        split_hostname = rds_hostname.split(":")
        rds_hostname = split_hostname[0]
        rds_port = int(split_hostname[1])

    rds_client = boto3.client("rds")

    password = rds_client.generate_db_auth_token( Region=aws_region,
                                                  DBHostname=rds_hostname,
                                                  Port=rds_port, 
                                                  DBUsername=db_user)
    if url_encoded:
        return quote_plus( password )
    else:
        return password

Не назначайте пароль для переменной.Получайте новый пароль при каждом запуске, так как срок действия пароля ограничен, и ваш Lambda-контейнер не может быть переработан до истечения срока его действия ...

Наконец, создайте строку подключения к БД для любого пакета Python, который вы используете (япредложил бы некоторую чистую реализацию Python, такую ​​как pg8000) из вашего имени хоста RDS, порта, имени пользователя и временного пароля, полученного с помощью функции выше (<user>:<password>@<hostname>:<port>/<db_name>).

Подключение к RDS может быть немного сложным.Если вы не знаете, как правильно настроить VPC, я бы посоветовал вам запустить Lambda вне VPC и подключиться к RDS по общедоступному IP-адресу.

Кроме того, вам, вероятно, потребуется установить SSL-соединение и, возможно,включите файл CA RDS в ваш пакет развертывания Lambda.Точный способ, как это сделать, зависит от того, что вы используете для подключения (я мог бы описать, как это сделать с помощью pymysql и sqlalchemy).

Каждый из этих шагов можно описать в отдельном учебном пособии, нознания о них должно быть достаточно, чтобы вы начали.

Удачи!

...