【发布时间】:2016-08-30 11:32:13
【问题描述】:
我使用经过 Google 身份验证的 Cognito 凭据提供程序直接从 Android 调用 lambda。通过使用该凭据提供程序获得的角色允许我调用 lambda。我可以在我的 CloudWatch 日志中看到 lambda 确实在传递给 lambda 处理程序的上下文变量中接收到用户的 Cognito 身份。 lambda 假定一个角色使用此身份变量来限制 lambda 对由 Cognito 身份变量命名的特定 S3 用户文件夹的访问。
{
"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 承担了它不起作用的角色,我必须放松政策约束。我做错了什么或误解了什么?
【问题讨论】:
标签: amazon-web-services amazon-s3 lambda