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

标签 node.js amazon-web-services aws-lambda amazon-iam aws-sam

我正在部署一个 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 的执行角色提供了完全管理员访问权限。

enter image description here

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

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

我的假设错了吗?这些凭据从何而来?我如何才能知道它们允许我做什么?

最佳答案

Lambda 执行运行时将为您的函数调用提供一个临时 session token (不是持久/永久访问 key / secret 访问 key )。

在后台,Lambda 服务将使用 AWS Security Token Service (AWS STS) 承担您的 Lambda 函数的 Lambda 执行角色。这就是为什么您还必须在执行角色的信任策略中将 Lambda 服务委托(delegate)人添加为受信任的服务委托(delegate)人。结果是一个临时 session 。

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

但是,您不需要手动配置/指定任何凭据,因为 AWS SDK 中的默认凭据加载程序链会自动处理这件事。

关于node.js - 来自执行环境的 AWS Lambda 凭证没有执行角色的权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66214393/

相关文章:

amazon-web-services - 使用自动扩展创建 EC2 时,是否可以在 Cloud Formation Template 中为 EC2 添加 CNAME?

amazon-web-services - AWS 是否对 SQS 触发的 Lambda 函数的轮询时间收费?

amazon-s3 - 使用 CloudFormation 在 S3 存储桶中创建 Lambda 通知

node.js - { [错误 : timedout while connecting to smtp server] code: 4, smtp: 未定义 }

javascript - 返回新的 Promise 和 Promise.resolve 的区别

javascript - PM2 是要在开发过程中使用吗?

amazon-s3 - 当用户上传到 S3 存储桶时收到通知吗?

amazon-web-services - 如何为 aws gateway API 创建预签名 URL

Python - 创建 aws lambda 部署包

node.js - 防止 NodeJS 程序退出