WP-KyotoHome (日本語)Home (English)AboutPrivacy policyLicensesGitHub
AWSCognito User PoolServerless FW

CloudFormationとServerless FrameworkでCognito User PoolとApp Clientsを作成する

前回の記事では、User Poolを作成して終わりでした。
しかしSPAなどで実際に使用する場合には、外部からUser PoolにアクセスするためのApp Clientを作成する必要があります。

このApp ClientもCloudFormationで定義できますので、早速やっていきましょう。

完成品

今回も完成品から。
UserPoolと、App Clientを1つずつ作成します。

---
AWSTemplateFormatVersion: '2010-09-09'
Description: 'WordPress: fault tolerant and scalable, a cloudonaut.io template'
Resources:
  UserPool:
    Type: "AWS::Cognito::UserPool"
    Properties:
      AdminCreateUserConfig:
          AllowAdminCreateUserOnly: false
          UnusedAccountValidityDays: 7
      AliasAttributes:
        - email
      AutoVerifiedAttributes:
        - email
      EmailVerificationMessage: "Your verification code is {####}."
      EmailVerificationSubject: "Your verification code"
      MfaConfiguration: 'OFF'
      Policies:
        PasswordPolicy:
          MinimumLength: 8
          RequireLowercase: true
          RequireNumbers: true
          RequireSymbols: true
          RequireUppercase: true
      UserPoolName:
        Ref: AWS::StackName
      Schema:
        - AttributeDataType: "String"
          DeveloperOnlyAttribute: false
          Mutable: true
          Name: "email"
          StringAttributeConstraints:
            MaxLength: "2048"
            MinLength: "0"
          Required: true
        - AttributeDataType: "String"
          DeveloperOnlyAttribute: false
          Mutable: true
          Name: "name"
          StringAttributeConstraints:
            MaxLength: "2048"
            MinLength: "0"
          Required: false
        - AttributeDataType: "String"
          DeveloperOnlyAttribute: false
          Mutable: true
          Name: "custom-attributes"
          StringAttributeConstraints:
            MaxLength: "2048"
            MinLength: "0"
          Required: false
      SmsAuthenticationMessage:  "Your authentication code is {####}."
      SmsVerificationMessage: "Your verification code is {####}."
      UserPoolTags:
        Name: 'Test'
  UserPoolClient:
    Type: "AWS::Cognito::UserPoolClient"
    Properties:
        ClientName:
          Ref: AWS::StackName
        GenerateSecret: false
        ExplicitAuthFlows:
          - "ADMIN_NO_SRP_AUTH"
        ReadAttributes:
          - "email"
          - "name"
          - "custom:custom-attributes"
        RefreshTokenValidity: 30
        UserPoolId:
          Ref: UserPool
        WriteAttributes:
          - "email"
          - "name"
          - "custom:custom-attributes"
Outputs:
  UserPoolClientId:
    Description: 'The name of the user pool client'
    Value:
      Ref: UserPoolClient
  UserPoolId:
    Description: 'The name of the user pool'
    Value:
      Ref: UserPool

Tips

AWS::Cognito::UserPoolClientでカスタム属性をサポートする

SPAなどからカスタム属性の値を参照したり変更したい場合、AWS::Cognito::UserPoolClientに読み書きの権限をつける必要があります。
読み込み権限をつけたい場合はReadAttributesに、書き込み権限はWriteAttributesに属性名を書きましょう。
ただし、このときAWS::Cognito::UserPoolで指定した値をそのまま入れるとエラーになります。

デフォルトにない、カスタム属性はかならずcustom:というプレフィックスがつくので、忘れずに入れましょう。

Serverless Frameworkで作る場合

resourcesの中にCloudFormationのコードをそのまま書くことができます。
AWS CloudFormation Resource Reference(serverless.com)

ということで、先ほどのテンプレートのResources:以下をそのままserverless.ymlに突っ込めばOKです。

service: usersCrud
provider: aws
functions:
  ...

resources:  // CloudFormation template syntax
  Resources:
    UserPool:
      Type: "AWS::Cognito::UserPool"
      Properties:
        ...
  Resources:
    UserPool:
      Type: "AWS::Cognito::UserPool"
      Properties:
        ...

ClientNameやUserPoolNameは、Ref: AWS::StackNameでServerless Frameworkが作成するCloudFormationスタック名にしておくのが良さそうです。
動的に生成できる名前にしておかないと、stageをわけてデプロイした時にコンフリクトする恐れがありますので要注意です。

GitHubHomeEnglish