将 AWS API-Gateway 调用的 IAM 身份传递给后端服务器

Pass IAM identity of AWS API-Gateway calls to backend server

我们想 set-up 一个现有的 API 作为 SAAS 使用 AWS 我们的代码已通过 elastic-beanstalk 部署,我们通过网关创建了对方法的访问以管理权限。

我们现在正在尝试记录用户的 activity,用于计费目的

目前,我们找到的最佳解决方案涉及对调用进行完整记录(启用 CloudWatch Logs + 记录完整 requests/responses 数据),这看起来相当繁重,甚至最终可能会非常昂贵。

我们修改了集成请求中的请求 body,为 body 添加了一个映射模板,但这看起来很繁琐,希望我们错过了更好的解决方案。

基本上,我们用生成的基本"passthrough"代码替换默认的"passthrough",并在其中添加一个值"MyUserArn":“$context.identity.userArn”,填充请求 body 一团糟,但看起来像 "The most reliable way to avoid to breaking something".

我们只想在 header 或查询字符串参数中添加 IAM 用户标识符,但未能找到这是否可行。有几篇文章提到了 "Invoke with caller credentials" 选项,但我们也没有找到。
是与 cognito 相关还是其他?

我们是不是做错了什么?

您有几个不同的选项来获取此信息,这两个选项各有优缺点:

  1. 您当前的解决方案从映射模板中的 $context.identity 提取值并作为 body 的一部分发送到您的 Lambda。鉴于您的 "large mess" 评论,您似乎反对这一点,但最终您可以控制传递给 Lambda 的内容。
  2. 在您的方法上启用 "user caller credentials",然后在您的 Lambda 中使用标识值 。目前,这仅在您使用从 Cognito 身份验证流程提供的凭据并且确实要求 Lambda 调用也是您的角色策略的一部分时才有效,但不需要对模板进行任何修改。

更新 抱歉,我以某种方式想念您使用的是 Beanstalk 而不是 Lambda。您绝对可以在集成请求中添加 header,然后从 $context.identity.userArn.

中提取其值

更新 2 再次抱歉,在 header 中使用上下文变量时,您省略了 $,因此您需要使用 context.identity.userArn.