Skip to content

user-pool resource

Source: internal/service/cognitoidp/user_pool_types.go:139

Example usage:

imports: {
  aws-cognitoidp: 'github.com/cloudboss/unobin-library-aws//service/cognitoidp'
}

resources: {
  example: aws-cognitoidp.user-pool {
    # Set input fields here.
  }
}

Inputs

name

string

required

account-recovery-setting

optional(object)
optional(
  object({
    recovery-mechanisms: list(
      object({
        name: string
        priority: integer
      })
    )
  })
)

admin-create-user-config

optional(object)
optional(
  object({
    allow-admin-create-user-only: optional(boolean)
    invite-message-template: optional(
      object({
        email-message: optional(string)
        email-subject: optional(string)
        sms-message: optional(string)
      })
    )
    unused-account-validity-days: optional(integer)
  })
)

alias-attributes

optional(list(string))

auto-verified-attributes

optional(list(string))

deletion-protection

optional(string)

device-configuration

optional(object)
optional(
  object({
    challenge-required-on-new-device: optional(boolean)
    device-only-remembered-on-user-prompt: optional(boolean)
  })
)

email-configuration

optional(object)
optional(
  object({
    configuration-set: optional(string)
    email-sending-account: optional(string)
    from-email-address: optional(string)
    reply-to-email-address: optional(string)
    source-arn: optional(string)
  })
)

email-verification-message

optional(string)

email-verification-subject

optional(string)

lambda-config

optional(object)
optional(
  object({
    create-auth-challenge: optional(string)
    custom-email-sender: optional(
      object({
        lambda-arn: string
        lambda-version: string
      })
    )
    custom-message: optional(string)
    custom-sms-sender: optional(
      object({
        lambda-arn: string
        lambda-version: string
      })
    )
    define-auth-challenge: optional(string)
    inbound-federation: optional(
      object({
        lambda-arn: string
        lambda-version: string
      })
    )
    kms-key-id: optional(string)
    post-authentication: optional(string)
    post-confirmation: optional(string)
    pre-authentication: optional(string)
    pre-sign-up: optional(string)
    pre-token-generation: optional(string)
    pre-token-generation-config: optional(
      object({
        lambda-arn: string
        lambda-version: string
      })
    )
    user-migration: optional(string)
    verify-auth-challenge-response: optional(string)
  })
)

mfa-configuration

optional(string)

enabled-mfas

optional(list(string))

email-mfa-configuration

optional(object)
optional(
  object({
    message: optional(string)
    subject: optional(string)
  })
)

password-policy

optional(object)
optional(
  object({
    minimum-length: optional(integer)
    password-history-size: optional(integer)
    require-lowercase: optional(boolean)
    require-numbers: optional(boolean)
    require-symbols: optional(boolean)
    require-uppercase: optional(boolean)
    temporary-password-validity-days: optional(integer)
  })
)

sign-in-policy

optional(object)
optional(
  object({
    allowed-first-auth-factors: optional(list(string))
  })
)

schema

optional(list(object))
optional(
  list(
    object({
      attribute-data-type: string
      developer-only-attribute: optional(boolean)
      mutable: optional(boolean)
      name: string
      number-attribute-constraints: optional(
        object({
          max-value: optional(string)
          min-value: optional(string)
        })
      )
      required: optional(boolean)
      string-attribute-constraints: optional(
        object({
          max-length: optional(string)
          min-length: optional(string)
        })
      )
    })
  )
)

sms-authentication-message

optional(string)

sms-configuration

optional(object)
optional(
  object({
    sns-caller-arn: string
    external-id: optional(string)
    sns-region: optional(string)
  })
)

sms-verification-message

optional(string)

tags

optional(map(string))

user-attribute-update-settings

optional(object)
optional(
  object({
    attributes-require-verification-before-update: list(string)
  })
)

user-pool-add-ons

optional(object)
optional(
  object({
    advanced-security-additional-flows: optional(
      object({
        custom-auth-mode: optional(string)
      })
    )
    advanced-security-mode: string
  })
)

user-pool-tier

optional(string)

username-attributes

optional(list(string))

username-configuration

optional(object)
optional(
  object({
    case-sensitive: boolean
  })
)

verification-message-template

