Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services AWS lambda在获取临时权限时是否使用Cognito策略变量?_Amazon Web Services_Amazon S3_Lambda - Fatal编程技术网

Amazon web services AWS lambda在获取临时权限时是否使用Cognito策略变量?

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

我使用谷歌认证的Cognito凭证提供者直接从Android调用lambda。通过使用该凭据提供程序获得的角色允许我调用lambda。我可以在CloudWatch日志中看到,lambda确实在传递给lambda处理程序的上下文变量中接收到用户的Cognoto标识。lambda承担一个角色,该角色使用此标识变量限制lambda对由Cognito标识变量命名的特定S3用户文件夹的访问

{
    "Effect":"Allow",
    "Action":[
        "s3:GetObject",
        "s3:PutObject",
        "s3:PutObjectAcl",
        "s3:DeleteObject"
    ],
    "Resource":[
        "arn:aws:s3:::BUCKET_NAME/users/${c­ognito-identity.amazonaws.com:sub}/"­,
        "arn:aws:s3:::BUCKET_NAME/users/${c­ognito-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中的哪个用户文件夹