CDK(Python)でCognitoリソースを作成してみた

#AWS
#Cognito
#CDK
#Python

 

CDKはAWS Cloud Development Kitの略称。 CloudFormationをPython, TypeScriptなどのプログラミング言語を使って作成し、 AWSリソースを一括で構築するテンプレートを作成できる

 

aws-cdkパッケージをグローバルのnpmにインストールする

$ npm install -g aws-cdk

 

無事インストールできているか確認

$ cdk --version 2.8.0 (build 8a5eb49)

 

$ mkdir cdk_test && cd cdk_test $ cdk init --language python

実行すると、自動で以下の様な初期ファイル群が作られる

cdk_test/ .venv ├ cdk_test/ │ ├ __init__.py │ └ cdk_test_stack.py .gitignore ├ app.py ├ cdk.json README.md ├ requirements-dev.txt ├ requirements.txt └ source.bat

Python virtual enviromentをアクティブ化し、仮想環境を構築 自動生成されたrequirements.txtを使ってaws-cdk-libのライブラリをインストールする

$ source .venv/bin/activate $ pip install -r requirements.txt

 

今回はCognitoのリソース群を構築したいため、ここからファイルを編集していく

 

  1. app.py
#!/usr/bin/env python3 import os import aws_cdk as cdk from cdk.cognito_stack import CognitoStack app = cdk.App() CognitoStack(app, "CdkStack") app.synth()

 

  1. cdk.context.jsonをroot配下に追加
{ "repository_name": "test-backend", "service_name": "test" }

 

  1. フォルダ名変更 cdk_test/cdk_test -> cdk_test/cdk さらにstackのファイル名を変更し、以下ファイルを貼り付ける cdk/cdk_test_stack.py -> cdk/cognito_stack.py
from aws_cdk import ( Stack, CfnOutput, aws_cognito as cognito, ) from constructs import Construct class CognitoStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) cognitouserpool = cognito.CfnUserPool( self, '{}UserPool'.format(self.node.try_get_context('service_name')), alias_attributes=['email', 'preferred_username'], auto_verified_attributes=['email'], schema=[ { 'name': 'email', 'mutable': True, 'required': True }, { 'name': 'name', 'mutable': True, 'required': False, }, { 'name': 'preferred_username', 'mutable': True, 'required': False }, { 'name': 'birthdate', 'mutable': True, 'required': False }, { 'name': 'gender', 'mutable': True, 'required': False }, { 'name': 'universal_id', 'attributeDataType': 'String', 'mutable': True, 'required': False } ], admin_create_user_config={ "allowAdminCreateUserOnly": False, "temporaryPasswordValidityDays": 7, }, policies={"passwordPolicy": { "minimumLength": 8, "requireLowercase": False, "requireNumbers": False, "requireSymbols": False, "requireUppercase": False, "temporaryPasswordValidityDays": 7 }}, lambda_config={ # "preSignUp": pre_sign_up_func.function_arn, # "postConfirmation": post_confirmation_func.function_arn, # "preAuthentication": pre_authentication_func.function_arn, # "postAuthentication": post_authentication_func.function_arn, # "customMessage": custom_message_func.function_arn } ) webclient = cognito.CfnUserPoolClient(self, '{}Webclient'.format(self.node.try_get_context('service_name')), user_pool_id=cognitouserpool.ref, generate_secret=False, refresh_token_validity=1, explicit_auth_flows=[ "ALLOW_ADMIN_USER_PASSWORD_AUTH", "ALLOW_CUSTOM_AUTH", "ALLOW_REFRESH_TOKEN_AUTH", "ALLOW_USER_PASSWORD_AUTH", "ALLOW_USER_SRP_AUTH" ], prevent_user_existence_errors='LEGACY' ) cognito.CfnIdentityPool(self, '{}Cognitoidp'.format(self.node.try_get_context('service_name')), allow_unauthenticated_identities=True, cognito_identity_providers=[ { 'clientId': webclient.ref, 'providerName': cognitouserpool.attr_provider_name, 'serverSideTokenCheck': False } ], cognito_streams=None )

 

編集後のディレクトリ構成

cdk_test/ .venv ├ cdk/ │ ├ __init__.py │ └ cognito_stack.py .gitignore ├ app.py ├ cdk.context.json ├ cdk.json README.md ├ requirements-dev.txt ├ requirements.txt └ source.bat
  1. app.pyについて cdkコマンドを実行する際に実行ディレクトリにつくる必要がある ここでcognito_stack.pyなどにstackファイルなどを読み込ませて最後にapp.synth()を実行することでローカルにCloudFormationテンプレートを作成(おそらくcdk.outに作られている)している

 

  1. try_get_contextについて
self.node.try_get_context('service_name')

cdk.context.jsonのservice_nameの値である"test"を取得できる

 

  1. cognito_stack.pyについて ここのファイルでstackのクラスを定義し、クラス内で構築したいリソースを定義していく 今回は
  • CfnUserPool(ユーザーのリスト、認証機能を管理) Cognitoのユーザープール
  • CfnUserPoolClient ユーザープールのアプリクライアント(認証フローの設定、トークンの有効期限など管理)
  • CfnIdentityPool IDプール(認可を管理)

 

詳しいオプションについては公式URLを参照

 

https://docs.aws.amazon.com/cdk/api/v1/docs/@aws-cdk_aws-cognito.CfnUserPool.html

 

以下コマンドでCloudFormationスタックをデプロイするため使用するS3バケットを作成する。 (AWSクレデンシャル等の設定は割愛、「--profile xxx」で事前に設定したプロファイルを使用できる)

$ cdk bootstrap

ここまで来たらdeployを実行、

$ cdk deploy

AWS リソースが一括で作成される

 

その他cdkコマンド

$ cdk ls app内のstackリストを表示する $ cdk synth CloudFormationテンプレートを生成し、表示する $ cdk diff 現在のスタックの状態と新しいスタックの差分を表示する