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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:19:49