Serverless为现有Cognito用户池添加触发器时部署失败求助
解决Serverless关联已有Cognito用户池触发器时的Lambda重复创建错误
问题分析
给已有Cognito用户池添加PostConfirmation触发器,设置existing: true后部署失败,报错Function creation failed because the function already exists。这是因为Serverless框架处理existing: true的Cognito触发器时,会自动创建一个自定义资源Lambda用于关联已有用户池和业务触发器Lambda,但这个自定义资源Lambda的命名可能和之前部署残留的函数重复,导致冲突。
解决方案
方案1:指定自定义资源Lambda的唯一名称
修改Serverless配置,给自动创建的自定义资源Lambda设置唯一名称,避免命名冲突:
- 在
custom区块添加自定义资源名称配置:
custom: userPoolName: your-existing-pool-name # 给关联用的自定义资源Lambda设置唯一名称,带上环境区分 existingCupLambdaName: my-unique-existing-cup-lambda-${self:provider.stage}
- 在触发器事件中添加
resourceName参数引用这个名称:
postConfirmation: handler: triggers.postConfirmation events: - cognitoUserPool: pool: ${self:custom.userPoolName} trigger: PostConfirmation existing: true resourceName: ${self:custom.existingCupLambdaName}
重新部署即可,框架会使用你指定的名称创建自定义资源Lambda,避免重复。
方案2:手动关联触发器
如果不想依赖框架的自动关联逻辑,可以手动完成触发器绑定:
- 先去掉Serverless配置中的
cognitoUserPool事件,部署你的业务Lambda函数:
postConfirmation: handler: triggers.postConfirmation # 暂时移除cognitoUserPool事件
- 部署完成后,登录AWS Cognito控制台:
- 找到目标用户池,进入「触发器」标签页
- 在PostConfirmation触发器下拉菜单中选择你刚部署的Lambda函数,保存配置。
方案3:清理残留的自定义资源Lambda
如果之前部署已经创建过同名的自定义资源Lambda,可以直接删除它:
- 登录AWS Lambda控制台,搜索
CustomDashresourceDashexistingDashcupLambdaFunction(或类似命名的函数) - 确认该函数是之前部署残留的无用资源后,删除它,再重新执行Serverless部署。
内容的提问来源于stack exchange,提问作者3rdSenna
相关产品推荐
相关产品推荐

