Amazon Cognito のユーザープールを 定期バックアップ!

「Cognito User Profiles Export リファレンスアーキテクチャ」を試してみる

2023-02-02
AWS ソリューション紹介

伊藤 健史 (監修 : 佐藤 裕介, 脇坂 洋祐)

builders.flash をお読みのみなさん、こんにちは!Professional Services Consultant の伊藤健史です。

AWS では、お客様が AWS 上でアーキテクチャを構築するにあたってよく目にする課題に対するソリューションを再利用可能な形でまとめた「AWS ソリューションライブラリ」を公開しています。今回の記事では、お客様の Web サービスに簡単に認証機構を組み込むことができる Amazon Cognitoユーザープールについて、登録されたユーザーやグループの情報を定期的にバックアップできる「Cognito User Profiles Export リファレンスアーキテクチャ」というソリューションをご紹介します

Amazon Cognito ユーザープールによるユーザー認証はお客様の Web サービスのまさに基盤となる部分であり、そのデータを安全に管理することはとても重要な課題です。Amazon Cognito は AWS によるフルマネージドサービスであるため、ユーザープールを作成いただいたリージョン内でのデータの保護は AWS が責任を持っています。一方で、リージョン全域にわたる大災害が発生した場合や、何らかの誤操作によってユーザー情報が失われてしまった場合に備えたいときには、お客様ご自身でユーザー情報のバックアップをとっていただく必要があります。しかし、Amazon Cognito はユーザープールのバックアップやリストアの機能を提供しておらず、バックアップのためのアーキテクチャの構築には手間がかかります。今回ご紹介する「Cognito User Profiles Export リファレンスアーキテクチャ」は、まさにこのユーザープールの定期バックアップのためのアーキテクチャを簡単にデプロイしていただけるソリューションとなっております。

それでは、「Cognito User Profiles Export リファレンスアーキテクチャ」がどのようなソリューションなのか、早速見ていきましょう。

ご注意

本記事で紹介する AWS サービスを起動する際には、料金がかかります。builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。

*ハンズオン記事およびソースコードにおける免責事項 »

この記事のデモを無料でお試しいただけます »

毎月提供されるデベロッパー向けアップデート情報とともに、クレジットコードを受け取ることができます。 


Amazon Cognito ユーザープールとは?なぜバックアップが必要か?

現代的な Web サービスとしてエンドユーザーに提供する際、ほぼ必ず実装しなければならないのがユーザーを管理する機能です。情報発信のみを目的とする blog のように機能がさほど多くない Web サービスであっても、コメントや「いいね」ボタンの履歴を管理しようとすると、すぐにユーザー管理とそれに基づく認証認可が必要になります。Amazon Cognito は、お客様が開発する Web サービスに対して、素早く簡単にユーザー管理、認証、認可の機能を実装できるフルマネージドサービスです。Amazon Cognito は、サービスに登録したユーザーを管理し認証認可基盤を提供するユーザープールと、AWS リソースに対する認可基盤を提供する ID プールから構成されます。今回の記事では、ユーザープールで管理されているユーザー情報のバックアップについて考えてみたいと思います。

Web サービスを提供する際、ユーザー情報は最も価値ある資産のひとつです。ですので、ユーザー情報が失われないように対策することはアーキテクチャの設計上避けては通れないポイントになります。Amazon Cognito は AWS によるフルマネージドサービスであるため、ユーザープールを作成いただいたリージョン内でのデータの保護については AWS が責任を持っています。一方、リージョン全域に渡る大災害が発生したり、あるいは人手による操作でミスが発生したりした場合には、ユーザー情報が失われてしまうリスクは残っています。

しかし、Amazon Cognito は、ユーザープールに保存されたユーザー情報をワンクリックでバックアップ・リストアする機能を提供していません。この問題を解決するのが、この記事でご紹介する「Cognito User Profiles Export リファレンスアーキテクチャ」です!このソリューションを使用することで、お客様はユーザープールの情報を定期的にバックアップしたり、任意のタイミングで任意のリージョンにリストアすることができるようになります。それでは、このソリューションのアーキテクチャについて詳細に見ていきましょう!


