来自执行环境的 AWS Lambda 凭证没有执行角色的权限

Posted

技术标签:

【中文标题】来自执行环境的 AWS Lambda 凭证没有执行角色的权限【英文标题】:AWS Lambda credentials from the execution environment do not have the execution role's permissions 【发布时间】:2021-05-18 17:10:12 【问题描述】:

我正在部署一个 AWS lambda 函数(使用 nodejs 12.x),该函数在调用时执行 AWS 命令​​(“iot:attachPrincipalPolicy”)。我正在使用凭据从 lambda 执行环境变量中运行此命令。

  const AWS = require('aws-sdk/global');

  const region = process.env['AWS_REGION'];
  const accessKeyId = process.env['AWS_ACCESS_KEY_ID'];
  const secretAccessKey = process.env['AWS_SECRET_ACCESS_KEY'];

  AWS.config.region = region;
  AWS.config.credentials = new AWS.Credentials(accessKeyId, secretAccessKey);

  // attachPrincipalPolicy command from the AWS SDK here

当我在本地(使用sam local start-api)测试该函数时,它运行成功,因为在我的 AWS CLI 中我已经设置了我的管理员帐户的 ACCESS_KEY_ID 和密码。

但是,当我部署该函数并调用它时,lambda 在该命令上失败并出现客户端错误(凭据无效),即使我还授予 lambda 执行角色的完全管理员访问权限。

在这里,我在内联策略中提供了完全权限,并且还明确添加了预定义的管理员访问策略。

我希望您从环境变量中获得的 AWS_ACCESS_KEY_ID 授予我在 lambda 函数的执行角色中设置的所有权限,但看起来我授予执行角色的权限并未反映在这些凭据中。

我的假设是错误的吗?这些凭据来自哪里?我如何才能知道它们允许我做什么?

【问题讨论】:

您是否尝试过删除所有代码并让 AWS 开发工具包执行其默认操作以获取分配给运行时环境的凭证?您可能在凭据中缺少 STS 令牌或其他内容。让 SDK 为您完成所有这些工作要容易得多,默认情况下它会这样做,而不是尝试在您自己的代码中重新发明凭据查找。 【参考方案1】:

Lambda 执行运行时将为您的函数调用提供临时会话令牌(不是持久/永久访问密钥/秘密访问密钥)。

在后台,Lambda 服务将使用 AWS 安全令牌服务 (AWS STS) 来承担您的 Lambda 函数的 Lambda 执行角色。这就是为什么您还必须在执行角色的信任策略中添加 Lambda 服务委托人作为受信任的服务委托人。这样做的结果是一个临时会话。

此临时会话的凭据存储在环境变量 AWS_SECRET_ACCESS_KEYAWS_ACCESS_KEY_IDAWS_SESSION_TOKEN 的组合中。

但是,您不需要手动配置/指定任何凭证,因为 AWS 开发工具包中的默认凭证加载器链会自动处理此问题。

【讨论】:

感谢您的完美解释,这已解决。我也是刚刚才知道的。只是不要像我一样尝试明确设置凭据,只需要 aws-sdk 并且一切都按预期工作!

以上是关于来自执行环境的 AWS Lambda 凭证没有执行角色的权限的主要内容,如果未能解决你的问题,请参考以下文章

无法为执行AWS :: CloudFormation :: CustomResource的aws lambda函数设置环境变量

使用谷歌传输服务将文件从 AWS 传输到 GCP 时出现凭证错误

什么是AWS Lambda?——事件驱动的函数执行环境

使用代理通过 AWS API Gateway 的 Lambda 错误

对于 AWS lambda 无服务器 nodejs 应用程序,您如何在开发环境中执行请求?

如何为 AWS RDS 凭证创建配置文件并将其导入我的 AWS Lambda API?