2016-05-28 2 views
23

Ich versuche, eine Lambda-Funktion von Knoten aufzurufen.AccessDeniedException: Benutzer ist nicht zum Ausführen berechtigt: Lambda: InvokeFunction

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); 
}); 

Die Schlüssel sind für einen IAM-Benutzer. Der Benutzer hat AWSLambdaExecute und AWSLambdaBasicExecutionRole Richtlinien beigefügt.

Ich erhalte einen Berechtigungsfehler: 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

ich die Dokumentation und mehrere Blogs lesen, aber ich bin nicht in der Lage diesen Benutzer zu ermächtigen, die Lambda-Funktion aufzurufen. Wie kann dieser Benutzer Lambda aufrufen?

Danke.

+0

Ich wünschte von Herzen, es gäbe ein aws CLI oder Web-Interface, um das zu beheben. aws Add-access "AccessDeniedException: Benutzer: ARN ... nicht berechtigt ist, auszuführen: ACTION auf Ressource: ARN ..." vielleicht haben Sie prompt mit ein paar Beschreibung Fragen und fügen Sie die Zugriffsrollen. – kwerle

Antwort

26

Die AWSLambdaExecute und AWSLambdaBasicExecutionRole bieten nicht die Berechtigungen, die in dem Fehler ausgedrückt werden. Diese beiden verwalteten Richtlinien sind so konzipiert, dass sie an Ihre Lambda-Funktion selbst angehängt werden, so dass mit diesen Richtlinien ausgeführt wird.

Der Fehler besagt, dass der Benutzer, unter dem das Programm nodejs ausgeführt wird, keine Berechtigung zum Starten der Lambda-Funktion hat.

Sie benötigen IAM Benutzer die lambda:InvokeFunction Erlaubnis geben:

  1. Finden Sie Ihre Benutzer im IAM Management Console und klicken Sie darauf.
  2. Auf der Registerkarte „Berechtigungen“, die „Inline Policies“ erweitern und klicken Sie auf „hier klicken“ Link eine Richtlinie hinzufügen“.
  3. auswählen‚Custom Policy‘.
  4. Geben Sie Ihre Politik einen Namen. es kann alles sein
  5. Setzen sie diese Politik in der Policy Document Feld

Beispielpolitik:..

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

in dieser Politik, ich inclu haben ded beide Methoden, um Lambda-Methoden aufzurufen.

Update:

Es gibt jetzt auch eine IAM-Managed-Politik genannt AWSLambdaRole, dass Sie Ihre IAM Benutzer oder IAM Rolle zuweisen können. Dies sollte Ihnen die Berechtigungen geben, die Sie benötigen.

+0

Das hat bei mir nicht funktioniert, ich musste "lambda: *" verwenden. Mit anderen Worten musste er mit einem großen Hammer schlagen! –

+8

Für das, was Sie tun, müssen Sie keine benutzerdefinierte Richtlinie erstellen. Sie können AWSLambdaRole als eine verwaltete Richtlinie für das Benutzerprofil hinzufügen und das war's. – lusocoding

+0

Ich habe versucht, sowohl benutzerdefinierte Richtlinie hinzufügen und "AWSLambdaRole", aber ich bekomme immer noch die AccessDeniedException: ist nicht berechtigt, durchzuführen: Lambda: InvokeFunction – Jim

4

Diese Lösung für mich gearbeitet:

  1. Anbringen AWSKeyManagementServicePowerUser Politik aus der Richtlinienliste (ohne dass ich einen Fehler habe auf "iam: listRole")

  2. Hinzufügen Lambda: ListFunctions zu der benutzerdefinierten Richtlinie definiert durch @Matt Houser

    { "Version": "2012.10.17", "Statement": [{ "Sid": "Stmt1464440182000", "Effect": "Erlauben", "Aktion": [ "lambda: InvokeAsync", "lambda: InvokeFunction", "lambda: ListFunctions" ], "Ressource": [ "*" ] } ]}

Verwandte Themen