IAM 用户上的 lambda ListFunctions 的 AWS AccessDeniedException

NYC*_*yes 6 lambda access-denied amazon-web-services amazon-iam aws-lambda

注意:我通过 IAM 用户控制台帐户执行所有 AWS 配置,该帐户基本上拥有 AWS/Amazon 帐户所有者的所有权限。我将此 IAM 用户称为帐户。

问题描述:

  • 我从帐户创建了以下 IAM 用户,仅具有编程访问权限:lambda-test
  • 我在~/.aws/*文件中添加了它的 IAM 访问密钥(作为配置文件条目)。
  • 现在,对于该lambda 测试帐户,我接下来创建了一个内联/嵌入式策略,该策略允许以下 AWS-Lamdba 操作:ListFunctions、GetFunction、UpdateFunctionCode、UpdateFunctionConfiguration

经正确验证的政策声明如下所示:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1111111111111",  # <--- Altered for this post.
            "Effect": "Allow",
            "Action": [
                "lambda:GetFunction",
                "lambda:ListFunctions",
                "lambda:UpdateFunctionCode",
                "lambda:UpdateFunctionConfiguration"
            ],
            "Resource": [
                "arn:aws:lambda:*"
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

回到笔记本电脑 CLI,我发出以下命令,该命令生成 AccessDeniedException:

user@linux$ aws lambda list-functions --profile lambda-test
Run Code Online (Sandbox Code Playgroud)

这是例外情况:

An error occurred (AccessDeniedException) when calling the ListFunctions operation: User: arn:aws:iam::<AWS-Account-ID>:user/lambda-test is not authorized to perform: lambda:ListFunctions
Run Code Online (Sandbox Code Playgroud)

我错过了什么?(当然,我做到了。=:))提前致谢!

kos*_*osa 6

您可以将两种类型的访问策略与 AWS lambda 结合使用:

1) 基于身份的策略(IAM 策略) 您正在使用的策略是 IAM 策略。如果您阅读此AWS lambda 访问控制概述文档,当您使用基于 IAM 的访问时,目前 AWS 仅支持 * 作为资源。由于“lambda:ListFunctions”无法使用完整的 ARN 进行调用(请参阅本文档了解哪些可以使用 FULL arn 进行调用,哪些可以使用 * 进行调用),因此您需要给出 *.

在当前实现中,Lambda 不支持使用资源 ARN(也称为资源级权限)来识别某些 API 操作的特定资源,因此您必须指定通配符 (*)。

2) 基于资源的策略(Lambda 函数策略)

每个 Lambda 函数都可以具有与其关联的基于资源的权限策略。对于 Lambda,Lambda 函数是主要资源,这些策略称为 Lambda 函数策略。您可以使用 Lambda 函数策略授予跨账户权限,作为将基于身份的策略与 IAM 角色结合使用的替代方法。例如,您只需向 Lambda 函数策略添加权限即可授予 Amazon S3 调用 Lambda 函数的权限,而无需创建 IAM 角色。

更多示例在这里