CDK(Python)でCognitoリソースを作成してみた
#AWS
#Cognito
#CDK
#Python
まずCDKとは何か?
CDKはAWS Cloud Development Kitの略称。 CloudFormationをPython, TypeScriptなどのプログラミング言語を使って作成し、 AWSリソースを一括で構築するテンプレートを作成できる
1.cdkコマンド使用できるようにする
aws-cdkパッケージをグローバルのnpmにインストールする
$ npm install -g aws-cdk
無事インストールできているか確認
$ cdk --version 2.8.0 (build 8a5eb49)
2.新規リポジトリを作成、CDKの初期構築
$ 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
3.ファイルを編集
今回はCognitoのリソース群を構築したいため、ここからファイルを編集していく
- 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()
- cdk.context.jsonをroot配下に追加
{ "repository_name": "test-backend", "service_name": "test" }
- フォルダ名変更 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
解説
- app.pyについて cdkコマンドを実行する際に実行ディレクトリにつくる必要がある ここでcognito_stack.pyなどにstackファイルなどを読み込ませて最後にapp.synth()を実行することでローカルにCloudFormationテンプレートを作成(おそらくcdk.outに作られている)している
- try_get_contextについて
self.node.try_get_context('service_name')
cdk.context.jsonのservice_nameの値である"test"を取得できる
- 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
4.前準備(CDK Bootstrap)
以下コマンドでCloudFormationスタックをデプロイするため使用するS3バケットを作成する。 (AWSクレデンシャル等の設定は割愛、「--profile xxx」で事前に設定したプロファイルを使用できる)
$ cdk bootstrap
5.デプロイ実行
ここまで来たらdeployを実行、
$ cdk deploy
AWS リソースが一括で作成される
その他cdkコマンド
$ cdk ls app内のstackリストを表示する $ cdk synth CloudFormationテンプレートを生成し、表示する $ cdk diff 現在のスタックの状態と新しいスタックの差分を表示する