optional(object)
optional(
  object({
    default-email-option: optional(string)
    email-message: optional(string)
    email-message-by-link: optional(string)
    email-subject: optional(string)
    email-subject-by-link: optional(string)
    sms-message: optional(string)
  })
)

web-authn-configuration

optional(object)
optional(
  object({
    factor-configuration: optional(string)
    relying-party-id: optional(string)
    user-verification: optional(string)
  })
)

Input Constraints

Name rules

name must contain at least 1 character.

Rule logic
Require
@core.length(input.name) >= 1

name must contain at most 128 characters.

Rule logic
Require
@core.length(input.name) <= 128

Alias attributes rules

alias-attributes holds at most 3 entries.

Rule logic
Require
@core.length(input.alias-attributes ?? []) <= 3

alias-attributes values must be valid alias attributes.

Rule logic
For each
input.alias-attributes ?? []
Require
@each.value == 'email'
|| @each.value == 'phone_number'
|| @each.value == 'preferred_username'

Username attributes rules

username-attributes holds at most 2 entries.

Rule logic
Require
@core.length(input.username-attributes ?? []) <= 2

username-attributes values must be email or phone_number.

Rule logic
For each
input.username-attributes ?? []
Require
@each.value == 'email'
|| @each.value == 'phone_number'

Field combinations

alias-attributes conflicts with username-attributes.

unused-account-validity-days conflicts with temporary-password-validity-days.

Auto verified attributes rules

auto-verified-attributes holds at most 2 entries.

Rule logic
Require
@core.length(input.auto-verified-attributes ?? []) <= 2

auto-verified-attributes values must be email or phone_number.

Rule logic
For each
input.auto-verified-attributes ?? []
Require
@each.value == 'email'
|| @each.value == 'phone_number'

Deletion protection rules

deletion-protection must be ACTIVE or INACTIVE.

Rule logic
When
input.deletion-protection != null
Require
input.deletion-protection == 'ACTIVE'
|| input.deletion-protection == 'INACTIVE'

Account recovery setting rules

recovery-mechanisms must contain 1 or 2 entries.

Rule logic
When
input.account-recovery-setting != null
Require
(input.account-recovery-setting.recovery-mechanisms == null || @core.length(input.account-recovery-setting.recovery-mechanisms) >= 1)
&& @core.length(input.account-recovery-setting.recovery-mechanisms ?? []) <= 2

recovery mechanism name is invalid.

Rule logic
For each
input.account-recovery-setting.recovery-mechanisms ?? []
Require
@each.value.name == 'admin_only'
|| @each.value.name == 'verified_email'
|| @each.value.name == 'verified_phone_number'

recovery mechanism priority must be 1 or 2.

Rule logic
For each
input.account-recovery-setting.recovery-mechanisms ?? []
Require
@each.value.priority >= 1
&& @each.value.priority <= 2

Admin create user config rules

unused-account-validity-days must be between 0 and 365.

Rule logic
When
input.admin-create-user-config.unused-account-validity-days != null
Require
input.admin-create-user-config.unused-account-validity-days >= 0
&& input.admin-create-user-config.unused-account-validity-days <= 365

Email configuration rules

email-sending-account must be COGNITO_DEFAULT or DEVELOPER.

Rule logic
When
input.email-configuration.email-sending-account != null
Require
input.email-configuration.email-sending-account == 'COGNITO_DEFAULT'
|| input.email-configuration.email-sending-account == 'DEVELOPER'

Lambda config rules

custom-email-sender lambda-version must be V1_0.

Rule logic
When
input.lambda-config.custom-email-sender != null
Require
input.lambda-config.custom-email-sender.lambda-version == 'V1_0'

custom-sms-sender lambda-version must be V1_0.

Rule logic
When
input.lambda-config.custom-sms-sender != null
Require
input.lambda-config.custom-sms-sender.lambda-version == 'V1_0'

pre-token-generation-config lambda-version is invalid.

Rule logic
When
input.lambda-config.pre-token-generation-config != null
Require
input.lambda-config.pre-token-generation-config.lambda-version == 'V1_0'
|| input.lambda-config.pre-token-generation-config.lambda-version == 'V2_0'
|| input.lambda-config.pre-token-generation-config.lambda-version == 'V3_0'

inbound-federation lambda-version must be V1_0.

