This plugin allows you to add custom attributes to an existing CloudFormation-managed Cognito User Pool from serverless without losing all your users. At the time of writing (June 2018) CloudFormation doesn't know how to add custom attributes to a user pool without dropping and re-creating it, thus losing all your users.
This plugin also adds the specified attributes to a User Pool Client, giving that client read and write permissions for the new attribute.
- Node 8+
- serverless 1+
Install npm i serverless-cognito-add-custom-attributes, then add serverless-cognito-add-custom-attributes to your serverless.yml plugins list.
plugins: - serverless-cognito-add-custom-attributes custom: CognitoAddCustomAttributes: CognitoUserPoolIdOutputKey: "CognitoUserPoolApplicationUserPoolId" # The key of the outputted UserPool Ref CognitoUserPoolClientIdOutputKey: "CognitoUserPoolApplicationUserPoolClientId" # The key of the outputted UserPoolClient Ref CustomAttributes: - AttributeDataType: String DeveloperOnlyAttribute: False Mutable: True Name: "another" # this will end up being custom:another Required: False # Only add this if not already outputting the Cognito User Pool and Client IDs, otherwise, refer to the existing outputs in the custom:CognitoAddCustomAttributes section resources: Outputs: CognitoUserPoolApplicationUserPoolId: Value: Ref: CognitoUserPoolApplicationUserPool CognitoUserPoolApplicationUserPoolClientId: Value: Ref: CognitoUserPoolApplicationUserPoolClient- Output your UserPoolId via
resources.Outputs - Output your UserPoolClientId via
resources.Outputs - Add
CognitoAddCustomAttributestocustomwith the following structure:
CognitoUserPoolIdOutputKey: "UserPool Output Key as a String" CognitoUserPoolClientIdOutputKey: "UserPoolClient Output Key as a String" CustomAttributes: - AttributeDataType: String DeveloperOnlyAttribute: False Mutable: True Name: "another" Required: FalseNote: If you have multiple userPool-userPoolClients you can specify them as an array as well
Example:
plugins: - serverless-cognito-add-custom-attributes custom: CognitoAddCustomAttributes: - CognitoUserPoolIdOutputKey: "CognitoUserPoolApplicationUserPoolId" CognitoUserPoolClientIdOutputKey: "CognitoUserPoolApplicationUserPoolClientId" CustomAttributes: - AttributeDataType: String DeveloperOnlyAttribute: False Mutable: True Name: "another" # this will end up being custom:another Required: False - CognitoUserPoolIdOutputKey: "CognitoUserPoolApplicationUserPoolId" CognitoUserPoolClientIdOutputKey: "CognitoUserPoolApplicationUserPoolClientId2" CustomAttributes: - AttributeDataType: String DeveloperOnlyAttribute: False Mutable: True Name: "another" # this will end up being custom:another Required: False resources: Outputs: CognitoUserPoolApplicationUserPoolId: Value: Ref: CognitoUserPoolApplicationUserPool CognitoUserPoolApplicationUserPoolClientId: Value: Ref: CognitoUserPoolApplicationUserPoolClient CognitoUserPoolApplicationUserPoolClientId2: Value: Ref: CognitoUserPoolApplicationUserPoolClient2The names of your attributes supplied here will appear as custom:{name} when deployed.
For more information on the schema of attributes see: https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SchemaAttributeType.html