本ページは、AWS に関する個人の勉強および勉強会で使用することを目的に、AWS ドキュメントなどを参照し作成しておりますが、記載の誤り等が含まれる場合がございます。
最新の情報については、AWS 公式ドキュメントをご参照ください。
Amazon Cognito は、ウェブおよびモバイルアプリケーションに認証、認可、およびユーザー管理機能を追加するためのサービスです。ユーザーは、ユーザー名とパスワードを使用して直接サインインするか、Facebook、Amazon、Google、Apple などのサードパーティーを通じてサインインすることができます。
Amazon Cognitoを理解する公式ドキュメントは次のとおりです。
「Amazon Cognito」をグラレコで解説|builders.flash
【AWS Black Belt Online Seminar】Amazon Cognito(YouTube)(59:18)
Simplify web app authentication: A guide to AD FS federation with Amazon Cognito user pools
SAML for Your Serverless JavaScript Application
Implementing passwordless email authentication with Amazon Cognito
Cognito の主な利点は以下の通りです:
Amazon Cognito は主に2つのコンポーネントで構成されています:
この2つを組み合わせることで、認証されたユーザーにアプリケーションやAWSリソースへのアクセス権を付与する仕組みを構築できます。
ユーザープールは、Amazon Cognitoのユーザーディレクトリです。ユーザープールを使用すると、ユーザーはAmazon Cognitoを通じて、またはサードパーティーIDプロバイダー(IdP)を通じてウェブやモバイルアプリにサインインできます。
ユーザープールの主な特徴は以下の通りです:
2024年11月22日 Amazon Cognito 新しい機能ティア Essentials と Plus のお知らせ
Cognitoユーザープールに機能と料金の異なる3つのプラン(Lite / Essentials / Plus)が追加されました。
詳細は、公式のプラン比較を確認してください。
次に、料金比較と特徴は次のとおりです。
料金範囲 (MAU) | Lite | Essentials | Plus |
無料利用枠 | 10,000 | 10,000 | なし |
10,001~100,000 | USD 0.0055 | USD 0.015 | USD 0.02 |
100,001~1,000,000 | USD 0.0046 | 〃 | 〃 |
1,000,001 ~ 10,000,000 | USD 0.00325 | 〃 | 〃 |
10,000,000 超 | USD 0.0025 | 〃 | 〃 |
Liteプランでは従来の「高度なセキュリティ機能」が追加コストで利用できます。
料金範囲 (MAU) | MAU あたりの料金 |
最初の 50,000 | USD 0.050 |
次の 50,000 | USD 0.035 |
次の 90 万 | USD 0.020 |
次の 900 万 | USD 0.015 |
10,00 万超 | USD 0.010 |
無料MAUが50,000から10,000に引き下げられていますので、コスト増となります。 「高度なセキュリティ機能」を使用しておらず、MAU 10,000以下というのであれば、コスト増の影響を受けません。
MAU 500万までを比較してみます。最初は Essensials < Plus < Lite = 既存
となっていますが、MAU 350万を超えたあたりで、Plusのほうが既存+ASFよりコストが高くなり始めます。
次に、MAU 5,000万までを比較してみます。1000万を超えたところでは、Plus > Lite=既存 > Essentials
となっています。 さらにMAU 2,500万を超えたあたりで、EssentialsがLiteを追い抜き、Plus > Essentials > Lite=既存
となるようです。
この結果を見ると、「高度なセキュリティ機能」がすべて必要なければ、MAU 2,500万まではEssentialsを選択することでコストが抑えられます。 MAU 2,500万以上の場合は、コストをしっかり算出し、適切な機能プランを選択するとよいでしょう。
Amazon Cognito では、サインアップとサインインのプロセスを以下のようにカスタマイズできます:
Amazon Cognito ユーザープールは、複数の認証フローをサポートしています:
{
"AuthFlow": "USER_PASSWORD_AUTH",
"AuthParameters": {
"USERNAME" : "testuser",
"PASSWORD" : "Example1234!"
},
"ClientId": "1example23456789"
}
{
"AuthFlow": "USER_PASSWORD_AUTH",
"AuthParameters": {
"USERNAME" : "testuser",
"SRP_A" : "g^a"
},
"ClientId": "1example23456789"
}
ユーザープールは Lambda 関数をトリガーとして関連付け、認証フローや登録プロセスをカスタマイズできます。主なトリガーには以下のようなものがあります:
参考:開発者ガイド>Lambda トリガーの使用
ユーザープールには、以下のようなセキュリティ機能が含まれています:
Amazon Cognito は、カスタマイズ可能なホスト型のウェブUIを提供しています。これにより、アプリケーションは独自のサインインページを構築することなく、すぐに認証機能を利用できます。
ホストされた UI の主な特徴:
Liteプランでは、従来のクラシックUIのみが利用できます。
Essentials以上のプランでは、ブランドデザイナーによるマネージドログインのカスタマイズが可能です。
Amazon Cognito は認証後に以下の種類のトークンを発行します:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
トークンの有効期限はユーザープールの設定で定義できます:
トークンの更新フローは以下の通りです:
ID プールを使用すると、ユーザーに AWS サービスへのアクセスを許可するための一時的な AWS 認証情報を取得できます。ID プールはユーザープールと連携して動作し、認証されたユーザーに特定の AWS リソースへのアクセス権を付与します。
ID プールの認証フローは以下の通りです:
ID プールは以下のような様々な認証プロバイダー(IDP)をサポートしています:
ID プールは IAM ロールと連携して動作します。主に以下の2種類のロールを設定できます:
さらに、ユーザー属性に基づいてロールを選択するための「ロールベースのアクセス制御」を実装することができます。これにより、ユーザーの所属グループなどに基づいて異なるレベルのアクセス権を付与できます。
詳細は、Cognito開発者ガイドのIAMロールを参照してください。
Cognito Syncとは、アプリケーションに関連するユーザーデータをデバイス間で同期できる機能で、一人のユーザーが複数デバイスを保持している場合にデバイス間でデータを同期します。最大 1 MB のキーと値のペアを保存できるデータセットに保存され、ユーザー ID ごとに最大 20 個のデータセットを持つことができます。これらのデータをローカルに保持し、デバイスがオフラインの場合でもデータを利用できるようにします。
しかし、Cognito Sync は古いサービスで、現在は高機能なAWS AppSync への移行が推奨されています。
AppSync の主な利点:
Amazon Cognito の料金は以下の要素に基づきます:
Amazon Cognito 料金ページで最新の料金情報を確認することができます。
基本的な料金構造:
Amazon Cognito には以下のようなサービスクォータがあります:
ユーザープール:
ID プール:
クォータの詳細と引き上げ方法については、Amazon Cognito サービスクォータを参照してください。
Amplify ライブラリを使用したReact/Vue.jsなどでの実装したフロントエンドでCognitoによる認証を行い、認証情報を使って、API Gatewayを呼び出す実装例です。 API Gateway のオーソライザーにCognitoを設定します。
CloudFront 経由でS3の静的ウェブサイトを配信している場合に、認証機能を付与する実装例です。 Lambda@EdgeによってCognito認証を行います。
こちらの方法のサンプルはGitHubのawslabs/cognito-at-edgeにあります。
①と②を組み合わせたパターンで、認証部分をフロントエンドで実装せずに、Lambda@EdgeでCognito認証を行います。ログイン画面は「CognitoのホストされたUIを使用」を使用することができます。
GitHub>aws-samples/cdk-cognito-idp
AWS CDK を使用してCognitoリソースをデプロイする例:
このCDKスタックでは、以下のCognitoリソースを作成しています:
実装例:CognitoユーザープールとIDプール作成のCDKコード(クリックしてください)
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import {
aws_cognito as cognito
} from 'aws-cdk-lib';
export class CognitoStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// ユーザープールの作成
const userPool = new cognito.UserPool(this, 'MyUserPool', {
userPoolName: 'my-user-pool', // ユーザープール名
selfSignUpEnabled: true, // セルフサービスのサインアップ設定
signInAliases: { // サインインエイリアス。ユーザープルに登録する属性
email: true,
username: false
},
autoVerify: {
email: true
},
standardAttributes: {
email: {
required: true,
mutable: true
}
},
customAttributes: { // カスタム属性
'family_name_kana': new cognito.StringAttribute({ minLen: 1, maxLen: 256, mutable: true }),
'given_name_kana': new cognito.StringAttribute({ minLen: 1, maxLen: 256, mutable: true }),
},
passwordPolicy: { // パスワードポリシー
minLength: 16, // パスワード文字列長
requireLowercase: true, // 小文字
requireUppercase: true, // 大文字
requireDigits: true, // 数字
requireSymbols: true, // 記号
temporaryPasswordValidityDays: Duration.days(3), // 一時パスワードが有効な日数
},
lambdaTriggers: { // トリガー
preSignUp: '', // サインアップ前の Lambda トリガー
postConfirmation: '', // 確認後の Lambda トリガー
preAuthentication: '', // 認証前の Lambda トリガー
postAuthentication: '', // 認証後の Lambda トリガー
// チャレンジの Lambda トリガー
defineAuthChallenge: '',
createAuthChallenge: '',
verifyAuthChallengeResponse: '',
preTokenGeneration: '', // トークン生成前の Lambda トリガー
userMigration: '', // ユーザー移行のトリガー
customMessage: '', // カスタムメッセージのトリガー
// カスタム送信者のトリガー
customEmailSender: '',
customSmsSender: '',
},
accountRecovery: cognito.AccountRecovery.EMAIL_ONLY, // ユーザーアカウントの復旧設定
email: cognito.UserPoolEmail.withCognito('support@example.com'),
/*
email: cognito.UserPoolEmail.withSES({ // SES で送信する場合
fromEmail: 'noreply@example.com',
fromName: 'Awesome App',
replyTo: 'support@example.com',
sesVerifiedDomain: 'example.com',
}),
*/
});
// ユーザープールクライアントの作成
const userPoolClient = new cognito.UserPoolClient(this, 'MyUserPoolClient', {
userPool,
authFlows: {
userPassword: true,
userSrp: true
},
oAuth: {
flows: {
authorizationCodeGrant: true
},
scopes: [
cognito.OAuthScope.EMAIL,
cognito.OAuthScope.OPENID,
cognito.OAuthScope.PROFILE
],
callbackUrls: ['https://example.com/callback'],
logoutUrls: ['https://example.com/'],
},
});
// IDプールの作成
const identityPool = new cognito.CfnIdentityPool(this, 'MyIdentityPool', {
identityPoolName: 'my-identity-pool',
allowUnauthenticatedIdentities: false,
cognitoIdentityProviders: [{
clientId: userPoolClient.userPoolClientId,
providerName: userPool.userPoolProviderName
}]
});
// 出力
new cdk.CfnOutput(this, 'UserPoolId', {
value: userPool.userPoolId
});
new cdk.CfnOutput(this, 'UserPoolClientId', {
value: userPoolClient.userPoolClientId
});
new cdk.CfnOutput(this, 'IdentityPoolId', {
value: identityPool.ref
});
}
}
Amazon Cognito は、アプリケーション向けの認証・認可サービスとして以下の価値を提供します:
アプリケーションの認証機能を実装する際は、Cognitoを検討してみてください。特に複数の認証方法をサポートしたり、AWSリソースへの安全なアクセスを提供したりする場合に威力を発揮します。