Amazon web services AWS lambda在获取临时权限时是否使用Cognito策略变量?
我使用谷歌认证的Cognito凭证提供者直接从Android调用lambda。通过使用该凭据提供程序获得的角色允许我调用lambda。我可以在CloudWatch日志中看到,lambda确实在传递给lambda处理程序的上下文变量中接收到用户的Cognoto标识。lambda承担一个角色,该角色使用此标识变量限制lambda对由Cognito标识变量命名的特定S3用户文件夹的访问Amazon web services AWS lambda在获取临时权限时是否使用Cognito策略变量?,amazon-web-services,amazon-s3,lambda,Amazon Web Services,Amazon S3,Lambda,我使用谷歌认证的Cognito凭证提供者直接从Android调用lambda。通过使用该凭据提供程序获得的角色允许我调用lambda。我可以在CloudWatch日志中看到,lambda确实在传递给lambda处理程序的上下文变量中接收到用户的Cognoto标识。lambda承担一个角色,该角色使用此标识变量限制lambda对由Cognito标识变量命名的特定S3用户文件夹的访问 { "Effect":"Allow", "Action":[ "s3:GetObje
{
"Effect":"Allow",
"Action":[
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl",
"s3:DeleteObject"
],
"Resource":[
"arn:aws:s3:::BUCKET_NAME/users/${cognito-identity.amazonaws.com:sub}/",
"arn:aws:s3:::BUCKET_NAME/users/${cognito-identity.amazonaws.com:sub}/*"
]
},
{
"Effect":"Allow",
"Action":[
"s3:ListBucket",
"s3:ListObjects"
],
"Resource":[
"arn:aws:s3:::BUCKET_NAME"
],
"Condition":{
"StringLike":{
"s3:prefix":[
"users/${cognito-identity.amazonaws.com:sub}/",
"users/${cognito-identity.amazonaws.com:sub}/*"
]
}
}
}
但是,lambda似乎没有继承这些环境变量特定的限制。为了使lambda代码正常工作,我需要放松如下约束:
{
"Effect":"Allow",
"Action":[
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl",
"s3:DeleteObject"
],
"Resource":[
"arn:aws:s3:::BUCKET_NAME/users/*"
]
},
{
"Effect":"Allow",
"Action":[
"s3:ListBucket",
"s3:ListObjects"
],
"Resource":[
"arn:aws:s3:::BUCKET_NAME"
],
"Condition":{
"StringLike":{
"s3:prefix":[
"users/*"
]
}
}
}
我认为这与lambda服务承担这个角色有关。如果我直接在S3客户机上使用该角色,则限制似乎起作用。客户端可以访问自己的文件夹,但不能访问其他人的文件夹。但是,如果lambda承担了这个角色,它就不起作用了,我必须放松策略约束。我是做错了什么还是误解了什么?好吧,我想我知道了。如果我错了,请纠正我。看起来我需要两个角色。lambda将承担的一个角色是完成它需要做的任何事情。该特定角色不能受到任何Cognito登录凭据的限制,因为当Lambda服务承担此角色时,它无权访问这些凭据。安全性来自第二个角色,该角色具有调用lambda的权限,但不像lambda角色那样具有对所有S3的完全访问权限。该角色可以而且应该要求身份验证。最终的效果是,您可以要求身份验证来调用lambda,但必须小心lambda代码本身,不要访问任何不应该访问的资源。Cognito凭证被传递到lambda函数中(因为您使用经过身份验证的角色调用了该函数),这样您就可以从上下文中知道应该使用什么资源,即S3中的哪个用户文件夹