AccessDeniedException: Пользователь не уполномочен выполнять: lambda: InvokeFunction
Я пытаюсь вызвать функцию лямбда от 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);
});
Ключи предназначены для пользователя IAM. Пользователь имеет политики AWSLambdaExecute
и AWSLambdaBasicExecutionRole
.
Я получаю ошибку разрешения:
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?
Спасибо.
Ответы
Ответ 1
AWSLambdaExecute
и AWSLambdaBasicExecutionRole
не предоставляют разрешения, которые выражаются в ошибке. Обе эти управляемые политики предназначены для привязки к вашей самой функции Lambda, поэтому она выполняет с этими политиками.
Ошибка говорит, что пользователь, под которым запущена программа nodejs, не имеет права запускать функцию лямбда.
Вам нужно предоставить пользователю IAM разрешение lambda:InvokeFunction
:
- Найдите своего пользователя в консоли управления IAM и щелкните по нему.
- На вкладке "Разрешения" разверните раздел "Внутриполитические политики" и нажмите ссылку "нажмите здесь", чтобы добавить политику ".
- Выберите "Пользовательская политика".
- Дайте вашей политике имя. Это может быть что угодно.
- Поместите эту политику в поле "Документ политики".
Пример политики:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1464440182000",
"Effect": "Allow",
"Action": [
"lambda:InvokeAsync",
"lambda:InvokeFunction"
],
"Resource": [
"*"
]
}
]
}
В этой политике я включил оба метода для вызова методов лямбда.
Update:
Теперь существует также управляемая политика IAM с именем AWSLambdaRole
, которую вы можете назначить своему пользователю IAM или роли IAM. Это должно предоставить вам необходимые разрешения.
Ответ 2
Это решение работало для меня:
-
Прикрепление политики AWSKeyManagementServicePowerUser из
список правил (без этого я получил сообщение об ошибке "iam: listRole" )
-
Добавление lambda: ListFunctions в пользовательскую политику, определенную
@Matt Houser
{ "Версия": "2012-10-17", "Утверждение": [ { "Сид": "Stmt1464440182000", "Эффект": "Разрешить", "Действие": [ "Лямбда: InvokeAsync", "Лямбда: InvokeFunction", "лямбда: ListFunctions" ], "Ресурс": [ "*" ] } ]}
Ответ 3
Я использую Serverless Framework, и мне пришлось также добавить 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
Ответ 4
Если вы просто используете политики, которые предоставляет AWS, вы должны предоставить пользователю или группе, к которой он принадлежит ![Policy from AWS]()
Ответ 5
перейдите в IAM, выберите пользователя и нажмите на добавить разрешения. В списке разрешений вы можете просто выполнить поиск по всем этим политикам с помощью лямбды и выбрать те, которые вам нужны, чтобы выполнить лямбду с консоли. ![enter AWS IAM permissions]()
Ответ 6
Я решил эту проблему, добавив пользователю AWSLambdaFullAccess
доступа AWSLambdaFullAccess
.
- В IAM Users, нажмите add permissions
- Выберите "Прикрепить существующие политики напрямую"
- Найдите
AWSLambdaFullAccess
, выберите его и нажмите " next:review
внизу страницы. - Нажмите
Add Permissions
И это должно сделать это.