Amazon Cognito

Amazon Cognito は、自社の Web アプリやモバイルアプリの利用者(エンドユーザー)に、サインアップ・サインインの機能と、AWS のリソースを使うための一時的な権限を提供するサービスです。SAA では、ユーザープールと ID プールの違いと、ALB・API Gateway と組み合わせた認証の設計が問われます。

ひとことで言うと: ユーザープールは「会員名簿と受付(本人確認をして会員証を渡す)」、ID プールは「会員証を AWS の入館証(一時的な認証情報)に交換する窓口」です。

たとえるなら、テーマパークの受付で本人確認をして会員証(トークン)をもらい、その会員証を見せると、アトラクションに入れる当日限りのチケット(AWS の一時的な認証情報)に交換してもらえる仕組みです。

このページで押さえる論点

ユーザープールと ID プールの違い

Cognito は 2 つの部品でできています。名前が似ていますが、役割がまったく違います。

観点ユーザープールID プール(フェデレーテッドアイデンティティ)
役割認証(あなたは誰か)。利用者の名簿と、サインインの仕組み認可(AWS で何をしてよいか)。AWS のリソースを使う権限を渡す
渡すものJWT(JSON Web Token)形式の ID トークン・アクセストークン・更新トークンAWS STS が発行する一時的な AWS 認証情報(アクセスキー ID・シークレットアクセスキー・セッショントークン)
主な使い道アプリのログイン画面、API へのアクセスの確認アプリから S3・DynamoDB などの AWS のサービスを直接呼び出す
受け付ける相手ユーザープールに登録した利用者、ソーシャル ID プロバイダー、SAML・OIDC の ID プロバイダーユーザープール、ソーシャル ID プロバイダー、SAML・OIDC、独自の認証、未認証(ゲスト)の利用者

両方を組み合わせるのが典型です。利用者がユーザープールでサインインしてトークンを受け取り、そのトークンを ID プールで一時的な AWS 認証情報に交換して、S3 などに直接アクセスします。

再生型アニメ図解

ユーザープールでサインインし、ID プール経由で S3 に写真をアップロードする

アプリ (利用者) JWT 一時認証情報 ユーザー プール ID プール + STS S3 ✓ 本人確認 IAM ロールを選ぶ ✓ 自分のフォルダだけ

※簡略化しています: 実際には、ID プールはまず利用者ごとの ID を払い出し、その ID で AWS STS に認証情報を求めます。図では ID プールと STS を 1 つの箱にまとめています。AWS の SDK を使うと、トークンの交換や認証情報の更新は自動で行われます。

ユーザープール

ユーザープールは、アプリの利用者の名簿(ユーザーディレクトリ)と、OAuth 2.0 / OpenID Connect(OIDC)に対応した認証サーバーを兼ねるものです。自分でログイン機能やパスワードの保管を作らずに済みます。

ID プール

ID プールは、利用者に一時的な AWS 認証情報を渡し、アプリから S3・DynamoDB などの AWS のサービスを直接使えるようにします。裏側では AWS STS が一時的な認証情報を発行するので、アプリにアクセスキーを埋め込む必要がありません(アクセスキーを埋め込むと、アプリを解析されたときに漏れてしまいます)。

権限は IAM ロールで決まるので、ロールのポリシーは最小権限の原則で書きます。

ALB・API Gateway・AppSync との連携

連携先仕組みポイント
Application Load Balancerリスナールールに「ユーザーを認証」アクション(authenticate-cognito)を設定する。未ログインの利用者はユーザープールのログイン画面に送られ、認証済みの利用者のリクエストだけがターゲットに転送されるHTTPS リスナーでのみ使える。アプリ側にログイン処理を作らずに済む。Cognito を使わず、OIDC 準拠の ID プロバイダーを直接指定する(authenticate-oidc)こともできる
API Gateway(REST API)Cognito オーソライザーを設定する。リクエストのトークンを API Gateway が検証し、正しくなければ Lambda などのバックエンドを呼ばずに拒否するバックエンドでトークンを検証するコードが不要
API Gateway(HTTP API)JWT オーソライザーで、ユーザープールが発行したトークンを検証する—
AWS AppSyncGraphQL API の認可方式として、ユーザープールを指定できる—

「サーバーレスの API を、ログインした利用者だけに使わせたい」なら、API Gateway + Cognito オーソライザーが定番の答えです。「既存の Web アプリ(ALB の背後の EC2)にログイン機能を追加したいが、コードは変えたくない」なら、ALB の認証アクションです。

IAM・IAM Identity Center との使い分け

「サインイン」に関わるサービスは複数あります。誰がサインインするのかで選びます。

誰が何のために使うサービス
自社のアプリのお客様(エンドユーザー)。数が多く、増減も激しいアプリにサインインする。アプリから AWS のリソースを使うAmazon Cognito
社員(ワークフォース)複数の AWS アカウントや業務アプリにサインインするIAM Identity Center(Organizations のページ)
AWS 上のアプリ・サービスAWS のリソースを操作するIAM ロール(IAM のページ)

お客様ごとに IAM ユーザーを作るのは誤りです。IAM ユーザーは長期的な認証情報を持ち、大量の利用者を管理する仕組みではありません。

問題文のキーワード → 選ぶべき答え

問題文の言い回し答えと理由
「モバイルアプリの利用者のサインアップ・サインイン機能を素早く追加」Cognito ユーザープール
「Google・Facebook アカウントでログイン」「ソーシャルログイン」ユーザープールの外部 ID プロバイダーとのフェデレーション
「アプリから S3 や DynamoDB に直接アクセス。アクセスキーを埋め込まない」Cognito ID プール(一時的な AWS 認証情報)
「ログインしていないゲストにも一部のリソースを読ませる」ID プールの未認証 ID(ゲスト用の IAM ロール)
「利用者ごとに S3 の自分のフォルダだけにアクセスさせる」ID プール + IAM ポリシーの利用者 ID の変数でプレフィックスを限定
「API Gateway の API を、ログインした利用者だけに使わせる」Cognito オーソライザー(ユーザープール)
「ALB の背後のアプリに、コードを変えずに認証を追加」ALB のリスナールールの認証アクション(HTTPS リスナー)
「アプリの利用者に MFA を必須にする」ユーザープールの MFA
「社員が複数の AWS アカウントにシングルサインオン」Cognito ではなく IAM Identity Center

引っかけポイント

まとめ: SAA 試験で押さえるポイント

確認問題

参考リンク

AWS 公式ドキュメント(外部サイトが開きます)。