Amazon Cognitoを、CloudFormationで作って簡単に使ってみる

記事タイトルとURLをコピーする

みなさんこんにちは、荒堀と申します。

AWSには、サインアップやサインイン機能を提供してくれる、Amazon Cognitoというサービスがあります。

aws.amazon.com

Webサイト作成の際にサインアップ・サインイン機能を作っていた方にとっては、大変便利なサービスと思います。

ですがAWSのマネジメントコンソールで一から作成しようとすると設定項目が多く、「試しに触ってみたい」と思って作ると手間がかかります。

そのため今回、シンプルな構成を作成するCloudFormationテンプレートを作りました。

行うこと

準備するもの

  • 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月入社