Назад | Перейти на главную страницу

Разрешить другим сервисам AWS вызывать Lambda с помощью IAM

Можно ли предоставить сервисам AWS (например, шлюзу API, Secrets Manager) разрешение на вызов функции Lambda, используя только роли IAM? Обычно это делается в политике функции (политика на основе ресурсов), но мне интересно, является ли это единственным способом. Преимущество использования IAM заключается в том, что одна политика позволяет выполнять несколько лямбда-выражений без дополнительных затрат на управление одной политикой для каждой функции. (Обратите внимание, что я не спрашиваю о ролях выполнения Lambda IAM +, которые определяют разрешения как выполняемую функцию.)

Документация по Модель разрешений лямбда предполагает, что роли IAM могут использоваться вместо политик функций лямбда:

Вместо использования политики функции Lambda вы можете создать другую роль IAM, которая предоставляет источникам событий (например, Amazon S3 или DynamoDB) разрешения на вызов вашей функции Lambda. Однако вы можете обнаружить, что политики ресурсов проще настроить, и они упрощают отслеживание источников событий, имеющих разрешения на вызов вашей лямбда-функции.

Однако в моих раскопках я не смог добиться заявленного эффекта. Я попытался предоставить двум двум службам разрешение на вызов Lambdas: шлюз API и диспетчер секретов. В обоих случаях я обнаружил, что эти службы требуют предоставления доступа в рамках политики функций, а не роли IAM.

Услуга 1: Менеджер секретов

Я чередую учетные данные RDS в Secrets Manager. Обычно 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

An error occurred (AccessDeniedException) when calling the RotateSecret operation: Secrets Manager cannot invoke the specified Lambda function. Ensure that the function policy grants access to the principal secretsmanager.amazonaws.com

Таким образом, похоже, что диспетчер секретов не использует эту роль IAM для вызова лямбда-выражения. И, похоже, нет способа настроить Secrets Manager для использования определенной роли IAM.

Сервис 2: API-шлюз

Я использую API Gateway для вызова своей лямбда-функции. API Gateway имеет два разных типа интеграции, которые поддерживают вызов Lambda: (1) Lambda-функция и (2) AWS Service (https://docs.aws.amazon.com/apigateway/latest/developerguide/integrating-api-with-aws-services-lambda.html).

При использовании интеграции лямбда-функций происходит та же история, что и с Secrets Manager - вам нужно использовать политики функций для предоставления доступа к API-шлюзу. Но с интеграцией сервисов AWS вы фактически указываете, какую роль IAM API Gateway следует использовать для вызова Lambda. Для меня это имеет смысл, потому что как такая служба, как API Gateway, узнает, какую роль IAM использовать для вызова Lambda? Однако нет возможности выбрать роль IAM при использовании интеграции лямбда-функции. Или есть ...


Кросс-размещено на: 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