カスタム属性を持つCognitoユーザプールを作成してみた

2020.08.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、CX事業本部の若槻です。

AWSのユーザーディレクトリ機能であるAmazon Cognitoユーザープールでは、ユーザー属性としてあらかじめ仕様が決められた標準属性のほかに、管理者が任意の仕様を定義できるカスタム属性が使用できます。

今回は、カスタム属性を持つCognitoユーザプールを、マネジメントコンソールとAWS CLIの2パターンにより作成してみました。

マネジメントコンソールから作成

まず、マネジメントコンソールからCognitoユーザプールを作成してみます。

Cognitoユーザープールのコンソールにアクセスして、[ユーザープールを作成する]をクリック。 image.png

プール名を指定して、今回は[デフォルトを確認する]をクリック。 image.png

[カスタム属性の選択...]をクリック。 image.png

[カスタム属性の追加]をクリック。 image.png

追加したいカスタム属性の情報を指定(今回は属性名attr01)し、さらに必要数だけ[別の属性の追加]をクリックして同様に情報を指定します。[次のステップ]をクリック。 image.png

[確認]画面で、指定したカスタム属性が追加されていることを確認し、[プールの作成]をクリック。 image.png

作成できました。カスタム属性名は接頭辞としてcustom:が付くようです。 image.png

ユーザープール一覧を開くと作成したユーザープールが表示されています。 image.png

ユーザープールの[全般設定] - [属性]を見るとカスタム属性custom:attr01が追加されています。[別の属性の追加]からカスタム属性の追加も可能なようです。 image.png

追加したカスタム属性の詳細をAWS CLIで取得してみると、コンソールでの追加時に指定ができなかったDeveloperOnlyAttribute(開発者が変更可能な属性であるかどうか)項目はfalseとなっています。

% aws cognito-idp describe-user-pool --user-pool-id ap-northeast-1_AwJpGCDnr
{
    "UserPool": {
        "Id": "ap-northeast-1_AwJpGCDnr",
        "Name": "myPool01",
        ...
        "SchemaAttributes": [
             ...
            {
                "Name": "custom:attr01",
                "AttributeDataType": "String",
                "DeveloperOnlyAttribute": false,
                "Mutable": true,
                "Required": false,
                "StringAttributeConstraints": {
                    "MinLength": "1",
                    "MaxLength": "256"
                }
            }
        ],
    ...
    }
}

また、コンソールから追加時にはAttributeDataType項目はstringnumberしか選択できず、CLIからは指定可能であるDateTimeBooleanは選択できませんでした。 image.png

これら項目を設定したい場合はAWS CLIによるユーザープールの作成(カスタム属性の追加)が必要のようです。

ちなみにドキュメントにある通り、カスタム属性は必須(Required)を有効とすることはできません。

AWS CLIで作成

次に、AWS CLIでCognitoユーザプールを作成してみます。

カスタム属性を持つCognitoユーザプールをAWS CLIコマンドで作成する場合は、aws cognito-idp create-user-poolコマンドでschemaオプションを使用します。

% aws cognito-idp create-user-pool \
    --pool-name myPool02 \
    --schema \
        Name=attr01,AttributeDataType=DateTime,Mutable=true \
        Name=attr02,AttributeDataType=Boolean,DeveloperOnlyAttribute=true,Mutable=true

{
    "UserPool": {
        "Id": "ap-northeast-1_y98UhYIdX",
        "Name": "myPool02",
        ...
        "SchemaAttributes": [
             ...
            {
                "Name": "custom:attr01",
                "AttributeDataType": "DateTime",
                "DeveloperOnlyAttribute": false,
                "Mutable": true,
                "Required": false
            },
            {
                "Name": "dev:custom:attr02",
                "AttributeDataType": "Boolean",
                "DeveloperOnlyAttribute": true,
                "Mutable": true,
                "Required": false
            }
        ],
    ...
    }
}

コンソールからも作成されたユーザープールにカスタム属性が追加されていることが確認できます。DeveloperOnlyAttribute項目をtrueとした場合は属性名の接頭辞にさらにdev:が付くようです。 image.png

補足

create-user-poolコマンドのドキュメントではschemaオプションではRequired項目が指定可能であるように記載されていますが、実際に指定してコマンドを実行すると次のようにRequired custom attributes are not supported currently.というエラーとなります。

% aws cognito-idp create-user-pool --pool-name myPool02 \        
    --schema Name=attr02,AttributeDataType=Boolean,DeveloperOnlyAttribute=true,Mutable=true,Required=true

An error occurred (InvalidParameterException) when calling the CreateUserPool operation: Required custom attributes are not supported currently.

AWSフォーラムを見るとこれはドキュメントの記載ミスであり、実際にはRequired項目はschemaで指定可能な項目ではないようです。

参考

以上