EC2とALBでコンテンツを配信している環境にCognitoで認証を追加してみました

2021.10.29

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、コンサル部@大阪オフィスのTodaです。

EC2とALBを使ってコンテンツを配信している中で、全てのページまたは一部のページを許可したユーザのみ掲載したいという要望を受けた場合、ログインのシステムを作りコンテンツをログイン済みのみ参照できるようにする方法があると考えます。
今回はシステムを作らず設定のみでEC2とALBに認証を実装してみます。
ユーザの管理はcognitoを利用しておこないます。

変更予定のイメージ図

変更予定のイメージ図

制限事項

今回ALBとCognitoを連携して認証を実装いたします。
実装時に利用できるサインアップ・サインイン画面は英語のみの表示になりデザインはロゴ画像など変更箇所が制限されます。

前提条件

ALBとEC2によりWebサイトが表示される状態から対応いたします。
コンテンツの配信はHTTPS通信にておこなっている状態から対応いたします。

Cognitoの準備について

ユーザプールの作成

AWSコンソールにログインをおこないます。
サービスから[Cognito] > 表示されるメニューから[ユーザプールの管理]をクリックします。 ページ上部の[ユーザプールを作成する]をクリックします。

ユーザプールの設定

プール名の指定がありますので任意の名前を入力します。
入力後は[デフォルトを確認する]をクリックします。

左メニューから[属性]を選択します。
属性は利用者のサインインで利用する情報や記録する内容について設定をします。
属性の設定は登録すると変更ができないため注意が必要です。

今回はユーザー名とパスワードを利用して認証をするため[ユーザ名]を指定します。
標準属性は氏名やパスワード以外に記憶する情報の選択になります。
認証のみおこなうため全て無効の状態で設定します。
選択後、[次のステップ]をクリックします。

属性の設定

ポリシーはパスワードの最小文字数・自己サインアップの許可、一時パスワードの設定をおこないます。
サインアップは管理者がアカウントを準備することを想定するため[管理者のみにユーザーの作成を許可する]選択して [次のステップ]をクリックします。

ポリシーの設定

MFAと確認は今回利用しないようにいたしますので[なし]にて設定をおこない[次のステップ]をクリックします。

MFAと確認の設定

その他設定項目がございますが、MFAと確認を完了した段階で左メニューから[確認]を選択します。
上記の状態で[プールの作成]をクリックして登録を完了します。
登録が完了すると【プールID】が表示されます。プールIDはあとで利用するためメモに残します。

登録の確認

アプリクライアントの設定

ユーザープールにアクセスする用のIDを発行します。
左メニューから[アプリクライアント]をクリックして表示される画面内の[アプリクライアントの追加]をクリックします。

アプリクライアントの画面

アプリクライアント名の入力とクライアントシークレットの生成、認証フローの設定で[ユーザー名パスワードベースの認証]と[SRP]を有効化して[アプリクライアントの作成]をクリックします。

アプリクライアントの設定

作成が完了すると【アプリクライアントID】が表示されますのでプールIDと同じようにメモに残します。

アプリクライアントID

アプリクライアントの詳細設定

サインインで利用するシステムの設定をおこないます。
左メニューから[アプリクライアントの設定]をクリックします。

有効なIDプロバイダの指定がありますので[Cognito User Pool]を有効化します。
サインインとサインアウトのURLは正常にサインインをした場合に表示するURLを設定します。
コールバックURL: https://[コンテンツが掲載されているドメイン]/oauth2/idpresponse
サインアウトURL: 利用する事はございませんが仮のURLを指定

OAuth 2.0の設定は[Authorization code grant]とスコープは[openid]を有効化します。
設定後、[変更の保存]をクリックします。

※コールバックURLの「/oauth2/idpresponse」は存在しないURLで問題ございません。
ALB側での認証をおこなうURLになります。

■ Application Load Balancer を使用してユーザーを認証するを参照してください。
https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/listener-authenticate-users.html

