没有授权用户执行: lambda: InvokeFunction

我尝试从 node 调用一个 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);
});

The keys are for an IAM user. The user has AWSLambdaExecute and AWSLambdaBasicExecutionRole policies attached.

我得到一个许可错误: 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

I read the docs and several blogs, but I'm unable to authorise this user to invoke the lambda function. How do get this user to invoke lambda?

160099 次浏览

The AWSLambdaExecute and AWSLambdaBasicExecutionRole do not provide the permissions that are being expressed in the error. Both of these managed policies are designed to be attached to your Lambda function itself, so 它能跑 with these policies.

这个错误是说运行 nodejs 程序的用户没有启动 Lambda 函数的权限。

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

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

政策样本:

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

在这个策略中,我包含了两个调用 lambda 方法的方法。

更新:

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

这个方法对我很有效:

  1. Attaching AWSKeyManagementServicePowerUser policy from the Policy list (没有这个列表,我在“ iam: listRole”上得到了一个错误)

  2. Adding lambda:ListFunctions to the custom policy defined by @ Matt Houser

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

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

  1. 在 IAM 用户中,单击添加权限
  2. Select "Attach existing policies directly"
  3. 搜索 AWSLambdaFullAccess,选择它并单击页面底部的 next:review
  4. Add Permissions

这样就行了。

转到 我是,选择用户并单击 “添加权限”。 在权限列表中,您可以简单地使用 lambda 搜索所有这些策略,并检查您想要的策略,以便从控制台执行 lambda。

enter AWS IAM permissions

如果只使用 AWS 提供的策略,则必须将策略提供给用户或其所属的组 Policy from AWS

我正在使用 Serverless framework,为了使用 lambda.invoke,我还必须在 serverless. yml 中添加 arn:aws:lambda作为资源。

 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

这对我很有效:

{
"Sid": "PermissionToInvoke",
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction"
],
"Resource": "arn:aws:lambda:*:*:*:*"
}