You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cognito Post Confirmation触发Lambda函数失败问题求助

问题描述

我通过AWS Amplify将用户注册信息同步到Cognito用户池,新用户能正常在Cognito中显示。我创建了Lambda函数用于将Cognito用户详情同步到DynamoDB,并将该Lambda设置为Cognito用户池的Post Confirmation触发器,但用户数据始终无法同步到DynamoDB。单独测试Lambda函数运行正常,推测问题出在Cognito、Amplify配置或者角色权限上,我已为Lambda角色配置了全Cognito访问权限。

我的Lambda函数

var aws = require('aws-sdk');
var ddb = new aws.DynamoDB({apiVersion: '2012-10-08'});

exports.handler = async (event, context) => {
    console.log(event);

    let date = new Date();

    const tableName = process.env.TABLE_NAME;
    const region = process.env.REGION;
  
    
    console.log("table=" + tableName + " -- region=" + region);

    aws.config.update({region: region});
    

    // If the required parameters are present, proceed
    if (event.request.userAttributes.sub) {

        // -- Write data to DDB
        let ddbParams = {
            Item: {
                'sub': {S: event.request.userAttributes.sub},
                'given_name': {S: event.request.userAttributes.given_name},
                'family_name': {S: event.request.userAttributes.family_name},
                'email': {S: event.request.userAttributes.email},
                'email_verified': {S: event.request.userAttributes.email_verified},
                'teamName': {S: event.request.userAttributes.teamName},
                'ifManager': {S: event.request.userAttributes.if_you_are_a_manager},
                'createdAt': {S: date.toISOString()},
            },
            TableName: tableName
        };
        console.log(ddbParams)

        // Call DynamoDB
        try {
            await ddb.putItem(ddbParams).promise()
            console.log("Success");
        } catch (err) {
            console.log("Error", err);
        }

        console.log("Success: Everything executed correctly");
        context.done(null, event);

    } else {
        // Nothing to do, the user's email ID is unknown
        console.log("Error: Nothing was written to DDB or SQS");
        context.done(null, event);
    }
};

我的Amplify文件

import { Amplify } from 'aws-amplify';

import { Authenticator } from '@aws-amplify/ui-react';
import '@aws-amplify/ui-react/styles.css';

import awsExports from './amplifyConfig';
Amplify.configure(awsExports);
const formFields = {
    signUp: {
      username: {
        order:1,
        labelHidden: false,
        label:'Email:',
        placeholder: 'Enter your email',
        isRequired: true,
      },
      given_name: {
        order: 2,
        label: 'First name:',
        placeholder: 'Enter your first name',
        isRequired: true,
  
      },
      family_name: {
        order: 3,
        label: 'Last name:',
        placeholder: 'Enter your last name',
        isRequired: true,
      },
      'custom:teamName':{
        order:4,
        label: 'Team name:',
        placeholder: 'Enter your team name',
        isRequired: true,
      },
      'custom:if_you_are_a_manager':{
        order:5,
        label: 'Are you a manager (Yes/No)?',
        placeholder: 'Please type Yes or No',
        isRequired: true,
      },
      password: {
        order: 6
      },
      confirm_password: {
        order: 7
      }
    },
  
  }
export default function AmplifyAuth() {
  return (
    <Authenticator formFields={formFields}>
      {({ signOut, user }) => (
        <main>
          <h1>Hello {user.attributes.given_name}</h1>
          <button onClick={signOut}>Sign out</button>
        </main>
      )}
    </Authenticator>
  );
}
排查与解决建议

1. 修正Lambda角色权限

你为Lambda配置了全Cognito权限,但Lambda需要的是DynamoDB写入权限。检查Lambda执行角色的权限策略,确保包含dynamodb:PutItem动作,目标为你的DynamoDB表ARN:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "dynamodb:PutItem",
            "Resource": "arn:aws:dynamodb:你的区域:你的账号ID:table/你的表名"
        }
    ]
}

2. 修正自定义属性引用

Amplify表单中自定义属性带custom:前缀,但Lambda中引用时遗漏了该前缀,导致无法获取值。修改Lambda中的属性引用:

// 原代码
'teamName': {S: event.request.userAttributes.teamName},
'ifManager': {S: event.request.userAttributes.if_you_are_a_manager},

// 修改后
'teamName': {S: event.request.userAttributes['custom:teamName']},
'ifManager': {S: event.request.userAttributes['custom:if_you_are_a_manager']},

3. 验证Cognito触发器配置

  • 确认Cognito用户池的Post Confirmation触发器类型为Post Confirmation - Confirm Sign Up
  • 检查触发器关联的Lambda函数是否正确,且Lambda与Cognito用户池处于同一区域

4. 验证Lambda环境变量

确认Lambda的TABLE_NAME和REGION环境变量已正确设置,对应你的DynamoDB表名和区域。可通过Lambda日志中的table=xxx -- region=xxx输出验证。

5. 修正异步函数与context.done的冲突

你的Lambda是async函数,同时使用context.done会导致函数提前结束,DynamoDB请求可能未完成。移除context.done,直接返回event:

// 替换原有的context.done(null, event);
return event;

内容的提问来源于stack exchange,提问作者ukzjhfz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 12:35:24