AccessDeniedException: Der Benutzer ist nicht berechtigt, Folgendes auszuführen: lambda: InvokeFunction


74

Ich versuche, eine Lambda-Funktion vom Knoten aus aufzurufen.

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 AWSLambdaExecuteund AWSLambdaBasicExecutionRoleRichtlinien angehängt.

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 habe die Dokumente und mehrere Blogs gelesen, kann diesen Benutzer jedoch nicht zum Aufrufen der Lambda-Funktion autorisieren. Wie kann dieser Benutzer Lambda aufrufen?

Vielen Dank.


Ich wünschte von Herzen, es gäbe eine aws cli oder ein Webinterface, um dies zu beheben. aws add-access "AccessDeniedException: Benutzer: ARN ... ist nicht berechtigt auszuführen: AKTION für Ressource: ARN ..." fordert Sie möglicherweise mit einigen Beschreibungsfragen auf und fügt die Zugriffsrollen hinzu.
Kwerle

Antworten:


98

Die AWSLambdaExecuteund AWSLambdaBasicExecutionRolegeben nicht die Berechtigungen an, die im Fehler ausgedrückt werden. Diese beiden verwalteten Richtlinien können an Ihre Lambda-Funktion selbst angehängt werden, sodass sie mit diesen Richtlinien ausgeführt werden.

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

Sie müssen Ihrem IAM-Benutzer die lambda:InvokeFunctionBerechtigung erteilen :

  1. Suchen Sie Ihren Benutzer in der IAM-Verwaltungskonsole und klicken Sie darauf.
  2. Erweitern Sie auf der Registerkarte "Berechtigungen" den Abschnitt "Inline-Richtlinien" und klicken Sie auf den Link "Hier klicken", um eine Richtlinie hinzuzufügen.
  3. Wählen Sie eine "Benutzerdefinierte Richtlinie".
  4. Geben Sie Ihrer Richtlinie einen Namen. Es kann alles sein.
  5. Fügen Sie diese Richtlinie in das Feld Richtliniendokument ein.

Beispielrichtlinie:

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

In diese Richtlinie habe ich beide Methoden zum Aufrufen von Lambda-Methoden aufgenommen.

Aktualisieren:

Es gibt jetzt auch eine verwaltete IAM-Richtlinie mit dem Namen AWSLambdaRole, die Sie Ihrem IAM-Benutzer oder Ihrer IAM-Rolle zuweisen können. Dies sollte Ihnen die Berechtigungen geben, die Sie benötigen.


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

11
Für das, was Sie tun, müssen Sie keine benutzerdefinierte Richtlinie erstellen. Sie können AWSLambdaRole als verwaltete Richtlinie zum Benutzerprofil hinzufügen und fertig.
Nunob

3
Ich habe versucht, sowohl benutzerdefinierte Richtlinien hinzuzufügen als auch "AWSLambdaRole" anzuhängen, erhalte jedoch weiterhin die AccessDeniedException: <USER> ist nicht berechtigt, Folgendes auszuführen: lambda: InvokeFunction
Jim

@lusocoding, das für mich funktioniert hat, lass es mich wissen, wenn du es als eigene Antwort
postest

Funktioniert für mich, aber es dauerte einige Minuten bis eine Stunde, bis die Änderungen wirksam wurden
kebbbnnn

12

Ich verwende das Serverless Framework und musste es auch arn:aws:lambdaals Ressource in meiner serverless.yml hinzufügen, um es verwenden zu können 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

Dies löste das Problem für mich (keine der anderen Antworten funktionierte für mich).
Juan M. Molina

8

Diese Lösung hat bei mir funktioniert:

  1. Anbringen AWSKeyManagementServicePowerUser Richtlinie aus der Richtlinienliste (ohne dass ich einen Fehler habe auf „iam: listRole“)

  2. Hinzufügen von Lambda: ListFunctions zu der von @Matt Houser definierten benutzerdefinierten Richtlinie

    {"Version": "2012-10-17", "Anweisung": [{"Sid": "Stmt1464440182000", "Effekt": "Zulassen", "Aktion": ["Lambda: InvokeAsync", "Lambda: InvokeFunction" ", " lambda: ListFunctions " ]," Resource ": [" * "]}]}


5

Gehen Sie zu IAM, wählen Sie den Benutzer aus und klicken Sie auf Berechtigungen hinzufügen. In der Liste der Berechtigungen können Sie einfach mit Lambda nach all diesen Richtlinien suchen und die gewünschten überprüfen, um das Lambda über die Konsole auszuführen. Geben Sie die AWS IAM-Berechtigungen ein


4

Wenn Sie nur die von AWS bereitgestellten Richtlinien verwenden, müssen Sie diese dem Benutzer oder der Gruppe, zu der sie gehört, geben Richtlinie von AWS


Das Hinzufügen von "AWSCodeDeploy" hat bei mir funktioniert, als ich Lambda von iOS aus anrief.
Teodor Ciuraru

1

Ich habe dies gelöst, indem ich AWSLambdaFullAccessdem Benutzer die Berechtigungen hinzugefügt habe .

  1. Klicken Sie unter IAM-Benutzer auf Berechtigungen hinzufügen
  2. Wählen Sie "Vorhandene Richtlinien direkt anhängen".
  3. Suchen Sie nach AWSLambdaFullAccess, wählen Sie es aus und klicken Sie next:reviewunten auf der Seite.
  4. Klicken Add Permissions

Und das sollte es tun.


1
Ich musste "AWSCodeDeployRoleForLambda" hinzufügen
Keith Norman

Ich stimme @KeithNorman zu, AWSLambdaFullAccess allein hat es nicht für mich getan.
Dstudeba

0

Das hat bei mir funktioniert:

{
    "Sid": "PermissionToInvoke",
    "Effect": "Allow",
    "Action": [
      "lambda:InvokeFunction"
    ],
    "Resource": "arn:aws:lambda:*:*:*:*"
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.