运行 不同 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 的副本。
我正在开发一个 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 的副本。