Amazon web services 基于Cognito凭证为Lambda提供对DynamoDB的细粒度访问

Amazon web services 基于Cognito凭证为Lambda提供对DynamoDB的细粒度访问,amazon-web-services,aws-lambda,amazon-cognito,Amazon Web Services,Aws Lambda,Amazon Cognito,我目前有许多lambda查询DynamoDB。 Lambda通过配置为使用AWS_IAM授权的API网关REST API公开/调用 我的Cognito用户池目前正在根据各种信息分配不同的IAM角色,最重要的是,IAM角色限制对DynamoDB上与用户Cognito标识ID匹配的特定行的访问。这些角色按预期工作,当直接查询DynamoDB时,角色仅允许用户读取自己的行 但是,在将数据返回给用户之前,我需要进行一些操作,因此我目前让lambda执行查询,而不是直接访问dynamo。lambda显然配

我目前有许多lambda查询DynamoDB。 Lambda通过配置为使用AWS_IAM授权的API网关REST API公开/调用

我的Cognito用户池目前正在根据各种信息分配不同的IAM角色,最重要的是,IAM角色限制对DynamoDB上与用户Cognito标识ID匹配的特定行的访问。这些角色按预期工作,当直接查询DynamoDB时,角色仅允许用户读取自己的行

但是,在将数据返回给用户之前,我需要进行一些操作,因此我目前让lambda执行查询,而不是直接访问dynamo。lambda显然配置了自己的lambda执行角色,该角色当前为整个数据库提供读取访问权限

然而,我试图做的是通过Api网关将用户Cognito凭证传递给Lambda,然后让Lambda在进行dynamo查询之前担任登录用户的IAM角色,从而只允许Lambda读取DynamoDB中用户自己的行

我花了几天时间尝试了从AWS_IAM授权到Cognito用户池授权以及我在网上发现的任何其他想法,但是我从来没有真正设法让Lambda承担这个角色

目前,我已经为Api网关方法启用了“使用调用方凭据调用”,我的代码正在从事件中读取Cognito标识ID,如下所示:

const cognitoIdentityId = event.requestContext.identity.cognitoIdentityId`
然而,我正在把它传递到Dynamo查询中

1) 我不确定这是否足够安全/是否允许某人操纵请求以访问其他人的数据

2) 我不是专家,但“感觉”我应该为此使用细粒度的IAM角色,而不是仅仅依靠我的Dynamo查询是正确的

如果有人能告诉我,我的方法是否正确,或者这是否可能,或者是否有更好的方法,那就太好了


谢谢

您可以为您的cognito标识获取临时凭证,以获取临时访问密钥、密钥和会话密钥。它们在一小时后过期,就像访问和id令牌一样。但是您可以使用这些凭据让lambda承担您登录用户的角色。您可以找到获取这些凭据的文档。

谢谢您的回复。这听起来像是我试图实现的,但我不清楚如何通过Api网关将令牌传递给Lambda。目前我正在使用AWS_IAM身份验证,我只能访问Cognito标识ID。我也不确定1)这种方式传递令牌是否是一种好的做法,2)这是否是实现我想要的最佳方式。您可以将idtoken传递给Api网关。然后使用GetCredentialsForIdentity API通过传递标识池id和id令牌来获取用户的临时凭据。好的,太好了。谢谢你的澄清。是否有一种使用放大和Api网关的“内置”方法?或者我应该手动将令牌作为“IDToken”头添加到每个请求中吗?(我假设我不能使用授权头,因为这是Api网关层的AWS_IAM身份验证所必需的?)。它是相当安全的,因为它将在一个小时内到期。您可以将标识池id保存为lambda.Awesome上的环境变量。我试试看!谢谢你的帮助!