Aws lambda AWS API网关:如何将IAM标识传递给Lambda函数?

Aws lambda AWS API网关:如何将IAM标识传递给Lambda函数?,aws-lambda,aws-api-gateway,amazon-iam,Aws Lambda,Aws Api Gateway,Amazon Iam,我已使用AWS API网关前端成功配置了对Lambda函数的IAM身份验证访问,但无法找到如何将IAM用户标识传递给Lambda函数 我需要确切的IAM用户标识,无法在调用IAM用户凭据的情况下运行Lambda函数。 我只需要在Lambda函数中获取调用IAM的用户标识 有选项吗?在您发布问题时,不支持从请求上下文访问身份和其他信息,但最近添加了,请参阅: 现在,您可以从映射模板中访问以检索有关API调用的上下文信息。您可以访问阶段、资源路径和HTTP方法等数据,以及有关调用方身份的信息。然后,

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

我需要确切的IAM用户标识,无法在调用IAM用户凭据的情况下运行Lambda函数。 我只需要在Lambda函数中获取调用IAM的用户标识


有选项吗?

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

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

有关的参考文档具有一个
$context变量参考
,并且有各种
$context.identity.*
参数应该满足您的用例

同源同一性 正如Soenke对OPs的回答中所述,有一个截至目前尚未记录的参数导致Cognito标识符包含在此
$context.identity.*
上下文变量中:

为了让Cognito(不是IAM!)识别ID和IdentityPoolId 在Lambda中可用,您必须启用“调用调用方” API网关“集成请求”页面上的“凭据” GW资源。这将产生一个新的上下文结构“identity” (包含“cognitoIdentityId”和“cognitoIdentityPoolId”的 传递给Lambda函数)


您可以使用带有“public”池id的Cognito,然后将角色附加到Cognito池id,该角色正在访问您的Lambda,我认为它被称为InvokeLambdaRole或其他什么

AWS.config.credentials = new AWS.CognitoIdentityCredentials({
    IdentityPoolId: 'REGION:YOUR_POOL_ID',
});
使用AWS STS以有限的权限获取临时凭据。之后,您可以将API网关与AWS_IAM身份验证一起使用,然后端点将为您调用Lambda方法。或者,您可以使用获得的凭据直接调用lambda,但是您必须为您创建的标识池附加正确的角色


注意:严格限制角色,这是一个公开的id,每个人都可以使用它来获得临时或固定(跟踪用户访问不同设备)的用户id。

到目前为止,我找到的最佳解决方案是将用户登录发送到脚本,并在那里重新验证以获得用户id。。。它解决了我的问题,但肯定不是最好的解决方案identifier@AlexeyVMP-对不起,您的问题没有提到您正在寻找Cognito用户标识符,您只询问了如何传递IAM用户标识。尽管如此,我现在添加了Soenke的resp。回答您类似的API网关论坛帖子,您在随后的帖子中已将其视为不适用-我不太确定我是否能理解您的想法,无论哪种方式,我都不知道有任何其他方法可以直接将Cognito标识符交给您,napalm的评论已经回答了如何自己检索它。当我取消选中“使用调用方凭据调用”时,我能够在lambda函数中看到CognitoIdentityId。为此,我在集成请求部分创建了一个application/json映射模板:{“context.identity.cognitoIdentityId”:“$context.identity.cognitoIdentityId”}。在完成“部署API”之后,我需要多等几秒钟才能尝试访问我的网站。在“部署API”生效之前有几秒钟的延迟。我们是否可以发布sns,或者使用通过API门的方式从Lambda向SQS发送消息?在我们的示例中,我们在lambda中接收到一条消息和一组队列,我们将消息定向到所有队列,在发送消息之前,我们希望检查网关Api调用方是否可以访问他刚刚通过的队列。尝试在此处记录我的用户IAM id(以便为SAAS服务的Api调用计费)。目前我能做的最好的事情是在集成请求中重新编写请求主体,为主体添加映射模板,生成基本的“passthrough”代码,并在其中添加值“$context.identity.userArn””。这会让身体变得一团糟,需要对我的请求进行完整的日志记录,以便识别调用方帐户。难道没有更好的办法吗?至少,我只想将变量添加到标题或QSParam中。(我用的是豆茎,不是lambda)