AWS CloudFormationでCognitoを構築してみる

# はじめに
今回はCloudFormationを用いて、AWS Cognitoを構築していきたいと思います。
AWS CognitoはAWSが提供するユーザー認証サービスです。
今回はCognitoを単体で構築し、利用できるところまでやっていきたいと思います。

# 目次
・Cognitoの設定項目
・CloudFormation作成
・利用検証
・最後に
・参考

# Cognitoの設定項目
今回はEメールアドレスを利用したサインインでの実施を想定しています。
また多要素認証はAuthenticator アプリケーションで実施します
アプリケーション統合のコールバックURL設定はhttps://www.yahoo.co.jp/にしております。

上記以外の項目についてはCloudFormationの設定をを見てご確認ください



# CloudFormation作成
Cognitoのユーザープールとそれに関係するユーザープールドメインやユーザープールクライアントを作成します

```yaml:Cognito.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31

Description: >
  CognitoUserPool deployment

#------------------------------------------------------------#
#Parameters
#------------------------------------------------------------#
Parameters:
  PJPrefix:
    Description: Project Name
    Type: String
    Default: pj-ogataro
    AllowedPattern: ^[a-zA-Z0-9\-]*$
  Environment:
    Description: Environment Name
    Type: String
    Default: dev
    AllowedPattern: ^[a-zA-Z0-9\-]*$


#------------------------------------------------------------#
#Resources
#------------------------------------------------------------#
Resources:
  ##ユーザープール作成
  UserPool:
    Type: AWS::Cognito::UserPool 
    Properties:
      UserPoolName: !Sub '${PJPrefix}-${Environment}-UserPool'
      AdminCreateUserConfig:
        AllowAdminCreateUserOnly: False
      UsernameAttributes:
        - email # Eメールでのサインインを有効にする場合は"email"を指定
      AccountRecoverySetting:
        RecoveryMechanisms:
          - Name: verified_email
            Priority: 1
      MfaConfiguration: 'ON'
      EnabledMfas:
        - SOFTWARE_TOKEN_MFA #アプリケーションでのMFA
      AutoVerifiedAttributes:
        - email
    UpdateReplacePolicy: Retain
    DeletionPolicy: Delete

  #ユーザープールドメイン作成
  UserPoolDomain:
    Type: AWS::Cognito::UserPoolDomain
    Properties:
      Domain: !Sub '${PJPrefix}-${Environment}-domain' 
      UserPoolId: !Ref UserPool

  #アプリケーション統合作成
  AppIntegration:
    Type: AWS::Cognito::UserPoolClient
    Properties:
      CallbackURLs: 
        - https://www.yahoo.co.jp/
      ClientName: !Sub '${PJPrefix}-${Environment}-cognito-app'
      UserPoolId: !Ref UserPool
      RefreshTokenValidity: 1
      SupportedIdentityProviders:
        - COGNITO
      AllowedOAuthFlows:
        - code
      AllowedOAuthScopes:
        - openid

#------------------------------------------------------------#
#Outputs
#------------------------------------------------------------#
Outputs:
  UserPool:
    Value: !Ref UserPool
    Export:
      Name: !Sub '${PJPrefix}-${Environment}-CognitoUserPool-Output'
```

# 利用検証
作成したCognitoのユーザープールからアプリケーションの統合で作成したアプリケーションクライアントを選択。
ホストされたUIから「ホストされたUIを表示」をクリックします。
そこでSignUPでユーザーの登録及びMFAの連携を実施し、サインイン出来れば完了です。
※上手くコールバックが成功しない時がありますので、その際はマネジメントコンソールからコールバックURLを他のURLや書き直すと上手くいく場合があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513082/91ea480d-7356-dcf4-a97c-8cb6fd7af010.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513082/2c2da777-beff-d973-2350-0e0e80b9f817.png)

# 最後に
こちらでCognito単体を導入する手順は完了です。
今度はCloudFrontとの連携の記事を投稿できればと思います。
参考になれば、幸いです。

# 参考サイト
Cognito

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-userpool.html