如何修改AWS Cognito post-confirmation Lambda触发器创建DynamoDB Profile对象
实现Cognito新用户自动创建DynamoDB Profile记录
第一步:给Lambda函数添加DynamoDB写入权限
你的Lambda执行角色需要具备向Profile表写入数据的权限。打开IAM控制台,找到该Lambda对应的角色,添加以下内联政策:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "dynamodb:PutItem", "Resource": "arn:aws:dynamodb:你的区域:你的账号ID:table/Profile" } ] }
第二步:编写Lambda函数代码
以下是两种常见SDK版本的实现,按需选择:
AWS SDK v2 代码(适合Lambda在线编辑,无需额外依赖)
const AWS = require('aws-sdk'); const dynamodb = new AWS.DynamoDB.DocumentClient({ region: "你的AWS区域" }); const TABLE_NAME = "Profile"; exports.handler = async (event) => { // 从Cognito触发器事件中提取用户核心信息 const user = event.request.userAttributes; const profileItem = { userId: user.sub, // 用Cognito用户唯一标识sub作为Profile主键 username: user.username, email: user.email, createdAt: new Date().toISOString(), status: "active" // 自定义默认状态字段 }; try { await dynamodb.put({ TableName: TABLE_NAME, Item: profileItem }).promise(); console.log(`成功为用户${user.sub}创建Profile记录`); } catch (err) { console.error("创建Profile失败:", err); // 这里的错误不会中断Cognito用户创建流程,仅作日志记录 } // 必须返回事件对象,否则Cognito会触发错误 return event; };
AWS SDK v3 代码(推荐用于新项目)
如果使用Node.js 16+运行环境,可使用更轻量化的SDK v3:
import { DynamoDBClient, PutItemCommand } from "@aws-sdk/client-dynamodb"; import { marshall } from "@aws-sdk/util-dynamodb"; const client = new DynamoDBClient({ region: "你的AWS区域" }); const TABLE_NAME = "Profile"; export const handler = async (event) => { const user = event.request.userAttributes; const profileItem = { userId: user.sub, username: user.username, email: user.email, createdAt: new Date().toISOString(), status: "active" }; try { const command = new PutItemCommand({ TableName: TABLE_NAME, Item: marshall(profileItem) }); await client.send(command); console.log(`Profile created for user ${user.sub}`); } catch (error) { console.error("Error creating profile:", error); } return event; };
第三步:测试验证
- 可以在Lambda控制台选择Cognito post-confirmation的测试事件模板,模拟用户创建触发流程
- 直接在Cognito用户池创建新用户,查看
Profile表是否生成对应记录
注意事项:
- 确保
Profile表的主键字段与代码中userId一致,否则会写入失败 - 若需过滤未验证邮箱的用户,可添加判断逻辑:
if (user.email_verified === 'true')再执行写入 - Lambda超时时间建议设置为3-5秒,避免DynamoDB写入超时
内容的提问来源于stack exchange,提问作者nodeMASTER
相关产品推荐
相关产品推荐

