Доступ к API AWS из лямбда-функции?

Я пишу свою первую лямбда-функцию (на Python), и меня немного смущает то, как учетные данные должны работать в среде лямбда. Я пытаюсь получить секрет (для доступа к базе данных Aurora) из api секретов aws, используя их примерный код, который выглядит примерно так (я вырезал всю обработку ошибок для краткости):

def get_secret():
    secret_name = 'dbtest-postgres-secret'
    region_name = 'us-east-2'

    session = boto3.session.Session()                                                                                                                                                          
    client = session.client(                                                                                                                                                                   
        service_name='secretsmanager',                                                                                                                                                         
        region_name=region_name                                                                                                                                                                
    )                                                                                                                                                                                          

    get_secret_value_response = client.get_secret_value(                                                                                                                                   
        SecretId=secret_name                                                                                                                                                               
    )                                                                                                                                                                                      

    secret = get_secret_value_response['SecretString']

    return secret

Это отлично работает локально в среде, в которой у меня есть обычные учетные данные AWS, но возвращает None без каких-либо ошибок при работе как часть лямбда-функции. Я использую это так:

def handler(event, context):
    secret = get_secret()
    assert secret is not None

И он терпит неудачу в этом assert заявлении:

{
  "errorType": "AssertionError",
  "stackTrace": [
    "  File \"/var/task/dbtest.py\", line nn, in handler\n    assert secret is not None\n"
  ]
}

Я предполагал, что, назначив роль лямбда-функции с соответствующими разрешениями (AmazonRDSDataFullAccess, включая разрешения на доступ к диспетчеру секретов), все будет установлено. Нужно ли мне предоставлять явные учетные данные (например, ключ доступа и секрет) для лямбда-функции?


person larsks    schedule 05.02.2020    source источник
comment
Мне интересно, почему вы не видели AccessDeniedError.   -  person committedandroider    schedule 06.02.2020


Ответы (1)


Вам не нужно указывать явные учетные данные, лямбда получит учетные данные из роли, которую вы ей назначили. Какой секрет вы запрашиваете, потому что AmazonRDSDataFullAccess имеет доступ только к секретам в rds-db-credentials/*.

person Jason Wadsworth    schedule 05.02.2020
comment
Секрет называется dbtest-postgres-secret. Вы хотите сказать, что имя должно начинаться с rds-db-credentials/? - person larsks; 05.02.2020
comment
Это правильно. Чтобы эта конкретная политика работала, вам необходимо это сделать. Если вам нужен другой набор секретов, вы должны указать имя (имена) (или шаблон) в создаваемой вами политике. - person Jason Wadsworth; 05.02.2020
comment
Спасибо, вот и все! - person larsks; 05.02.2020