クライアントの詳細設定

ドメイン名の設定

サインインで利用するシステムのURLを指定します。
URLはCognitoドメインと自分が所有するドメインの2パターンが利用できます。
今回はCognitoドメインを利用するため、任意のドメインが利用可能か確認をおこない登録をおこないます。

ドメイン名の設定

サインイン画面の確認

CognitoのサインインUIが利用できる状態か確認いたします。
左メニューから[アプリクライアントの設定]をクリックし、画面内の[ホストされたUIを起動]をクリックします。

サインイン画面の確認

英語のUIでログイン画面が表示されることを確認します。

サインイン画面の確認2

ALBへの認証追加について

ALBのリスナールールに認証を追加します。
認証はHTTPS(443)のプロトコルのみ利用できるためHTTP(80)のみの場合はSSLの適用が必要になります。

対象ALBのルール表示

サービスから[EC2] > 右メニューから[ロードバランサー]をクリックします。
対象のロードバランサーを選択して[リスナー] > HTTPSの[ルールの表示/編集]をクリックします。

対象ALBのルール表示

ルールの設定

ルールを表示するとターゲットグループに対して転送をするルールが入っています。
上記に認証のプロセスを追加して対応いたします。

ALBルールの設定

ルールの編集をおこない、アクション内容を変更します。
アクションは上から順番に適用されるため[認証] > [転送先]になるように調整します。
既存のアクションを1度削除して新しくアクション[認証]を選択します。
認証には[Cognito]を選択してCognitoユーザープールとアプリクライアントは上記でメモの残した情報を選択します。
残りの設定は変更せずチェックをクリックして設定します。

ALBルールの設定2

先ほど削除したELBの転送先を追加登録おこない、更新をおこないます。
上記で設定作業は完了になります。

ALBルールの設定3

ログインユーザの登録

Cognitoのユーザ管理

サービスから[Cognito] > 表示されるメニューから作成したユーザプールをクリックします。
左メニューの[ユーザとグループ]をクリックおこないユーザの作成をクリックします。

Cognitoのユーザ管理

ユーザの認証は[ユーザー名]と[パスワード]でおこないます。
仮パスワードは初回アクセス時に変更がおこなわれるようにアナウンスされますので任意で設定をします。
[電話番号]と[メールアドレス]は設定しない場合、認証済みのチェックは外します。
上記入力をおこない[ユーザーの登録]をクリックします。

Cognitoのユーザ登録

上記でユーザ登録は完了になります。

コンテンツへのアクセス

ログイン

コンテンツのURLにアクセスするとリダイレクトにて作成したログイン画面が表示されます。
登録をしたユーザアカウントでログインをするとパスワードの変更画面が表示された後、コンテンツ画面が表示されます。

ログイン1

ログイン2

コンテンツの代わりにphpinfoを表示するようにしております。
上記のように表示が出来れば設定が正常にできています。

コンテンツ表示

その他

An error was encountered with the requested page.のエラーについて

認証画面で上記エラーが表示される場合、アプリクライアントの詳細設定のコールバックURLが間違えている可能性がございます。
OAuthの場合、コールバックURLには「https://[コンテンツが掲載されているドメイン]/oauth2/idpresponse」になるように設定ください。

■ Application Load Balancer を使用してユーザーを認証するを参照してください。
https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/listener-authenticate-users.html

認証を一部パス(コンテンツ)に適用する場合

ALBの設定でパスルーティングの設定を利用する事で「https://[コンテンツが掲載されているドメイン]/secret/」など決まったパスのみ適用する事が可能です。
上記の場合はルールを2点に設定して 「/secret/*」の場合のみ認証を設定します。

認証を一部パス(コンテンツ)に適用する場合

さいごに

今回はEC2とALBでコンテンツ配信をしているところにCognitoの認証を追加してみました。
上記は英語やデザインが固定化される制限ございますが簡易に認証を実装する場合おすすめでございます。
少しでもお客様の参考になればと考えております。