Подтвердить что ты не робот

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?

Спасибо.

4b9b3361

Ответ 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.

  1. В IAM Users, нажмите add permissions
  2. Выберите "Прикрепить существующие политики напрямую"
  3. Найдите AWSLambdaFullAccess, выберите его и нажмите " next:review внизу страницы.
  4. Нажмите Add Permissions

И это должно сделать это.