在 2018 年,允许调用单个 lambda 函数的正确方法是什么?

Gee*_*cks 5 amazon-web-services amazon-iam aws-lambda

你们和我一样对 AWS 感到沮丧吗?(IAM - 明白了吗?它的双关语......)

查看这个 IAM 政策——就在几个月前——它是 100% 有效并且运行良好

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt123456",
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction"
            ],
            "Resource": [
                "arn:aws:lambda:ca-central-1:99999:function:test",
                "arn:aws:lambda:us-east-1:99999:function:test",
                "arn:aws:lambda:us-east-2:99999:function:test",
                "arn:aws:lambda:us-west-1:99999:function:test",
                "arn:aws:lambda:us-west-2:99999:function:test"
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

如果您今天将此2017 年有效策略粘贴到 IAM 控制台编辑器中,您将被告知:

此策略不授予任何权限。要授予访问权限,策略必须具有具有适用资源或条件的操作

现在,您可以亲眼看到,给出了 5 个非常具体的“适用资源”。那么这里给出了什么?这些 AWS 男孩和女孩对我们所有现有的 IAM Lambda 政策做了什么?结果我们仍然安全吗?


2018年的生活

因此,假设您刚刚创建了一个新的 Lambda fn,并且您想授予一个 单个用户权限以运行该特定 fn 而没有其他. 如果您从头开始并使用新控制台,那么您可以有效地构建接近的所有内容:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

所以我们这里有一个大问题,不是吗?那个小星号意味着这个策略可以在整个账户中运行任何 Lambda fn(我已经证明了这一点)。由于您不能再在权限 Lambda:InvokeFunction 中指定资源,因此此权限对于我们的用例来说毫无用处。

可是等等!还有另一个 Lambda 权限,称为 Lambda:Invoke,有了这个权限,你CAN指定,像这样的控制台编辑特定的资源:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "lambda:Invoke",
            "Resource": "arn:aws:lambda:us-east-1:99999:function:test"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

嗯,这看起来很不错不是吗?!我的意思是,也许 AWS 只是将权限名称从 InvokeFunction 更改为 Invoke。哎呀,那还不错,当然不值得在 SO 上提出这个创纪录的长问题,对吗?嘿,是的,好吧,别像我做的那样,以为你要得分了,就浑身沾沾自喜。欢迎来到这个新地狱:

错误:用户:arn:aws:iam::99999:user/PersistentDumbass 无权执行:lambda:InvokeFunction 资源:arn:aws:lambda:us-east-1:99999:function:test

什么?

好的,首先,我们没有调用AWS 开发工具包中名为“InvokeFunction”的函数,而是调用了“Invoke”。其次,我们确实将此政策附加到我们的用户。第三,我们等了一个小时以确保这不是传播问题,并检查了相对无用的AWS 服务健康仪表板- 即使 us-east-1 关闭,它也一直是绿色的。网飞。

如此神童,我召唤您浏览 AWS 现在已过时的文档和糟糕的命名选择,为我们应该允许一个用户调用一个特定函数的“当前方式”创建一个答案。

Gee*_*cks 5

更新 1/8/2018

AWS 通过论坛向我发送了以下内容:

嗨极客,

我们已将此识别为 IAM 控制台中的错误。我们正在努力解决这个问题。请继续使用 lambda:InvokeFunction 并在资源元素中指定函数。您的初始政策应该继续有效。请不要在您的策略中使用 lambda:Invoke。在 IAM 控制台中修复此问题后,我会更新您。

当亚马逊人使用他们的论坛时,这是美好的一天。不过,我仍将继续使用 AWS-CLI。


这个“答案”将 100% 像 AWS 控制台现在一样混乱,而且没有办法绕过它。正如 Michael - sqlbot 在他的评论中所回避的那样,他最近对新 AWS Lambda 控制台的体验并不好,他想知道该策略是否正常,但控制台错误地将其报告为“未授予权限”。他是部分正确的。但问题更深。这是我在“2018 Lambda IAM 权限”中得到的最好的证明,因为他们匆忙推出了一个不太出色的产品:

使用 AWS-CLI 创建您的策略;跳过糟糕的控制台

  1. 在包含您的策略的新文件夹中创建一个 policy.json 文件
  2. 为您的AWS-CLI用户创建此策略:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "iam:CreatePolicy", "iam:DeletePolicy " ], "资源": "*" } ] }

  1. AWS-CLI运行此命令:

aws iam create-policy --policy-name myPolicyName --policy-document file://policy.json

注意一些问题

有一些细微的差异会让你疯狂测试。

  • 尽管文档会告诉您可以向您的 Lambda fn 的 ARN 添加“:version”或“:alias”,但不要这样做。只需以 fn 名称结尾。我还没有找到一种有效的方法来成功地限制到版本或别名。如果我的测试证明并非如此,我将更新此答案,但到目前为止,我可以通过将“:生产”​​添加到我的 ARN 来破坏良好的许可。
  • 如果您是 AWS IAM 的老手,并且有减轻 IAM 策略快速传播的经验,比如在 10-15 秒范围内,那么那些日子似乎已经结束。在第一次尝试前等待整整 2 分钟,如果失败再等待 2 分钟。自从过去的好日子以来,事情已经大大放缓。
  • 使用丢弃的名称测试您的策略,并在测试中放置版本号。考虑诸如“test-v1”、“test-v2”等名称。IAM 似乎做了一些简短的缓存。如果您制定策略并且从不更改它,只需创建一个新版本,删除上一个测试的附件并附加下一个测试,测试就会更快地进行。并等待 2 分钟。
  • 接下来我要做一些通配符测试;我想我在那个区域找到了更多的 fubar,但我还没有测试过,还没有发布关于它的信息。

这个有问题的控制台和不一致的文档花费了我 6 多个小时的努力。我希望这个问答能让你免于悲伤。