Cognito User Profiles Export リファレンスアーキテクチャ とは

アーキテクチャ全体の概観

「Cognito User Profiles Export リファレンスアーキテクチャ」では、AWS Step Functions を利用してユーザープールのバックアップとリストアを管理します。このソリューションでは、プライマリリージョンのユーザープールのユーザー・グループ情報を Amazon DynamoDB のグローバルテーブルにバックアップするための Export Workflow と、新しいユーザープール(バックアップ元と同じリージョンでも別のリージョンでも可)にリストアする Import Workflow の 2 つの Step Functions workflow が提供されています。

これらの workflow や、関連する AWS Lambda 関数などのリソースは全て AWS CloudFormation のテンプレートとして提供されていますので、お客様はバックアップしたいユーザープールの ID など、わずかな設定情報ををご用意いただくだけで、簡単にこれらのリソースをデプロイしていただけます。

続いて、Export Workflow と Import Workflow をそれぞれ詳細に見ていきましょう。

Export Workflow

Export Workflow は、プライマリリージョンのユーザープールに保存されているユーザー情報を読み出し、DynamoDB global table に保存します。Export Workflow が開始されると、まず複数の workflow が同時実行されることによる不具合を回避するため、“check state machine” 関数によって現在実行されている workflow の他に Export Workflow が実行されていないことを確認します。続いて、"check user pool configuration" 関数がユーザープールの設定を確認します。この点について、詳しくは後の「制約」の項をご参照ください。

ここまでの事前準備が整うと、続いて “sync users”、“list groups”、そして “sync group and users in group” 関数がユーザープールからユーザーとグループの情報を読み出して DynamoDB に保存します。最後に、“clean up backup table” 関数が Amazon SQS キューを利用しながらDynamoDB 上の古いレコードの削除を行い、DynamoDB 上の情報が最新であることを確認します。ここまでの処理が完了すると、“send messages” 関数が Amazon SNS トピックへ完了通知を発信します。

なお、上記「概観」の図にあるとおり、この Export Workflow は Amazon EventBridge によって定期実行されます。

Import Workflow

Import Workflow は、DynamoDB にバックアップされたユーザー・グループ情報を読み出し、バックアップ元とは別のユーザープールにリストアします。Import Workflow が開始されると、Export Workflow と同様に複数同時実行を防ぐための “check state machine” 関数が実行されます。続いて、 “check new user pool” 関数が、リストア先のユーザープールに workflow からアクセスできること、およびユーザープールが空(ユーザーやグループが登録されていない状態)であることを確認します。

ここまでの事前準備が整うと、“scan table” 関数が DynamoDB 上のレコードを読み取って、グループ情報を新しいユーザープールに登録すると同時に、ユーザー情報などを Amazon SQS キューに挿入します。その後、“import users” や “update users” 関数が Amazon Cognito へユーザー情報を登録したり、グループへの所属情報を更新したりします。ここで、ユーザー関連の情報が一度 SQS に保存されるのは、Amazon Cognito へユーザー情報を登録するためにはユーザーが所属しているグループの情報が必要であるため、“scan table” 関数がグループ情報を全て新しいユーザープールに登録した後に、ユーザーとグループの所属関係が処理されることを保証するための仕組みです。また、“import users” 関数はインポートしたユーザーの sub 属性を含む mapping file を Amazon S3 バケットに保存します。この mapping file は、インポートに失敗したユーザーがいた場合に、事後のトラブルシューティングのために利用できます。ここまでの処理が完了すると、“send messages” 関数が Amazon SNS トピックへ完了通知を発信します。

なお、この Import Workflow はお客様が Step Functions のマネジメントコンソールや CLI などを使って任意のタイミングで実行開始していただくものになります。


使用している AWS サービスは?

