【问题标题】:AccessDeniedException: User is not authorized to perform: lambda:InvokeFunctionAccessDeniedException:用户无权执行:lambda:InvokeFunction
【发布时间】:2016-09-26 15:47:20
【问题描述】:

我正在尝试从节点调用 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: User: ARN... is not authorized to perform: ACTION on resource: ARN..." 可能会提示您几个描述问题并添加访问角色。

标签: node.js amazon-web-services aws-lambda amazon-iam


【解决方案1】:

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 方法的两种方法。

更新:

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

【讨论】:

  • 这对我不起作用,我不得不使用“lambda:*”。换句话说,必须用大锤子敲它!
  • 对于您正在做的事情,无需创建自定义策略。您可以将 AWSLambdaRole 添加为用户配置文件上的托管策略,仅此而已。
  • 我尝试添加自定义策略并附加“AWSLambdaRole”,但我仍然收到 AccessDeniedException: is not authorized to perform: lambda:InvokeFunction
  • 对我有用,但更改需要几分钟到一个小时才能生效
  • AWSLambdaRole 对我不起作用,我需要使用 lambda:InvokeAsync 创建内联策略,因为我有事件函数类型
【解决方案2】:

这个解决方案对我有用:

  1. 附加 AWSKeyManagementServicePowerUser 策略 政策列表(没有那个我在“iam:listRole”上得到一个错误)

  2. lambda:ListFunctions 添加到由 @Matt Houser

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

【讨论】:

    【解决方案3】:

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

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

    应该这样做。

    【讨论】:

    • 我必须添加“AWSCodeDeployRoleForLambda”
    • 同意@KeithNorman,AWSLambdaFullAccess 本身并没有为我做这件事。
    • 注意 AWSLambdaFullAccess 和 AWSLambdaReadOnlyAccess 现已弃用。见这里:docs.aws.amazon.com/lambda/latest/dg/…
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 从 iOS 调用 Lambda 时,添加 AWSCodeDeploy 对我有用。
      【解决方案6】:

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

      【讨论】:

      • 这为我解决了这个问题(其他答案都不适合我)。
      • 谢谢,这就是我要找的。请注意,此配置应放在“提供者”部分下,forum.serverless.com/t/…
      【解决方案7】:

      这对我有用:

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

      【讨论】:

      • Sid 是怎么回事?这是任意的吗?
      • @Cadoiz 您在 Sid 中放置了一个唯一名称,以识别其他人的许可
      猜你喜欢
      • 2019-02-12
      • 1970-01-01
      • 2018-08-22
      • 2019-09-24
      • 2014-09-06
      • 1970-01-01
      • 2021-12-09
      • 2019-08-25
      • 2018-11-07
      相关资源
      最近更新 更多