みなさんこんにちは、荒堀と申します。
AWSには、サインアップやサインイン機能を提供してくれる、Amazon Cognitoというサービスがあります。
Webサイト作成の際にサインアップ・サインイン機能を作っていた方にとっては、大変便利なサービスと思います。
ですがAWSのマネジメントコンソールで一から作成しようとすると設定項目が多く、「試しに触ってみたい」と思って作ると手間がかかります。
そのため今回、シンプルな構成を作成するCloudFormationテンプレートを作りました。
行うこと
- Amazon CognitoのユーザープールをCloudFormationで作成
- Amazon CognitoにはIDプールという、"AWSのサービスへのアクセス権をユーザーに付与する"という機能がありますが、今回は対象外です。
- 参考:AWS::Cognito::UserPool - AWS CloudFormation
- CLIにて、ユーザーの登録と認証
準備するもの
- AWSマネジメントコンソール
- AWS CloudShell
- マネジメントコンソールから起動できる、ブラウザベースのシェル環境
やってみる
作成
まず以下のコードを、createSampleCognito.yaml
などのファイル名で保存します。
AWSTemplateFormatVersion: "2010-09-09" Resources: UserPool: Type: AWS::Cognito::UserPool Properties: UserPoolName: Fn::Join: - "" - - Ref: AWS::StackName - Users AccountRecoverySetting: RecoveryMechanisms: - Name: admin_only Priority: 1 AdminCreateUserConfig: AllowAdminCreateUserOnly: true AliasAttributes: - preferred_username DeletionProtection: ACTIVE Policies: PasswordPolicy: MinimumLength: 8 RequireLowercase: true RequireNumbers: true RequireSymbols: true RequireUppercase: true UserPoolClient: Type: AWS::Cognito::UserPoolClient Properties: ClientName: Fn::Join: - "" - - Ref: AWS::StackName - Users-client GenerateSecret: false RefreshTokenValidity: 30 ExplicitAuthFlows: - ALLOW_ADMIN_USER_PASSWORD_AUTH - ALLOW_USER_SRP_AUTH - ALLOW_REFRESH_TOKEN_AUTH UserPoolId: Ref: UserPool
保存したファイルを使って、CloudFormationから作成します。今回はマネジメントコンソールから作りました。
CloudFormationスタックの名前を指定し、以降は指定する項目はありませんので、そのまま作成します。
ユーザー作成・認証
以降の操作には、ユーザープールIDとユーザープールクライアントIDが必要になります。 作成したCloudFormationスタックのリソースのタブに"物理ID"として記載されています。
コンソールの左下のCloudShellを起動して、先ほどのID二つを変数にセットします。
USER_POOL_ID=[先ほどのID] CLIENT_ID=[先ほどのID]
次に、ユーザー名とパスワードも変数にセットします。
USER_NAME="SabawaIchiro" PASSWORD="Test#20230824"
では、ユーザープールにユーザーを登録します。
aws cognito-idp admin-create-user \ --user-pool-id ${USER_POOL_ID} \ --username ${USER_NAME}
登録しただけでは有効化されません。画面上では以下のようになり、パスワードの変更が求められています。
パスワードを変更して確認ステータスを更新します。
aws cognito-idp admin-set-user-password \ --user-pool-id ${USER_POOL_ID} \ --username ${USER_NAME} \ --password ${PASSWORD} \ --permanent
登録ユーザーで認証するコマンドは以下になります。
aws cognito-idp admin-initiate-auth \ --user-pool-id ${USER_POOL_ID} \ --client-id ${CLIENT_ID} \ --auth-flow ADMIN_NO_SRP_AUTH \ --auth-parameters "USERNAME=${USER_NAME},PASSWORD=${PASSWORD}"
成功すると、以下のようなトークンを返してくれます。
{ "ChallengeParameters": {}, "AuthenticationResult": { "AccessToken": "[トークン文字列]", "ExpiresIn": 3600, "TokenType": "Bearer", "RefreshToken": "[トークン文字列]", "IdToken": "[トークン文字列]" } }
作成から認証まで、数ステップでできました!
片付け
削除の際は、削除保護をかけているので、まずその設定を非アクティブ化します。 [ユーザープールのプロパティ]タブから、削除保護にある非アクティブ化"ボタンで変更します。
あとはCloudFormationで作ったため、スタックを削除するだけで削除されます。消すのも早くていいですね。
もしもコンソールから作ろうとすると
CloudFormationで作ったものと同様のものを、マネジメントコンソールから作成しようとすると、以下のようになります。
以上の画面操作を完了させてやっと、記事冒頭のCloudFormationテンプレートと同様のリソースが構築されます。
おわりに
今回のAmazon Cognitoに限らず、試しに作ったり、作成・削除を繰り返す場合でしたら、CloudFormationを使うのが早くミスなくできるかと思います。
少しでもAmazon Cognitoに興味を持たれた方のお力になれれば幸いです。
荒堀 直路(執筆記事の一覧)
2023年8月入社