本ソリューションでは、以下の AWS サービスを使用します。使用するサービスは全てフルマネージドなサーバレスサービスですので、本ソリューションを利用するためにお客様でインフラストラクチャの追加の管理をしていただく必要はありません。

サービス このアーキテクチャにおける役割
Amazon Cognito バックアップ元またはリストア先となるユーザープールを使用します。これらのユーザープールは CloudFormation テンプレートでは作成されませんので、お客様ご自身で作成いただく必要があります。
Amazon DynamoDB ユーザープールのユーザー情報・グループ情報を global table に保存することで、非同期的にセカンダリリージョンへデータを転送できます。
AWS Step Functions 複数の Amazon Lambda 関数を順序よく呼び出し、ユーザー情報のバックアップとリストアの工程を管理します。
AWS Lambda バックアップとリストアの各工程(ユーザープールや DynamoDB への読み書きなど)を実行します。
Amazon SQS 後で処理するユーザー情報などを一時的に溜めておくために使用します。
Amazon SNS Workflow の完了やエラーなどを通知するために使用します。
Amazon EventBridge(旧 Amazon CloudWatch event) Export Workflow を定期実行するために使用します。
Amazon S3 Import Workflow のログが保存されます。トラブルシューティングに用いるものであり、リストアが正常に完了した場合には参照する必要はありません。

制約

このソリューションでユーザープールをバックアップするにあたり、ご留意いただきたい制約事項は以下の通りです。

  • 以下の場合、このソリューションを用いたバックアップは行なえません。
  • その他の機能制限
    • セキュリティの観点から、Amazon Cognito はユーザーのパスワードをエクスポートする機能を提供しないため、パスワードはバックアップされません。リストアされたユーザープールを使用する際には、ユーザーにパスワードをリセットしていただくようご依頼ください。
    • バックアップ元とリストア先のユーザープールでは、各ユーザーの sub 属性が変わります。アプリケーションのロジックにおいて、一意の ID として sub 属性を使用している場合は、バックアップ元とリストア先のユーザープールで sub 属性を対応させる必要があります。この際、バックアップ元のユーザープールで sub 属性をカスタム属性としてコピーしておくと、DynamoDB テーブルにバックアップできるようになり、リストア後のユーザープールで sub 属性の対応関係を確認するために利用できます。
    • Amazon Cognito 経由で登録されたユーザー情報のみバックアップできます。サードパーティの認証(ソーシャルログイン)を使用して登録されたユーザーの情報はバックアップされません。ソーシャルログイン経由で登録されたユーザーは、リストア先のユーザープールに切り替わった段階で再度ログインしていただくようご依頼ください。また、ID プロバイダーの設定も引き継がれないため、リストア先のユーザープールでバックアップ元と同様に設定してください。
    • ユーザープールのアドバンスドセキュリティ機能をご使用の場合、ログイン履歴はバックアップされません。
    • グループに紐づけられた IAM ロールの情報はバックアップされません。
    • 記憶済みデバイスの情報はバックアップされません。

デプロイ方法 / 設定方法

それでは、実際にこのソリューションをデプロイ・実行してみましょう!なお、以降の手順を進める前に、バックアップ元のユーザープールを米国東部(バージニア北部)リージョンに、リストア先のユーザープールを東京リージョンに作成してください。ユーザープールの作成については Amazon Cognito の公式ドキュメントをご参照いただければと思います。また、バックアップ元のユーザープールにはユーザーとグループを何件か登録し、メールアドレスの検証手続き(確認メールのURLをクリック)を完了しておいてください。リストア先のユーザープールは空である必要があります。このとき、以下の点にご注意ください。

  • 多要素認証は無効化されている必要があります。
  • ログインに使用できるエイリアスとして、E メールと電話番号のどちらかのみを許可してください。両方を許可するとバックアップに失敗します。マネジメントコンソールからユーザープールを作成する場合は、「Cognito ユーザープールのサインインオプション」と表示される項目が該当します。(右図参照)

クリックすると拡大します

