【问题标题】:AWS API Gateway: How to pass IAM identity to Lambda function?AWS API Gateway:如何将 IAM 身份传递给 Lambda 函数?
【发布时间】:2015-10-17 23:26:09
【问题描述】:

我已使用 AWS API Gateway 前端成功配置了对我的 Lambda 函数的 IAM 身份验证访问,但无法找到如何将 IAM 用户身份传递给我的 Lambda 函数。

我完全需要 IAM 用户身份,并且无法在调用 IAM 用户凭证下运行 Lambda 函数。 我所需要的只是在我的 Lambda 函数中调用 IAM 用户身份。

有选择吗?

【问题讨论】:

  • 到目前为止,我发现的最佳解决方案是将用户的登录信息发送到脚本并在那里重新验证它们以获取用户的 ID...它解决了我的问题,但绝对不是最好的解决方案。

标签: aws-lambda aws-api-gateway amazon-iam


【解决方案1】:

在您发布问题时不支持从 Amazon API Gateway 请求上下文访问身份和其他信息,但最近已添加,请参阅 Announcement: Context Variables

您现在可以从映射模板中访问 context variables 以检索有关 API 调用的上下文信息。您可以访问阶段、资源路径和 HTTP 方法等数据,以及有关调用者身份的信息。然后可以使用 $context 变量将此信息传递给您的后端集成。 [强调我的]

Accessing the $context Variable 上的参考文档具有 $context Variable Reference,并且有各种 $context.identity.* 参数可以解决您的用例。

认知身份

正如 Soenke 对类似 question in the Amazon API Gateway forum 的 OP 的回答中所述,有一个尚未记录的 integration 参数导致 Cognito 标识符包含在此 $context.identity.* 上下文变量中:

为了拥有 Cognito(不是 IAM!)IdentityId 和 IdentityPoolId 在 Lambda 中可用,您必须启用“与调用者调用 API 网关“集成请求”页面上的凭据” GW 资源。这导致了一个新的上下文结构“身份” (包含“cognitoIdentityId”和“cognitoIdentityPoolId”是 传递给 Lambda 函数)。

【讨论】:

  • 没有一个新变量提供 Cognito 用户标识符
  • @AlexeyVMP - 抱歉,但您的问题没有提到您正在寻找 Cognito 用户标识符,您只是询问了如何传递 IAM 用户身份。话虽如此,我现在已经添加了 Soenke 的回复。回答您类似的 API Gateway 论坛帖子,尽管您已经在后续帖子中将其驳回为不适用 - 我不太确定我是否可以按照您的要求进行操作,无论哪种方式我都不知道有任何其他方法可以获取直接交给你的 Cognito 标识符,如何自己取回已经被 napalm 的评论回答了。
  • 当我未选中“使用调用方凭据调用”时,我可以在 lambda 函数中看到 CognitoIdentityId。为了能够做到这一点,我创建了一个 application/json 映射模板: { "context.identity.cognitoIdentityId" : "$context.identity.cognitoIdentityId"} 在 集成请求部分。完成“部署 API”后,我需要多等几秒钟才能尝试访问我的网站。在“Deploy API”生效之前有几秒钟的延迟。
  • 我们可以使用通过 Api 网关的调用者身份从 Lambda 发布 sns 或向 SQS 发送消息吗?在我们的例子中,我们在 lambda 中收到一条消息和一个队列数组,我们会将消息定向到所有队列,在发送消息之前,我们想检查网关 Api 调用者是否可以访问他刚刚传递的队列。
  • 尝试在此处记录我的用户 IAM id(以便为 SAAS 服务的 api 调用计费。)。目前我设法做的最好的事情是重新处理集成请求中的请求正文,为正文添加一个映射模板,生成一个基本的“直通”代码,并在其中添加一个值"MyUserArn" : "$context.identity.userArn"。这会使正文变得一团糟,并且需要启用对我的请求的完整记录,以便识别呼叫者帐户。没有更好的方法吗?至少,我只想将我的变量添加到标头或 QSParam 中。 (我用的是豆茎,不是 lambda)
【解决方案2】:

您可以将 Cognito 与“公共”池 id 一起使用,然后将角色附加到 Cognito 池 id,该角色正在访问您的 Lambda,我认为它称为 InvokeLambdaRole 或其他东西

AWS.config.credentials = new AWS.CognitoIdentityCredentials({
    IdentityPoolId: 'REGION:YOUR_POOL_ID',
});

使用 AWS STS 获取具有有限权限的临时凭证。之后,您可以将 API Gateway 与 AWS_IAM 身份验证一起使用,然后端点将为您调用 Lambda 方法。或者您可以使用您获得的凭据直接调用 lambda,但是您必须再次为您创建的身份池附加正确的角色。

注意:在您的杆上设置严格的最低角色,即公开可用的 id,每个人都可以使用它来获取临时或固定(跨设备跟踪用户)user_/app_ id。

【讨论】:

    猜你喜欢
    • 2019-11-18
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 2020-02-26
    • 2020-10-15
    • 2016-10-17
    • 2016-04-10
    • 2021-11-11
    相关资源
    最近更新 更多