我们有一个发电机表,用于我们应用程序的安全敏感部分,具有非常严格的读取访问限制(在此处尽可能严格)。理想情况下,我们希望将对该表的访问限制为仅具有匹配 cognito-userId 前导键的行(遵循这种方法:https ://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_dynamodb_rows.html )。不幸的是,我们的要求是 lambda 函数需要代表用户读取值,以便随后处理并将值发送给用户(例如通过邮件)。
我们当前的设置如下所示:我们使用该主键 IAM 条件创建了 IAM 规则,并将其附加到一个用户组,该用户组包括将访问该表的所有用户。到目前为止一切顺利,lambda 函数从上下文对象中获取规则并承担该角色(通过 sts:assumeRole,就像这样,尽管它们都在同一个帐户中:https ://aws.amazon.com/premiumsupport/ Knowledge-center/cognito-user-pool-group/ , https://aws.amazon.com/premiumsupport/knowledge-center/lambda-function-assume-iam-role/ ) lambda 和假定的角色都有必要的政策,所以这也可以按预期工作。使用静态值进行测试,如下所示:
ForAllValues:StringEquals:
dynamodb:LeadingKeys:
- "SOMEKEY"
还要确认正在传递所有必需的凭据,正在承担角色,直到这里一切正常。
${cognito-identity.amazonaws.com:sub}
不幸的是,当实际用作前导键标识符时,无论有无 aws-region 前缀,它都会停止工作。因此我的问题是,以前有人遇到过这种情况吗?什么时候用这个变量代替 IAM 规则?它是在传递给 lambda 函数之前被解析(在这种情况下,我们希望填充该值)还是在 lambda 访问 dynamo 时被替换(在这种情况下,它没有被解析,因为 lambda 而不是 cognito-user担任角色)?有没有办法减轻这种情况?任何帮助将不胜感激