なお、このソリューションがバックアップ元のユーザープールを変更することはありません。


ソリューションのデプロイ

では、ここからは実際に「Cognito User Profiles Export リファレンスアーキテクチャ」をデプロイしていきましょう!ソリューションのページの中ほど右側にある「AWS コンソールで起動する」をクリックすると、CloudFormation のスタック起動ウィザードが開きます。

クリックすると拡大します

Step 1 テンプレートの指定」ではそのまま「次へ」をクリックします。

Step 2 スタックの詳細を指定」でスタックの名前を指定し、いくつかのパラメータを設定します。各パラメータの役割は以下の通りです。

パラメータ名 説明 初期値
PrimaryUsrePoolId バックアップ元となるユーザープールのID。  
SecondaryRegion ユーザープールをリストアしたいリージョン。  
ExportFrequency Export Workflow を実行する頻度。EVERY_DAY、EVERY_7_DAYS、EVERY_30_DAYS から選択。 EVERY_DAY
CognitoTPS バックアップやリストアのために Cognito API を呼び出す頻度。大きくすると高速だが、環境によっては API の制限に注意する必要がある。10、5、1 から選択。 10
NotificationEmail Workflow の完了やエラーの通知を送信するメールアドレス  
SnsPreference INFO_AND_ERRORS: Workflow の完了とエラーの両方を通知する。ERRORS_ONLY: エラーが発生したときのみ通知する。 INFO_AND_ERRORS

ユーザープールの ID は、ユーザープールの詳細画面から取得できます。右図の赤丸内のアイコンをクリックすることで、クリップボードにコピーされます。

クリックすると拡大します

この ID を使用して、スタックの名前とパラメータを以下のように設定します。なお、ap-northeast-1 は東京リージョンの ID です。また、NotificationEmail はご自身が受け取り可能なものをご指定ください。設定できたら「次へ」をクリックします。

クリックすると拡大します

ステップ 3 スタックオプションの設定」は変更せず「次へ」をクリックします。

ステップ 4 レビュー」で内容を確認できたら、最下部の「AWS CloudFormation によって IAM リソースが作成される場合があることを承認します。」にチェックを入れて、「スタックの作成」をクリックします。リソースが作成されるまで最大 10 分前後かかります。

クリックすると拡大します

もしスタックのデプロイに失敗したら

DynamoDB の global table を今回初めてご使用になる場合、デプロイの最中に SecondaryUserPoolTable の作成に失敗することがあります。このブログでは原因の詳細に立ち入ることはしませんが、もし CloudFormation のイベントタブに右図のようなエラーが出てデプロイに失敗した場合、一度該当のスタックを削除した上で、もう一度デプロイしていただけるとうまくデプロイできます。

クリックすると拡大します


ユーザープールのバックアップを確認

CloudFormation スタックのデプロイに成功すると、作成された Amazon EventBridge ルールによって初回のバックアップが自動的に実行されます。DynamoDB のテーブル内の項目を見てみると、ユーザー情報(USER-...)が 2 件、Admin グループの情報(GROUP-Admin)が 1 件、ユーザーの Admin グループへの所属情報(GROUP_MEMBER-...)が 1 件、期待通りにバックアップされていることが確認できます。

クリックすると拡大します


セカンダリリージョンでのリストア

※ ここまでの手順は米国東部リージョン(バージニア北部)で実行してきましたが、ここから先の手順は東京リージョンで実行します。

それでは最後に、東京リージョンの新しいユーザープールにユーザー・グループ情報をリストアしてみましょう!東京リージョンに作成したリストア先のユーザープールの詳細画面から、ユーザープールの ID をクリップボードにコピーしてください。

次に、Step Functions のマネジメントコンソールを開き、Cloud Formation により作成されている Import Workflow を開きます。

クリックすると拡大します

Import Workflow の詳細ページで、「実行の開始」をクリックします。

クリックすると拡大します

