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

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

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

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

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

Служба 1: диспетчер секретов

Я меняю учетные данные RDS в диспетчере секретов. Обычно 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

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

Служба 2: API-шлюз

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

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


Перекрестная ссылка: https://forums.aws.amazon.com/message.jspa?messageID=844660#844660

2
задан 21 May 2018 в 00:34
1 ответ

Если я правильно понял. Вы ищете роль 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
0
ответ дан 3 December 2019 в 13:58

Теги

Похожие вопросы