AccessDeniedException: 用户未被授权执行lambda:InvokeFunction操作。

126
我正试图从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);
});

这些密钥是为一个 IAM 用户准备的。该用户已附加 AWSLambdaExecuteAWSLambdaBasicExecutionRole 策略。

我收到了一个权限错误: AccessDeniedException:User:arn:aws:iam::1221321312:user/cli未经授权执行资源上的lambda:InvokeFunction arn:aws:lambda:us-west-2:1221321312:function:test1

我阅读了文档和几篇博客,但是我无法授权此用户调用 Lambda 函数。如何让此用户调用 Lambda?


我真诚地希望有一个AWS CLI或Web界面来解决这个问题。aws add-access "AccessDeniedException: 用户:ARN...未经授权执行操作:资源上的ACTION on ARN..."也许会提示您几个描述性问题并添加访问角色。 - kwerle
9个回答

174

更新(TL;DR)

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


翻译后的答案

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

3
这对我没用,我必须使用"lambda:*"。换句话说,我必须用大锤子来解决它! - Christopher Grigg
18
针对你所做的事情,无需创建自定义策略。你可以将 AWSLambdaRole 添加为用户配置文件上的托管策略,就这样。 - nunob
5
我尝试了两种方法,一是添加自定义策略,二是将"AWSLambdaRole"附加到角色上,但我仍然收到"AccessDeniedException:<USER> is not authorized to perform: lambda:InvokeFunction"的错误提示。 - Jim
4
对我来说没问题,但改变生效前需要等待数分钟至一小时。 - kebbbnnn
3
AWSLambdaRole添加进去对我有用,但需要等待几分钟才会生效。 - Lafif Astahdziq
显示剩余5条评论

21

我正在使用Serverless框架,为了使用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

2
这对我解决了问题(其他答案都不适用于我)。 - Juan M. Molina
2
谢谢,这正是我在寻找的。只是需要注意将此配置放置在“provider”部分下面,https://forum.serverless.com/t/generate-iam-permissions-for-invoking-lambda-from-lambda/338 - Anastasiia Solop
不一定,它也可以在函数yml定义中声明,在iamRoleStatements中声明。 - androider

12

这个解决方案对我有用:

  1. 从策略列表中附加 AWSKeyManagementServicePowerUser 策略(没有它,我在“iam:listRole”上会收到错误)

  2. lambda:ListFunctions 添加到自定义策略中,该策略由@Matt Houser定义

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

7

前往 IAM,选择用户,再点击"添加权限"

在权限列表中,你可以直接搜索所有与lambda相关的策略,并勾选需要执行lambda控制台的那些。

输入AWS IAM权限


4
如果您只使用AWS提供的策略,那么您必须将其提供给用户或组。请参考以下AWS提供的策略示例:Policy from AWS

当我从iOS调用Lambda时,添加AWSCodeDeploy对我很有帮助。 - Teodor Ciuraru

3

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

  1. 在 IAM 用户中,点击添加权限
  2. 选择“直接附加现有的策略”
  3. 搜索 AWSLambdaFullAccess,选择它并点击页面底部的 下一步:审核
  4. 点击 添加权限

就这样了。


1
我必须添加“AWSCodeDeployRoleForLambda”。 - Keith Norman
同意@KeithNorman的说法,仅有AWSLambdaFullAccess权限不足以解决我的问题。 - dstudeba
1
请注意,AWSLambdaFullAccess和AWSLambdaReadOnlyAccess现已过时。请参见此处:https://docs.aws.amazon.com/lambda/latest/dg/security_iam_troubleshoot.html#security_iam_troubleshoot-admin-deprecation - mihaa123

2
这对我有用:

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

1
这是关于 Sid 的什么事?这是任意的吗? - Cadoiz
1
@Cadoiz 你可以在Sid中使用独特的名称来标识该权限,以便他人进行识别。 - gildniy

0
如果您想允许一个Lambda函数调用另一个Lambda函数,您应该更新Lambda角色的策略。

这是一个Terraform示例:

设置IAM角色和策略:

resource "aws_iam_role" "lambda_1_role" {
    name   = "Lambda_1_Role"
    assume_role_policy = <<EOF
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": "sts:AssumeRole",
            "Principal": {
                "Service": "lambda.amazonaws.com"
            },
            "Effect": "Allow",
            "Sid": ""
        }
    ]
}
EOF
}

添加 IAM 策略:

resource "aws_iam_policy" "iam_policy_for_lambda_1" {
    name         = "aws_iam_policy_for_terraform_aws_lambda_1_role"
    path         = "/"
    description  = "AWS IAM Policy for managing aws lambda 1 role"
    policy = <<EOF
{
    "Version": "2012-10-17",
    "Statement": [
    {
        "Action": [
            "logs:CreateLogGroup",
            "logs:CreateLogStream",
            "logs:PutLogEvents"
        ],
        "Resource": "arn:aws:logs:*:*:*",
        "Effect": "Allow"
    },
    {
        "Sid": "Stmt1464440182000",
        "Effect": "Allow",
        "Action": [
            "lambda:InvokeAsync",
            "lambda:InvokeFunction"
        ],
        "Resource": [
            "*" 
        ]
    }
    ]
}
EOF
}

不要忘记指定您的资源。不要在生产环境中使用通配符。

将 IAM 策略附加到 IAM 角色:

resource "aws_iam_role_policy_attachment" "attach_iam_policy_to_iam_role_lambda_1" {
    role        = aws_iam_role.lambda_1_role.name
    policy_arn  = aws_iam_policy.iam_policy_for_lambda_1.arn
}

创建一个 Lambda 函数:
resource "aws_lambda_function" "lambda_1" {
    function_name  = "Lambda_1"
    filename       = "../lambda-1.zip"
    role           = aws_iam_role.lambda_1_role.arn
    handler        = "index.handler"
    runtime        = "nodejs16.x"
    depends_on     = [aws_iam_role_policy_attachment.attach_iam_policy_to_iam_role_lambda_1]
}

0
对于SAM模板,请确保您已将Lambda资源添加到AppSync资源中:
AppSyncApiServicePolicy:
Type: AWS::IAM::Policy
Properties:
  PolicyName: AppSyncLambdaInvokePolicy
  Roles:
    - !Ref AppSyncApiServiceRole
  PolicyDocument:
    Version: 2012-10-17
    Statement:
      - Effect: Allow
        Action: lambda:InvokeFunction
        Resource:
          - !GetAtt GetMessages.Arn // added lambda resource
          - !GetAtt SendMessage.Arn // added lambda resource

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接