如何从AWS Cognito确认事件中获取用户名并触发Lambda创建S3文件夹
从Cognito Post Confirmation触发器中获取用户名并创建S3专属文件夹
嘿,这个场景我之前做用户生命周期管理的时候刚好实操过,其实核心就是从Cognito传递给Lambda的触发器事件里提取用户名,下面给你一步步讲清楚:
1. 理解Cognito触发器的事件结构
当用户完成邮箱/手机号确认后,Cognito会触发你的Lambda函数,并传递一个包含用户所有关键信息的事件对象。其中顶层的userName字段就是你要的用户名,另外在request.userAttributes里也有cognito:username属性,两者取值一致,选哪个都可以。
简化后的事件结构大概是这样:
{ "version": "1", "region": "us-east-1", "userPoolId": "us-east-1_XXXXXX", "userName": "new-user-123", // 这里就是目标用户名 "triggerSource": "PostConfirmation_ConfirmSignUp", "request": { "userAttributes": { "sub": "xxxx-xxxx-xxxx-xxxx", "email": "user@example.com", "cognito:username": "new-user-123" // 这里也能拿到用户名 } }, "response": {} }
2. 修改Lambda函数获取用户名并创建S3文件夹
下面给你两种主流语言的实现示例,你可以直接套用:
Python版本
import boto3 # 替换成你的S3存储桶名称 TARGET_BUCKET = "your-user-files-bucket" s3_client = boto3.client("s3") def lambda_handler(event, context): # 从触发器事件中提取用户名 username = event["userName"] # 在S3中创建用户专属文件夹(S3是对象存储,创建文件夹本质是上传一个空的带/后缀的对象) folder_key = f"{username}/" s3_client.put_object(Bucket=TARGET_BUCKET, Key=folder_key) # 必须返回原事件,否则Cognito会认为触发器执行失败 return event
Node.js版本
const AWS = require('aws-sdk'); const s3 = new AWS.S3(); // 替换成你的S3存储桶名称 const TARGET_BUCKET = "your-user-files-bucket"; exports.handler = async (event) => { // 提取用户名 const username = event.userName; // 创建用户文件夹 await s3.putObject({ Bucket: TARGET_BUCKET, Key: `${username}/` }).promise(); // 返回事件给Cognito return event; };
3. 关键注意事项
- Lambda权限配置:确保你的Lambda执行角色拥有S3的
putObject权限,给角色添加以下IAM政策(替换成你的桶名):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::your-user-files-bucket/*" } ] }
- 用户访问控制:后续要限制用户仅能访问自己的文件夹,可以通过IAM策略实现,比如给身份池中的用户附加这样的政策:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject", "s3:PutObject"], "Resource": "arn:aws:s3:::your-user-files-bucket/${cognito-identity.amazonaws.com:username}/*" } ] }
- 测试验证:你可以在Lambda控制台创建一个模拟测试事件,复制上面的简化事件结构,替换成测试用户名,运行函数验证是否能在S3中生成对应文件夹。
内容的提问来源于stack exchange,提问作者benbilhorn
相关产品推荐
相关产品推荐

