问题
I'm trying to invoke a lambda function from node.
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.
I get a permission error:
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?
Thanks.
回答1:
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 it runs with these policies.
The error is saying the user under which the nodejs program is running does not have rights to start the Lambda function.
You need to give your IAM user the lambda:InvokeFunction
permission:
- Find your User in the IAM Management Console and click it.
- On the "Permissions" tab, expand the "Inline Policies" section and click the "click here" link to add a policy".
- Select a "Custom Policy".
- Give your policy a name. It can be anything.
- Put this policy in the Policy Document field.
Sample policy:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1464440182000",
"Effect": "Allow",
"Action": [
"lambda:InvokeAsync",
"lambda:InvokeFunction"
],
"Resource": [
"*"
]
}
]
}
In this policy, I have included both methods to invoke lambda methods.
Update:
There is now also an IAM Managed Policy named AWSLambdaRole
that you can assign to your IAM user or IAM role. This should give you the permissions you need.
回答2:
I'm using Serverless framework, and I had to also add arn:aws:lambda
as a resource in my serverless.yml in order to use 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
回答3:
This solution worked for me:
Attaching AWSKeyManagementServicePowerUser policy from the policy list (without that I got an error on "iam:listRole")
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", "lambda:ListFunctions" ], "Resource": [ "*" ] } ] }
回答4:
If you just use the policies that AWS provides you have to give to the user or the group it belongs
回答5:
go to IAM , select the user and click on add permissions. In the list of permission , you can simply search with all those policies with lambda,and check the ones you want in order to execute the lambda from console.
回答6:
I solved this by adding the AWSLambdaFullAccess
permissions to the user.
- Within IAM Users, click add permissions
- Select "Attach existing policies directly"
- Search for
AWSLambdaFullAccess
, select it and clicknext:review
at the bottom of the page. - Click
Add Permissions
And that should do it.
来源:https://stackoverflow.com/questions/37498124/accessdeniedexception-user-is-not-authorized-to-perform-lambdainvokefunction