web-dev-qa-db-fra.com

AccessDeniedException: l'utilisateur n'est pas autorisé à effectuer: lambda: InvokeFunction

J'essaie d'appeler une fonction lambda à partir de noeud.

var aws = require('aws-sdk');
var lambda = new aws.Lambda({
    accessKeyId: 'id',
    secretAccessKey: 'key',
    region: 'us-west-2'
});

lambda.invoke({
    FunctionName: 'test1',
    Payload: JSON.stringify({
        key1: 'Arjun',
        key2: 'kom',
        key3: 'ath'
    })
}, function(err, data) {
    if (err) console.log(err, err.stack);
    else     console.log(data);
});

Les clés sont pour un utilisateur IAM. L'utilisateur a les stratégies AWSLambdaExecute et AWSLambdaBasicExecutionRole attachées.

J'ai une erreur de permission: AccessDeniedException: User: arn:aws:iam::1221321312:user/cli is not authorized to perform: lambda:InvokeFunction on resource: arn:aws:lambda:us-west-2:1221321312:function:test1

J'ai lu la documentation et plusieurs blogs, mais je ne parviens pas à autoriser cet utilisateur à appeler la fonction lambda. Comment amener cet utilisateur à invoquer lambda?

Merci.

49
Arjun Komath

AWSLambdaExecute et AWSLambdaBasicExecutionRole ne fournissent pas les autorisations exprimées dans l'erreur. Ces deux stratégies gérées sont conçues pour être attachées à votre fonction Lambda elle-même. Par conséquent, il s'exécute avec ces stratégies.

L'erreur indique que l'utilisateur sous lequel le programme nodejs est exécuté n'a pas le droit de démarrer la fonction Lambda.

Vous devez donner à votre utilisateur IAM le lambda:InvokeFunction autorisation:

  1. Recherchez votre utilisateur dans la console de gestion IAM et cliquez dessus.
  2. Dans l'onglet "Autorisations", développez la section "Stratégies en ligne", puis cliquez sur le lien "cliquez ici" pour ajouter une stratégie ".
  3. Sélectionnez une "politique personnalisée".
  4. Donnez un nom à votre police. Cela peut être n'importe quoi.
  5. Placez cette politique dans le champ Document de politique.

Exemple de politique:

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

Dans cette stratégie, j'ai inclus les deux méthodes permettant d'invoquer les méthodes lambda.

Mise à jour:

Il existe maintenant également une stratégie gérée IAM nommée AWSLambdaRole que vous pouvez affecter à votre utilisateur IAM ou à votre rôle IAM. Cela devrait vous donner les autorisations dont vous avez besoin.

68
Matt Houser

J'utilise Framework sans serveur , et je devais aussi ajouter arn:aws:lambda comme ressource dans mon serverless.yml pour pouvoir utiliser lambda.invoke.

 iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:DescribeTable
        - dynamodb:Query
        - dynamodb:Scan
        - dynamodb:GetItem
        - dynamodb:PutItem
        - dynamodb:UpdateItem
        - dynamodb:DeleteItem
        - lambda:InvokeFunction # Added this like mentioned above
      Resource:
        - arn:aws:dynamodb:us-east-1:*:*
        - arn:aws:lambda:us-east-1:*:* # Had to add this too
5
Jessica Bee

Cette solution a fonctionné pour moi:

  1. Attaching AWSKeyManagementServicePowerUser stratégie de la liste des stratégies (sans que je ne reçois une erreur sur "iam: listRole")

  2. Ajout de lambda: ListFunctions à la stratégie personnalisée définie par @Matt Houser

    {"Version": "2012-10-17", "Statement": [{"Sid": "Stmt1464440182000", "Effet": "Autoriser", "Action": ["lambda: InvokeAsync", "lambda: InvokeFunction ", " lambda: ListFunctions "]," Ressource ": [" * "]}]}

5
Ali Nem

Si vous utilisez uniquement les stratégies fournies par AWS, vous devez donner à l'utilisateur ou au groupe auquel il appartient Policy from AWS

3

allez dans IAM, sélectionnez l'utilisateur et cliquez sur ajouter des autorisations. Dans la liste des autorisations, vous pouvez simplement rechercher toutes les stratégies avec lambda et cocher celles que vous souhaitez pour exécuter le lambda à partir de la console. enter AWS IAM permissions

2
mykey

J'ai résolu ce problème en ajoutant les autorisations AWSLambdaFullAccess à l'utilisateur.

  1. Dans Utilisateurs IAM, cliquez sur Ajouter des autorisations.
  2. Sélectionnez "Joindre les stratégies existantes directement"
  3. Recherchez AWSLambdaFullAccess, sélectionnez-le et cliquez sur next:review au bas de la page.
  4. Cliquez sur Add Permissions

Et cela devrait le faire.

0
Enda Molloy