AWS Lambda:为Lambda提供与用户签名相同的角色

时间:2017-03-06 16:36:50

标签: amazon-web-services amazon-s3 aws-lambda aws-api-gateway aws-cognito

使用以下AWS技术构建无服务器应用程序:

  • AWS Cognito
  • AWS Lambda
  • AWS API网关
  • AWS IAM

来自客户端的所有请求(在Angular2中编程)都通过API网关。

我为已登录的用户创建了一个IAM角色:Cognito_MyApp_Auth。 我使用Cognito User Pool Authorizer来确保对我的API的所有调用都来自有效的登录用户。

问题:如何授予Lambda函数与登录用户相同的权限?

使用案例:已登录的用户只能在自己的S3存储桶中创建,编辑或删除,因此无法向S3授予Lambda完全权限。

2 个答案:

答案 0 :(得分:1)

Cognito_MyApp_Auth未设置用户与用户的不同权限。它仅定义任何签名用户的权限。因此,您应该允许访问此角色策略中的所有存储桶。 (但是,我将这种访问限制为以特定前缀开头的存储区。)

幸运的是,当通过Cognito SDK调用Lambda时,使用Cognito提供的凭据,传递给处理程序的上下文对象带有用于调用Lambda的Cognito身份。

对于Node.js,您可以看到如何获取此信息:

http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html#nodejs-prog-model-context-example

if (typeof context.identity !== 'undefined') {
    console.log('Cognito
    identity ID =', context.identity.cognitoIdentityId);
}    

获得身份ID后,您可以设置自己的逻辑来限制用户访问自己的存储桶。

使用Cognito SDK直接从应用程序调用Lambda时就是这种情况。如果您使用API​​网关,那么AWS员工会发布一篇好文章:https://forums.aws.amazon.com/thread.jspa?messageID=717379

答案 1 :(得分:0)

没有直接的方法来授予Lambda函数与登录用户相同的权限;但是,您应该能够使用Cognito-identity上下文变量使用Cognito身份池和策略来实现您的用例。

对于此方法,您不会使用Cognito用户池,也不会使用Cognito用户池授权程序。而是使用Cognito身份池进行联合身份识别。将您的API方法的授权设置为AWS_IAM。不要将Lambda用作集成,而是使用AWS代理直接集成到S3。设置集成请求以使用呼叫者的身份。

要对API进行调整,您需要使用Cognito获取临时凭据,然后与他们签署API请求。

使用此方法,S3调用是使用Cognito身份上下文进行的,因此您可以将使用认知身份变量的策略附加到与Cognito身份池中经过身份验证的用户关联的IAM角色。

例如:

{
  "Effect": "Allow",
  "Action": [
    "s3:PutObject"
  ]
  "Resource": [
    "arn:aws:s3:::BUCKET_FOR_USER_${cognito-identity.amazonaws.com:sub}/*"
  ]
}

有关类似的用例,请参阅this post