Rule logic
When
input.lambda-config.inbound-federation != null
Require
input.lambda-config.inbound-federation.lambda-version == 'V1_0'

custom senders require kms-key-id.

Rule logic
When
input.lambda-config.custom-email-sender != null
|| input.lambda-config.custom-sms-sender != null
Require
input.lambda-config.kms-key-id != null

pre-token-generation Lambda ARNs must match.

Rule logic
When
input.lambda-config.pre-token-generation != null
&& input.lambda-config.pre-token-generation-config != null
Require
input.lambda-config.pre-token-generation-config.lambda-arn == input.lambda-config.pre-token-generation

Mfa configuration rules

mfa-configuration must be OFF, ON, or OPTIONAL.

Rule logic
When
input.mfa-configuration != null
Require
input.mfa-configuration == 'OFF'
|| input.mfa-configuration == 'ON'
|| input.mfa-configuration == 'OPTIONAL'

ON or OPTIONAL MFA requires an enabled factor.

Rule logic
When
input.mfa-configuration == 'ON'
|| input.mfa-configuration == 'OPTIONAL'
Require
@core.length(input.enabled-mfas ?? []) >= 1
|| input.web-authn-configuration.factor-configuration == 'MULTI_FACTOR_WITH_USER_VERIFICATION'

OFF MFA forbids enabled factors.

Rule logic
When
input.mfa-configuration == null
|| input.mfa-configuration == 'OFF'
Require
@core.length(input.enabled-mfas ?? []) <= 0
&& !(input.web-authn-configuration.factor-configuration == 'MULTI_FACTOR_WITH_USER_VERIFICATION')

Enabled mfas rules

enabled-mfas holds at most 3 entries.

Rule logic
Require
@core.length(input.enabled-mfas ?? []) <= 3

enabled-mfas contains an invalid factor.

Rule logic
For each
input.enabled-mfas ?? []
Require
@each.value == 'SMS_MFA'
|| @each.value == 'EMAIL_OTP'
|| @each.value == 'SOFTWARE_TOKEN_MFA'

Web authn configuration rules

web-authn factor-configuration is invalid.

Rule logic
When
input.web-authn-configuration.factor-configuration != null
Require
input.web-authn-configuration.factor-configuration == 'SINGLE_FACTOR'
|| input.web-authn-configuration.factor-configuration == 'MULTI_FACTOR_WITH_USER_VERIFICATION'

web-authn user-verification must be required or preferred.

Rule logic
When
input.web-authn-configuration.user-verification != null
Require
input.web-authn-configuration.user-verification == 'required'
|| input.web-authn-configuration.user-verification == 'preferred'

web-authn relying-party-id must be 1 to 63 characters.

Rule logic
When
input.web-authn-configuration.relying-party-id != null
Require
@core.length(input.web-authn-configuration.relying-party-id) >= 1
&& @core.length(input.web-authn-configuration.relying-party-id) <= 63

multi-factor WebAuthn requires verification and an eligible tier.

Rule logic
When
input.web-authn-configuration.factor-configuration == 'MULTI_FACTOR_WITH_USER_VERIFICATION'
Require
input.web-authn-configuration.user-verification == 'required'
&& ((input.user-pool-tier == null) || (input.user-pool-tier == 'ESSENTIALS' || input.user-pool-tier == 'PLUS'))

Password policy rules

password minimum-length must be between 6 and 99.

Rule logic
When
input.password-policy.minimum-length != null
Require
input.password-policy.minimum-length >= 6
&& input.password-policy.minimum-length <= 99

password-history-size must be between 0 and 24.

Rule logic
When
input.password-policy.password-history-size != null
Require
input.password-policy.password-history-size >= 0
&& input.password-policy.password-history-size <= 24

temporary-password-validity-days must be between 0 and 365.

Rule logic
When
input.password-policy.temporary-password-validity-days != null
Require
input.password-policy.temporary-password-validity-days >= 0
&& input.password-policy.temporary-password-validity-days <= 365

password history requires advanced security.

Rule logic
When
input.password-policy.password-history-size != null
&& (input.password-policy.password-history-size == null || input.password-policy.password-history-size > 0)
Require
input.user-pool-add-ons.advanced-security-mode == 'AUDIT'
|| input.user-pool-add-ons.advanced-security-mode == 'ENFORCED'

Sign in policy rules

