Permitir que outros serviços da AWS invoquem o Lambda usando o IAM

2

É possível conceder permissão aos serviços da AWS (por exemplo, gateway de API, Gerenciador de Segredos) para chamar uma função do Lambda usando apenas funções do IAM? Normalmente isso é feito na política da função (política baseada em recursos), mas me pergunto se esse é o único caminho. A vantagem de usar o IAM é que uma política pode permitir que vários Lambdas sejam executados, sem a sobrecarga de gerenciar uma política por função. (Note que não estou perguntando sobre as funções de execução do Lambda IAM + +, que determinam permissões como a função em execução.)

A documentação no Modelo de permissões do Lambda sugere que os papéis do IAM podem ser usado no lugar das políticas de função do Lambda:

Instead of using a Lambda function policy, you can create another IAM role that grants the event sources (for example, Amazon S3 or DynamoDB) permissions to invoke your Lambda function. However, you might find that resource policies are easier to set up and they make it easier for you to track which event sources have permissions to invoke your Lambda function.

Na minha escavação, no entanto, não consegui alcançar o efeito anunciado. Eu tentei conceder permissão a dois dois serviços para invocar o Lambdas: API gateway e Secrets Manager. Em ambos os casos, descobri que esses serviços exigem que o acesso seja concedido dentro da política de função, não uma função do IAM.

Serviço 1: Gerenciador de Segredos

Estou rotando as credenciais do RDS no Gerenciador de Segredos. Normalmente, o Secrets Manager cria o Lambdas para executar a rotação depois de configurar o agendamento de rotação do segredo, mas no meu caso eu não gostei dos longos nomes personalizados das funções do Lambda e criei os meus próprios. Eu tentei conceder permissão ao Secrets Manager para invocar qualquer Lambda usando funções do IAM, então criei a seguinte função:

Relação de confiança:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowApiGatewayToAssumeRole",
      "Effect": "Allow",
      "Principal": {
        "Service": "apigateway.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

Permissões:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowInvokeAnyLambda",
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "*"
        }
    ]
}

No momento da redação deste artigo, o console da AWS não tinha como definir um Lambda personalizado para a rotação de credenciais do RDS, por isso usei a 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

Portanto, parece que o Secrets Manager não usa essa função do IAM para invocar o Lambda. E não parece haver uma maneira de configurar o Secrets Manager para usar uma função específica do IAM.

Serviço 2: gateway de API

Estou usando o API Gateway para chamar minha função do Lambda. O API Gateway possui dois tipos de integração diferentes que suportam a chamada de uma função Lambda: (1) Lambda e (2) AWS Service ( link ).

Ao usar a integração da função Lambda, é a mesma história do Gerenciador de Segredos - você precisa usar políticas de função para conceder acesso de chamada do Gateway de API. Mas, com a integração do AWS Service, você na verdade especifica qual função a gateway da API do IAM deve usar para chamar o Lambda. Isso faz sentido para mim, porque como um serviço como o API Gateway saberia qual função do IAM usar para chamar um Lambda? No entanto, não há como escolher uma função do IAM ao usar a integração da função do Lambda. Ou existe ...

Cross-postado em: link

    
por mxk 24.04.2018 / 02:56

0 respostas