首页 > 解决方案 > 在不同的 IAM 角色下运行 AWS Lambda 函数

问题描述

我正在开发一个恰好具有 AWS lambda 函数的 Node.js 项目。我们会调用它funcA。它可以在特定的 s3 存储桶上getObject()putObject()

我们有一个在 Elastic Beanstalk 实例上运行 Node.js 的开发环境。该实例在专门用于开发的 IAM 角色上运行。此 IAM 角色允许它调用 Lambda 函数并访问开发 S3 存储桶。这就是它变得棘手的地方......

我们还需要有单独的暂存环境和生产环境,它们也将位于 Elastic Beanstalk 上。那些环境也需要使用这个 lambda 函数。但是,这些是在不同 IAM 角色下运行的不同 EB 实例。这些角色应该只能分别访问暂存桶和生产桶。

我们的基础架构团队告诉我,这意味着我必须拥有三个独立的特定于环境的 Lambda 函数:所以 funcA_dev、funcA_staging、funcA_prod。它实际上是完全相同的代码做同样的事情,但因为它会扮演不同的角色,所以我必须拥有三份副本。

我知道 Lambda 必须有一个角色。但是,这似乎是一个非常不合标准的工作流程。有没有更好的方法来管理这个?关键标准是使用 IAM 角色(没有永久或硬编码的密钥),并严格限定角色范围,以便例如如果开发凭证以某种方式受到损害,它不会影响生产存储桶和堆栈。

标签: amazon-s3aws-lambdaaws-iamamazon-iam

解决方案


为每个环境部署一个 lambda 是很常见的(我会说实现你想要的标准方式)——当然,它们现在可能是完全相同的东西,但你可能需要为你的 lambda 添加新功能我只想在开发和 c 中进行测试。

随着您的项目的发展,您的开发/阶段/生产环境最终会出现在不同的 AWS 账户中(尤其是考虑到 AWS 强加的账户范围限制-讨论)。

如果你真的想避免使用三个 lambda,最好的方法是自己承担角色假设的职责。lambda 用于获取其临时 IAM 角色的机制是 STS ( https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html )。这意味着您可以传递您的 lambda 不同的临时凭证,您可以在 Elastic Beanstalk 实例中指定和分配这些凭证。

但是,我真的强烈建议您为所有三种环境提供一份 lambda 副本。


推荐阅读