AccessDeniedException:用户无权执行:lambda:InvokeFunction


77

我正在尝试从节点调用lambda函数。

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

密钥适用于IAM用户。用户必须AWSLambdaExecuteAWSLambdaBasicExecutionRole附加政策。

我收到权限错误: 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

我阅读了文档和几个博客,但无法授权该用户调用lambda函数。如何让该用户调用lambda?

谢谢。


我衷心希望有一个AWS CLI或Web界面来解决此问题。aws add-access“ AccessDeniedException:用户:ARN ...无权执行:对资源的操作:ARN ...”可能会提示您一些描述性问题,并添加访问角色。
kwerle

Answers:


105

AWSLambdaExecuteAWSLambdaBasicExecutionRole不提供在错误中表达的权限。这两个托管策略均设计为附加到Lambda函数本身,因此与这些策略一起运行

该错误表明运行nodejs程序的用户没有启动Lambda函数的权限。

您需要授予您的IAM用户lambda:InvokeFunction权限:

  1. 在IAM管理控制台中找到您的用户,然后单击它。
  2. 在“权限”选项卡上,展开“内联策略”部分,然后单击“单击此处”链接以添加策略”。
  3. 选择一个“自定义策略”。
  4. 给您的保单起一个名字。可以是任何东西。
  5. 将此策略放在“策略文档”字段中。

样本政策:

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

在此策略中,我包括了两种调用lambda方法的方法。

更新:

现在,还有一个名为IAM托管策略AWSLambdaRole,您可以将其分配给您的IAM用户或IAM角色。这应该为您提供所需的权限。


3
这对我不起作用,我必须使用“ lambda:*”。换句话说,必须用大铁锤敲打它!
Christopher Grigg

14
对于您正在执行的操作,无需创建自定义策略。您可以在用户个人资料上添加AWSLambdaRole作为托管策略,仅此而已。
nunob

4
我尝试添加自定义策略和附加“ AWSLambdaRole”,但是我仍然收到AccessDeniedException:<USER>没有执行权限:lambda:InvokeFunction
Jim

@lusocoding对我有用,请告诉我您是否将其发布为自己的答案;)
guival

1
对我的作品,但它采取了一些分钟到一个小时的变化生效之前
kebbbnnn

13

我正在使用Serverless框架,并且还必须arn:aws:lambda在serverless.yml中作为资源添加才能使用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

这为我解决了这个问题(其他答案都没有对我有用)。
Juan M. Molina

8

此解决方案为我工作:

  1. 从策略列表中附加AWSKeyManagementServicePowerUser策略(没有出现关于“ iam:listRole”的错误)

  2. 添加lambda:ListFunctions到@Matt Houser定义的自定义策略

    {“版本”:“ 2012-10-17”,“声明”:[{“ Sid”:“ Stmt1464440182000”,“ Effect”:“允许”,“ Action”:[“ lambda:InvokeAsync”,“ lambda:InvokeFunction “, ” lambda:ListFunctions“ ],”资源“:[” *“]}]}


5

转到IAM,选择用户,然后单击添加权限。在权限列表中,您可以简单地搜索所有带有lambda的策略,并选中所需的策略,以便从控制台执行lambda。 输入AWS IAM权限



2

我通过向AWSLambdaFullAccess用户添加权限解决了这一问题。

  1. 在“ IAM用户”中,单击“添加权限”
  2. 选择“直接附加现有策略”
  3. 搜索AWSLambdaFullAccess,选择它,然后单击next:review页面底部的。
  4. 请点击 Add Permissions

那应该做到的。


1
我必须添加“ AWSCodeDeployRoleForLambda”
Keith Norman

同意@KeithNorman,仅AWSLambdaFullAccess并不是为我做的。
dstudeba '19

0

这对我有用:

{
    "Sid": "PermissionToInvoke",
    "Effect": "Allow",
    "Action": [
      "lambda:InvokeFunction"
    ],
    "Resource": "arn:aws:lambda:*:*:*:*"
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.