运行 不同 IAM 角色下的 AWS Lambda 函数

Running an AWS Lambda function Under Different IAM Roles

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

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

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

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

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

为每个环境部署 lambda 是很常见的(我会说 standard way 实现你想要的)- 当然,它们可能是完全相同的东西 现在,但您可能需要向 lambda 添加您只想在开发中测试的新功能 &c。

随着项目的发展,最终在单独的 AWS 账户中使用 dev/stage/prod 环境甚至很常见(特别是考虑到 AWS 施加的账户范围限制 - discussion)。

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

不过,我强烈建议您为所有三种环境准备一份 lambda 的副本。