Amazon web services Lambda可以承担具有cognito用户id条件的IAM角色吗?

Amazon web services Lambda可以承担具有cognito用户id条件的IAM角色吗?,amazon-web-services,aws-lambda,amazon-iam,assume-role,Amazon Web Services,Aws Lambda,Amazon Iam,Assume Role,我们有一个dynamo表,用于应用程序的安全敏感部分,具有非常严格的读取访问限制(这里的目标是尽可能严格)。理想情况下,我们希望将对该表的访问限制为仅具有匹配的cognito userId前导键的行(按照这种方法:)。不幸的是,我们的要求是,lambda函数需要代表用户读取值,以便随后处理并将值发送给用户(例如通过邮件) 我们当前的设置如下所示:我们已经创建了带前导键IAM条件的IAM规则,并将其附加到一个用户组,该用户组包括将访问该表的所有用户。到目前为止,lambda函数从上下文对象获取规则

我们有一个dynamo表,用于应用程序的安全敏感部分,具有非常严格的读取访问限制(这里的目标是尽可能严格)。理想情况下,我们希望将对该表的访问限制为仅具有匹配的cognito userId前导键的行(按照这种方法:)。不幸的是,我们的要求是,lambda函数需要代表用户读取值,以便随后处理并将值发送给用户(例如通过邮件)

我们当前的设置如下所示:我们已经创建了带前导键IAM条件的IAM规则,并将其附加到一个用户组,该用户组包括将访问该表的所有用户。到目前为止,lambda函数从上下文对象获取规则并假定该角色(通过sts:assumeRole,就像这样,它们都在同一个帐户中:,) lambda和假定的角色都有必要的策略,因此这也可以按预期工作。使用静态值进行测试,如下所示:

ForAllValues:StringEquals: 
  dynamodb:LeadingKeys: 
    - "SOMEKEY"
还要确认所有必需的凭据都已传递,角色已假定,在此之前一切正常

不幸的是,当实际使用
${cognito identity.amazonaws.com:sub}
作为主键标识符时,无论是否使用aws区域前缀,它都会停止工作。因此我的问题是,以前有人遇到过这种情况吗?何时用此变量代替IAM规则?它是在传递给lambda函数之前被解析的(在这种情况下,我们希望填充该值),还是在lambda访问dynamo时被替换的(在这种情况下,它没有被解析,因为lambda而不是cognito用户承担了角色)?
有没有办法缓解这种情况?任何帮助都将不胜感激

${cognito identity.amazonaws.com:sub}正在从标识池引用cognito的标识ID。因此,当您的应用程序使用标识池获取AWS临时凭据时,这些凭据将包含用户标识ID。如果您的应用程序随后尝试从数据库获取行,则用户只能获取他们的行,即以其标识ID作为前导键的行

因此,不用在lambda函数中假设IAM角色,而是使用sts假设角色,您可以将cognitoid令牌传递给lambda,然后将ID令牌传递给标识池以获取凭据。然后SDK可以假设这些凭证,向Dynamo发出的请求将使用${cognito identity.amazonaws.com:sub}

关于这种方法,需要提到的一点是,从标识池获得的凭据在一个小时内有效,因此我认为实现缓存层以重用现有凭据对于避免每次调用时从标识池请求新凭据是必要的


希望能有所帮助。

非常感谢!那么Cognito ID令牌就是用户登录时收到的令牌?或者是他们从身份池接收的身份ID?使用Cognito作为Api网关的授权人是否仍然可以遵循这种方法,或者在这种情况下,客户端是否必须单独传递标识ID?(虽然我可能在这里混淆了一些东西)因此用户登录到UserPool并将获得三个令牌,ID、access和refrsh。必须使用此ID令牌从标识池获取凭据。使用这些凭据进行调用将允许IAM检查${cognito identity.amazonaws.com:sub}。标识ID必须是前导密钥,并且在用户第一次与标识池交换标识令牌时收到此标识ID。您的另一个选择可能是让客户直接从身份池获取AWS信用证,并致电Dynamo。再次感谢!我最终遵循了你的方法,从Cognito id令牌中获得了凭证,这似乎奏效了但是,不幸的是,用户似乎没有获得所需的权限,这是cognito identity.amazonaws.com:一小时后过期的用户的identityId吗?当您将令牌交换为临时凭据时,Cognito标识池将为您提供标识ID。此标识ID是该给定用户的标识池唯一标识。如果您稍后将令牌交换为新凭据,您将获得相同的标识ID。Get ID返回标识ID,如果设备未存储标识ID,我建议您阅读此放大教程,也许您仍能提供帮助-我在寻找问题解决方案时遇到此帖子。我有一种多租户应用程序(但是,许多租户可以是单用户)。OrganizationID将是Congito组id和DynamoDB表中的分区键。如何在my Lambdas中承担用户的角色,以便用户能够访问其组织数据?