2

进出口使用以下AWS技术构建一个无服务器应用程序:AWS LAMBDA:给LAMBDA相同的作用,在用户签订

  • AWS Cognito
  • AWS LAMBDA
  • AWS API网关
  • AWS IAM

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

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

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

使用案例:登录用户只能在他自己的S3存储桶中创建,编辑或删除,因此不允许授予对S3的Lambda完整权限。

回答

1

Cognito_MyApp_Auth没有为用户设置不同的权限。它只定义了任何签名用户的权限。所以你应该允许访问这个角色策略中的所有桶。 (但是,我会限制以特定前缀开头的桶的访问。)

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

对于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

+0

所以我不应该通过API网关调用我的Lambda函数,而是使用Cognito SDK?如果我错了,请纠正我。 – Vingtoft

+1

这取决于你,但如果你没有特定的理由让HTTP接口成为你的函数,那么你可以直接通过JS API调用函数,并且性能更高,成本更低。 –

0

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

对于这种方法,你不会用Cognito用户池也不Cognito用户池授权。相反,您将Cognito身份池用于联合身份。将API方法的授权设置为AWS_IAM。不要使用Lambda作为集成,而是使用AWS代理直接集成到S3。将集成请求设置为使用呼叫者的身份。

要CAL你需要使用Cognito获得临时凭证,然后登录你与他们的API请求的API。

有了这种方法,S3呼叫与Cognito身份背景做,这样你就可以将它使用cognito身份变量与您Cognito身份池认证用户相关的IAM角色的策略。

例如:

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

用于类似用途的情况下,参见this post