#amazon-web-services #lambda #credentials
Вопрос:
Итак, я нахожусь внутри функции AWS lambda. Мне нужно вернуть временные учетные данные из конечной точки API, чтобы можно было выполнить загрузку из браузера непосредственно в S3.
Файлы могут быть очень большими, сотни гигабайт, поэтому кредитных карт должно хватить надолго. Каков самый простой способ получить такие сертификаты внутри лямбды?
Комментарии:
1. Как правило, Lambda не использует cred для вызова операций службы AWS. Вместо этого Lambda использует роль IAM, у которой есть разрешения на вызов данной службы, Из вашего заявления вы, похоже, хотите загрузить файл в корзину Amazon S3. Есть и другие способы сделать это вместо того, чтобы раскрывать кредитные карты. Один из вариантов-использовать предварительно подписанный URL-адрес. (Однако я никогда не пытался загружать файлы такого размера, как вы описываете)
Ответ №1:
Короткий ответ состоит в том, что вам нужно взять на себя роль, как я описываю в этом посте в блоге. Ключевой частью этого поста является использование политики сеанса для ограничения предполагаемой роли одним ключом в S3.
Однако, если загрузка файла займет более часа, это решение не будет работать в написанном виде, потому что Лямбда-код не может взять на себя другую роль с запрошенной продолжительностью > один час (см. >цепочка ролей), ограничение, которое нельзя увеличить.
Это означает, что вам необходимо создать пользователя, который может взять на себя эту роль, и предоставить долгосрочные учетные данные этого пользователя для Lambda (обычно через Менеджер секретов). Как только вы получите эти учетные данные, используйте их для создания клиента STS (вы не говорите, какой язык используете, а я обычно использую Python, так что это то, что показано).:
sts_client = boto3.client(
'sts',
aws_access_key_id=stored_access_key,
aws_secret_access_key=stored_secret_key)
Затем с этими учетными данными вы можете взять на себя роль, которая может записывать данные в файл. В соответствии с сообщением в блоге базовая роль имеет разрешения на запись в любой файл в S3, а политика сеанса ограничивает предполагаемую роль конкретным файлом:
session_policy = json.dumps({
'Version': '2012-10-17',
'Statement': [
{
'Effect': 'Allow',
'Action': 's3:PutObject',
'Resource': f"arn:aws:s3:::{BUCKET}/{KEY}"
}
]
})
response = sts_client.assume_role(
RoleArn=ASSUMABLE_ROLE_ARN,
RoleSessionName="example",
Policy=session_policy,
DurationSeconds=12 * 3600
)
# these are the credentials that you'd pass to the client application
limited_access_key = response['Credentials']['AccessKeyId']
limited_secret_key = response['Credentials']['SecretAccessKey']
limited_session_token = response['Credentials']['SessionToken']
12 часов достаточно для передачи 500 ГБ при скорости соединения 100 Мбит/с. Если вам потребуется больше времени, чем это, вам придется создать реального пользователя и вернуть его учетные данные. Вы можете прикрепить встроенную политику к этому пользователю, чтобы ограничить его доступ к одному файлу (служит той же цели, что и политика сеанса в этом примере). Но поскольку у вас в учетной записи ограничено 5000 пользователей IAM, это не то, что вы хотите делать на регулярной основе.
Комментарии:
1. Я отметил ваш ответ как принятый. Это не совсем то, что я сделал, но это сработало бы так же хорошо. В итоге мы создали пользователя IAM, создали клиент STS, а затем получили объединенный токен, в котором мы могли указать секунды действия токена, а также мощную политику безопасности IAM, чтобы заблокировать его очень конкретно.