无服务器复制用户池而不是按名称重用
Serverless duplicates user pools instead of reusing by name
我正在使用无服务器部署 AWS CloudFormation 模板和一些功能,这是我的 serverless.yml 文件的一部分:
resources:
Resources:
MyUserPool: #An inline comment
Type: "AWS::Cognito::UserPool"
Properties:
UserPoolName: "MyUserPool"
Policies:
PasswordPolicy:
MinimumLength: 7
RequireLowercase: false
RequireNumbers: true
RequireSymbols: false
RequireUppercase: false
functions:
preSignUp:
handler: presignup.validate
events:
- cognitoUserPool:
pool: "MyUserPool"
trigger: PreSignUp
如您所见,两个用户池名称相同,但是当我 运行 无服务器部署时,创建了 2 个同名的用户池。
这是一个错误还是我遗漏了什么?
我也发现这是 counter-intuitive 并且起初令人困惑。但是, 实际上是预期的(并记录在案的)行为。
当您将 Cognito 事件作为触发器附加到函数时,Serverless 会为您创建一个用户池,甚至无需询问。 Source:
This will create a Cognito User Pool with the specified name.
所以在你的例子中,一个用户池是由 cognitoUserPool
事件创建的,另一个是由你的 Resources
部分创建的。 Resources
创建的是正确的(有自定义密码策略),lambda触发器创建的是默认配置。 "Overriding a generated User Pool" 标题下描述了修复。
您在“资源”部分的用户池键前面加上 CognitoUserPool
,这将导致您的触发器和资源在生成的 CloudFormation 模板中引用同一个用户池。
在你的情况下,这意味着简单地改变这个:
resources:
Resources:
MyUserPool:
Type: "AWS::Cognito::UserPool"
对此:
resources:
Resources:
CognitoUserPoolMyUserPool:
Type: "AWS::Cognito::UserPool"
已使用无服务器 1.26.0 进行测试
正确的方法是在您的函数 cognitoUserPool 属性上设置 existing: true
,如下所示...
createAuthChallenge:
handler: services/auth/createAuthChallenge.handler
events:
- cognitoUserPool:
pool: ${self:custom.stage}-user-pool
trigger: CreateAuthChallenge
existing: true
Serverless added support 2019 年 7 月。
我正在使用无服务器部署 AWS CloudFormation 模板和一些功能,这是我的 serverless.yml 文件的一部分:
resources:
Resources:
MyUserPool: #An inline comment
Type: "AWS::Cognito::UserPool"
Properties:
UserPoolName: "MyUserPool"
Policies:
PasswordPolicy:
MinimumLength: 7
RequireLowercase: false
RequireNumbers: true
RequireSymbols: false
RequireUppercase: false
functions:
preSignUp:
handler: presignup.validate
events:
- cognitoUserPool:
pool: "MyUserPool"
trigger: PreSignUp
如您所见,两个用户池名称相同,但是当我 运行 无服务器部署时,创建了 2 个同名的用户池。
这是一个错误还是我遗漏了什么?
我也发现这是 counter-intuitive 并且起初令人困惑。但是, 实际上是预期的(并记录在案的)行为。
当您将 Cognito 事件作为触发器附加到函数时,Serverless 会为您创建一个用户池,甚至无需询问。 Source:
This will create a Cognito User Pool with the specified name.
所以在你的例子中,一个用户池是由 cognitoUserPool
事件创建的,另一个是由你的 Resources
部分创建的。 Resources
创建的是正确的(有自定义密码策略),lambda触发器创建的是默认配置。 "Overriding a generated User Pool" 标题下描述了修复。
您在“资源”部分的用户池键前面加上 CognitoUserPool
,这将导致您的触发器和资源在生成的 CloudFormation 模板中引用同一个用户池。
在你的情况下,这意味着简单地改变这个:
resources:
Resources:
MyUserPool:
Type: "AWS::Cognito::UserPool"
对此:
resources:
Resources:
CognitoUserPoolMyUserPool:
Type: "AWS::Cognito::UserPool"
已使用无服务器 1.26.0 进行测试
正确的方法是在您的函数 cognitoUserPool 属性上设置 existing: true
,如下所示...
createAuthChallenge:
handler: services/auth/createAuthChallenge.handler
events:
- cognitoUserPool:
pool: ${self:custom.stage}-user-pool
trigger: CreateAuthChallenge
existing: true
Serverless added support 2019 年 7 月。