モーダルウィンドウで、「入力」に初期値として設定されている JSON を削除し、新しいユーザープール ID をもとにして以下のように入力し、「実行の開始」をクリックします。

{
    "NewUserPoolId": "ap-northeast-1_XXXXXXXXX"
}

クリックすると拡大します

Step Functions が処理されていく様子を観察できます。余談ですが、筆者はこのグラフインスペクター画面が徐々に緑色になっていくのを眺めるのがとても好きです。

クリックすると拡大します

無事完了したら、ユーザープールを確認してみましょう!ユーザー情報、グループ情報、そしてユーザーのグループへの所属関係がリストアできていれば成功です!

クリックすると拡大します

なお、何らかの理由(例:メールアドレスが未検証)でリストア先のユーザープールへのインポートに失敗するユーザーが多数いる場合、“Too many users have failed or been skipped during the import.” というエラーメッセージとともに Import Workflow 全体が失敗します。その場合は、S3 バケットに保存されている mapping file などを参照しながら、手動で失敗したユーザーの処理を行ってください。


リソースの削除方法

ソリューションが不要になった場合、バックアップ・リストアのアーキテクチャ本体は CloudFormation のスタックを削除すれば一度に削除できます。また、バックアップ元・リストア先のユーザープールは別途手動で削除いただく必要があります(参考:ユーザープールの削除方法)。


まとめ

今回の記事では「Cognito User Profiles Export リファレンスアーキテクチャ」のソリューションをご紹介しました。CloudFormation テンプレートを使った簡単な設定で、定期的にユーザープールの情報をグローバルにバックアップできることをご理解いただけたかと思います。冒頭でも述べた通り、Amazon Cognito はフルマネージドサービスではありますが、それでも不慮のデータ喪失に備えることは大変重要です。このソリューションを利用して、みなさんがより堅牢にユーザープール情報を管理できるお手伝いができれば幸いです。

builders.flash では、他にもさまざまな AWS ソリューションの紹介記事を投稿しています。これまでの記事は こちら の記事カテゴリーで「AWSソリューション紹介」に絞ってご覧ください。それでは、次回の記事もぜひお楽しみに!


builders.flash メールメンバーへ登録することで
AWS のベストプラクティスを毎月無料でお試しいただけます

筆者プロフィール

伊藤 健史 (Takeshi Itoh)
アマゾン ウェブ サービス ジャパン合同会社
プロフェッショナルサービス本部 アソシエイトコンサルタント

2022 年 4 月入社のプロフェッショナルサービスコンサルタントです。医師免許と博士 (工学) という珍しい組み合わせの学位を持っています。医師と AWS のコンサルタントには似たところがあると思っており、今はクラウドのお医者さんとして、お客様にヘルシーに AWS 環境をご利用いただけるよう、日々精進しております。

監修者プロフィール

佐藤 裕介 (Yusuke Sato)
アマゾン ウェブ サービス ジャパン合同会社
ソリューションアーキテクト

ソリューションアーキテクトとして、製造業分野のお客様を中心に様々なお客様を支援させて頂いています。AWS と出会いクラウドの楽しさを知り、お客様にもクラウドの楽しさを知ってほしいと思い日々働いています。
好きなサービスは、AWS Lambda と Amazon Connect で、難しいことを考えずにシュッと使えるサービスが好きです。
プライベートでは双子男児の父で日々育児に翻弄されています。

脇坂 洋祐 (Yosuke Wakisaka)
プロフェッショナルサービス本部 インフラストラクチャーアーキテクト

プロフェッショナルサービスとして、エンタープライズなお客様のAWSへの移行をご支援させて頂いています。
前職では主にデータベース周りの設計、構築等に従事し、データベースのマイグレーションやクラウド移行を担当させていただいていました。
好きな AWS サービスは Amazon RDS や Amazon Athena です。

AWS を無料でお試しいただけます

AWS 無料利用枠の詳細はこちら ≫
5 ステップでアカウント作成できます
無料サインアップ ≫
ご不明な点がおありですか?
日本担当チームへ相談する