Вопрос или проблема
Возможно ли предоставить AWS сервисам (например, API Gateway, Secrets Manager) разрешение на вызов функции Lambda, используя только IAM роли? Обычно это делается в политике функции (политика на основе ресурса), но мне интересно, является ли это единственным способом. Преимущество использования IAM заключается в том, что одна политика может разрешить выполнение нескольких Lambdas, без излишней нагрузки на управление одной политикой для каждой функции. (Обратите внимание, что я не спрашиваю о IAM ролях для Lambda +execution+, которые определяют разрешения как выполняемой функции.)
Документация о модели разрешений Lambda предполагает, что IAM роли могут использоваться вместо политик функций Lambda:
Вместо использования политики функции Lambda вы можете создать другую IAM роль, которая предоставляет источникам событий (например, Amazon S3 или DynamoDB) разрешения на вызов вашей функции Lambda. Тем не менее, вы можете обнаружить, что политики ресурсов легче настраивать, и это упрощает отслеживание того, какие источники событий имеют разрешения на вызов вашей функции Lambda.
Тем не менее, в ходе моего исследования я не смог достичь рекламируемого эффекта. Я пытался предоставить двум сервисам разрешение на вызов Lambdas: API Gateway и Secrets Manager. В обоих случаях я обнаружил, что этим сервисам требуется разрешение, предоставленное в политике функции, а не в IAM роли.
Сервис 1: Secrets Manager
Я ротацию учетных данных RDS в Secrets Manager. Обычно Secrets Manager создает Lambdas для выполнения ротации, как только вы настраиваете расписание ротации секрета, но в моем случае мне не понравились длинные нестандартные имена функций Lambda, и я создал свои собственные. Я попытался предоставить Secrets Manager разрешение на вызов любой Lambda, используя IAM роли, и создал следующую роль:
Отношение доверия:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowApiGatewayToAssumeRole",
"Effect": "Allow",
"Principal": {
"Service": "apigateway.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
Разрешения:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowInvokeAnyLambda",
"Effect": "Allow",
"Action": "lambda:InvokeFunction",
"Resource": "*"
}
]
}
На момент написания этой статьи в консоли AWS нет возможности установить пользовательскую Lambda для ротации учетных данных RDS, поэтому я использовал CLI:
$ aws secretsmanager rotate-secret --secret-id 'rds/my-db/account' --rotation-lambda-arn 'arn:aws:lambda:us-east-1:xxxxxxxxxxxx:function:rotate-rds-secret' --rotation-rules AutomaticallyAfterDays=1
Произошла ошибка (AccessDeniedException), когда вызывалась операция RotateSecret: Secrets Manager не может вызвать указанную Lambda функцию. Убедитесь, что политика функции предоставляет доступ главному пользователю secretsmanager.amazonaws.com
Таким образом, похоже, что Secrets Manager не использует эту IAM роль для вызова Lambda. И, похоже, нет способа настроить Secrets Manager для использования конкретной IAM роли.
Сервис 2: API Gateway
Я использую API Gateway для вызова своей функции Lambda. API Gateway имеет два разных типа интеграции, которые поддерживают вызов Lambda: (1) Функция Lambda и (2) AWS Сервис (https://docs.aws.amazon.com/apigateway/latest/developerguide/integrating-api-with-aws-services-lambda.html).
При использовании интеграции функции Lambda ситуация такая же, как и с Secrets Manager — вам нужно использовать политики функций, чтобы предоставить API Gateway доступ для вызова. Но с интеграцией AWS Сервиса вы фактически указываете, какую IAM роль API Gateway должен использовать для вызова Lambda. Это имеет смысл, потому что как служба, такая как API Gateway, может знать, какую IAM роль использовать для вызова Lambda? Тем не менее, нет возможности выбрать IAM роль при использовании интеграции с функцией Lambda. Или есть…
Перепост на: https://forums.aws.amazon.com/message.jspa?messageID=844660#844660
Если я правильно понял. Вы ищете IAM роль для использования в интеграции LambdaProxy. LambdaProxy действительно позволяет использовать IAM роль. Вот фрагмент, который я использую:
Resources:
APILambdaInvokeRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
Service:
- "apigateway.amazonaws.com"
Action:
- "sts:AssumeRole"
APILambdaInvokePolicy:
Type: AWS::IAM::Policy
Properties:
PolicyName: LambdaInvokePolicy
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action: "lambda:InvokeFunction"
Resource: "*"
Roles:
- !Ref APILambdaInvokeRole
Ответ или решение
Вопрос о том, возможно ли предоставить другим сервисам AWS (таким как API Gateway и Secrets Manager) разрешение на вызов функции Lambda только с использованием IAM-ролей, действительно требует тщательного рассмотрения.
Разрешение на вызов Lambda с помощью IAM
В общем случае, согласно документации AWS, разрешения на вызов функции Lambda традиционно управляются через политику ресурсов (resource-based policy), которую необходимо настроить непосредственно для самой функции. Однако существуют способы использовать IAM-роли для обеспечения доступа к Lambda, особенно когда вы хотите предоставить разрешения для нескольких функций в одном месте.
1. Secrets Manager
Вы упомянули, что пытались настроить IAM-роль, чтобы разрешить Secrets Manager вызывать вашу функцию Lambda. Однако на текущий момент Secrets Manager требует, чтобы политика функции явно предоставляла разрешение для вызова из secretsmanager.amazonaws.com
, как вы уже заметили в своём опыте. Следовательно, для Secrets Manager необходимо использовать политику ресурса функции Lambda.
Пример настройки политики ресурса для функции Lambda:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "secretsmanager.amazonaws.com"
},
"Action": "lambda:InvokeFunction",
"Resource": "arn:aws:lambda:us-east-1:xxxxxxxxxxxx:function:rotate-rds-secret"
}
]
}
К сожалению, на данный момент нет возможности настроить IAM-роль для Secrets Manager, чтобы обойти необходимость использования политики ресурса.
2. API Gateway
Когда речь идет о API Gateway, действительно существуют два типа интеграции: интеграция с функцией Lambda и интеграция с AWS Service.
При использовании интеграции с функцией Lambda, вы должны явно предоставить разрешение через политику ресурсов функции Lambda. Пример настройки политики ресурса:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "apigateway.amazonaws.com"
},
"Action": "lambda:InvokeFunction",
"Resource": "arn:aws:lambda:us-east-1:xxxxxxxxxxxx:function:your-function-name"
}
]
}
Тем не менее, при использовании интеграции AWS Service API Gateway позволяет задавать IAM-роль. Это позволяет указать IAM-роль, которая будет использоваться API Gateway для вызова вашей функции Lambda, но это делается только в рамках интеграции AWS Service.
Заключение
К сожалению, на сегодняшний день совместное использование IAM-ролей для вызова функции Lambda другими сервисами AWS, такими как Secrets Manager и API Gateway через прямую интеграцию Lambda, не полностью возможно без использования политики ресурсов функции. Вам придется использовать политики ресурсов для управления доступом, чтобы обеспечить безопасность вызовов, даже если это может создавать некоторую избыточность.
Тем не менее, для API Gateway при интеграции AWS Service действительно можно использовать IAM-ролю, но это не так гибко, как хотелось бы для всех сценариев. Надеюсь, это проясняет ситуацию и помогает вам лучше понять, как настроить разрешения для вызова функций Lambda.