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.
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:
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.
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
Cette solution a fonctionné pour moi:
Attaching AWSKeyManagementServicePowerUser stratégie de la liste des stratégies (sans que je ne reçois une erreur sur "iam: listRole")
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 ": [" * "]}]}
J'ai résolu ce problème en ajoutant les autorisations AWSLambdaFullAccess
à l'utilisateur.
AWSLambdaFullAccess
, sélectionnez-le et cliquez sur next:review
au bas de la page.Add Permissions
Et cela devrait le faire.