【问题标题】:AWS: List Cognito Users within Lambda FunctionAWS:在 Lambda 函数中列出 Cognito 用户
【发布时间】:2018-07-17 15:12:18
【问题描述】:

我正在尝试从 Lambda 函数访问 AWS Cognito UserPool。该函数配置为池的PreSignUp 触发器。这是我的 lambda 代码(注意,我正在使用 TypeScript 进行开发):

import { CognitoUserPoolEvent, Handler, Context, Callback } from 'aws-lambda';
import { CognitoIdentityServiceProvider } from 'aws-sdk';

export const onPreSignUp: Handler =
  (event: CognitoUserPoolEvent, context: Context, cb: Callback | undefined) => {
    context.callbackWaitsForEmptyEventLoop = false;
    const userAttr = event.request.userAttributes || undefined;
    console.log(userAttr);

    if (cb) {
      const cognitoPoolId = process.env.COGNITO_USER_POOL_ID;
      const email = userAttr.email || userAttr['cognito:email_alias'];

      if (!cognitoPoolId) {
        console.warn('No user pool id defined', cognitoPoolId);
        return cb(new Error('Can not create user'));
      }

      const identityService = new CognitoIdentityServiceProvider();

      const params = {
        UserPoolId: cognitoPoolId,
        Filter: `email = "${email}"`,
      };

      console.log("try to list users", params);
      identityService.listUsers(params, (err, data) => {
        console.log('list users');
        if (err) {
          console.warn('listUsers Error', err);
          return cb(new Error('Can not create user'));
        }
        console.log("data", data);
        return cb(null, 'todo');
      });
    }
  }

不幸的是,listUsers 的回调永远不会返回。如果我传递了一个无效的params 对象,回调会立即返回。

我还尝试将 lambdas 超时设置为最大(5 分钟)并增加 RAM。没有什么帮助。 lambda 执行角色具有AmazonCognitoReadOnly,它提供完全读取访问权限。如果这会是一个问题,我也预计会出现授权错误。

编辑:在我发布这个之后,我已经解决了我的问题:lambda 被配置为在 VPC 中运行。将 VPC 设置为 none 即可解决。

【问题讨论】:

  • 感谢分享!我也没有考虑 VPC!

标签: amazon-web-services aws-lambda amazon-cognito


【解决方案1】:

此代码适用于我:

module.exports.getUserByAttribute = async (attributeName, attributeValue) => {
  const params = {
      UserPoolId: process.env.userPoolId,
      Filter: `${attributeName} = "${attributeValue}"`,
  }
  try {
      const data = await cognitoIdentityService.listUsers(params).promise()
      const existingUser = data.Users.filter(user => user.UserStatus !== 'EXTERNAL_PROVIDER')[0]
      if (existingUser == null) {
          console.log('Error', 'User not found')
      }
      return existingUser
  } catch (error) {
      console.log('Error: getUserByAttribute', error)
  }
}

【讨论】:

  • 感谢您的回答。你的代码应该可以工作,是的。我希望它可以帮助其他人。我最初的问题是 VPC 的配置并且缺少 lambda 的 NatGateway,因此它无法访问 Cognito。
猜你喜欢
  • 2020-03-19
  • 1970-01-01
  • 1970-01-01
  • 2020-12-12
  • 2023-03-29
  • 1970-01-01
  • 2019-10-21
  • 1970-01-01
  • 2017-12-03
相关资源
最近更新 更多