allowed-first-auth-factors must contain 1 to 4 entries.

Rule logic
When
input.sign-in-policy != null
Require
(input.sign-in-policy.allowed-first-auth-factors == null || @core.length(input.sign-in-policy.allowed-first-auth-factors) >= 1)
&& @core.length(input.sign-in-policy.allowed-first-auth-factors ?? []) <= 4

allowed-first-auth-factors contains an invalid factor.

Rule logic
For each
input.sign-in-policy.allowed-first-auth-factors ?? []
Require
@each.value == 'PASSWORD'
|| @each.value == 'EMAIL_OTP'
|| @each.value == 'SMS_OTP'
|| @each.value == 'WEB_AUTHN'

sign-in-policy requires user-pool-tier ESSENTIALS or PLUS.

Rule logic
When
input.sign-in-policy != null
Require
input.user-pool-tier == null
|| (input.user-pool-tier == 'ESSENTIALS' || input.user-pool-tier == 'PLUS')

Schema rules

schema must contain 1 to 50 attributes.

Rule logic
When
input.schema != null
Require
@core.length(input.schema) >= 1
&& @core.length(input.schema) <= 50

schema attribute-data-type is invalid.

Rule logic
For each
input.schema ?? []
Require
@each.value.attribute-data-type == 'String'
|| @each.value.attribute-data-type == 'Number'
|| @each.value.attribute-data-type == 'DateTime'
|| @each.value.attribute-data-type == 'Boolean'

string-attribute-constraints requires String.

Rule logic
For each
input.schema ?? []
When
@each.value.string-attribute-constraints != null
Require
@each.value.attribute-data-type == 'String'

number-attribute-constraints requires Number.

Rule logic
For each
input.schema ?? []
When
@each.value.number-attribute-constraints != null
Require
@each.value.attribute-data-type == 'Number'

Verification message template rules

default-email-option must be CONFIRM_WITH_CODE or CONFIRM_WITH_LINK.

Rule logic
When
input.verification-message-template.default-email-option != null
Require
input.verification-message-template.default-email-option == 'CONFIRM_WITH_CODE'
|| input.verification-message-template.default-email-option == 'CONFIRM_WITH_LINK'

User attribute update settings rules

attributes-require-verification-before-update holds at most 2 entries.

Rule logic
Require
@core.length(input.user-attribute-update-settings.attributes-require-verification-before-update ?? []) <= 2

verification attributes must be email or phone_number.

Rule logic
For each
input.user-attribute-update-settings.attributes-require-verification-before-update ?? []
Require
@each.value == 'email'
|| @each.value == 'phone_number'

User pool add ons rules

advanced-security-mode must be OFF, AUDIT, or ENFORCED.

Rule logic
When
input.user-pool-add-ons != null
Require
input.user-pool-add-ons.advanced-security-mode == 'OFF'
|| input.user-pool-add-ons.advanced-security-mode == 'AUDIT'
|| input.user-pool-add-ons.advanced-security-mode == 'ENFORCED'

custom-auth-mode must be AUDIT or ENFORCED.

Rule logic
When
input.user-pool-add-ons.advanced-security-additional-flows.custom-auth-mode != null
Require
input.user-pool-add-ons.advanced-security-additional-flows.custom-auth-mode == 'AUDIT'
|| input.user-pool-add-ons.advanced-security-additional-flows.custom-auth-mode == 'ENFORCED'

advanced security requires user-pool-tier PLUS.

Rule logic
When
input.user-pool-add-ons != null
&& input.user-pool-add-ons.advanced-security-mode != 'OFF'
Require
input.user-pool-tier == 'PLUS'

User pool tier rules

user-pool-tier must be LITE, ESSENTIALS, or PLUS.

Rule logic
When
input.user-pool-tier != null
Require
input.user-pool-tier == 'LITE'
|| input.user-pool-tier == 'ESSENTIALS'
|| input.user-pool-tier == 'PLUS'

Tags rules

tags holds at most 50 entries.

Rule logic
Require
@core.length(input.tags ?? {}) <= 50

Outputs

user-pool-id

string

arn

string

provider-name

string

provider-url

string

endpoint

string

creation-date

string

last-modified-date

string

domain

string

custom-domain

string

estimated-number-of-users

integer

user-pool-tier

string