5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AWS】Cognitoを利用したシンプルな認証機能付きのWebページの作成

5
Posted at

はじめに

こんにちは、やくもです。
前回の記事では、CloudFront と S3 を使った静的ウェブサイトの配信環境を構築しました。

今回はその環境をベースに、Amazon Cognito を使ったシンプルな認証機能を追加してみます。

Amazon Cognito とは

Amazon Cognito は AWS が提供するユーザー認証・認可サービスです。主に以下の機能を提供します。

  • ユーザープール(User Pool): ユーザーのサインアップ・サインインを管理
  • IDプール(Identity Pool): AWS リソースへのアクセス権限を付与

今回はユーザープールを中心に利用します。自前でユーザー管理の仕組みを実装する必要がなく、メールアドレス+パスワードによる認証をかんたんに実現できます。

今回作るもの

前回構築した CloudFront + S3 の構成に、赤枠で囲んだ以下を追加します。

  • Cognito ユーザープール: ユーザーの管理
  • Cognito ホスト型 UI: ログイン画面(自前実装不要)
  • CloudFront + Lambda@Edge: 認証チェックの仕組み

全体像のイメージは以下です。

image.png

構築手順

Cognitoの設定

まず認証機能に必要なCognitoを設定していきます。

image.png

ここでのサインインオプションは「Eメール」を選択します。
リターンURLはCloudFrontのコールバックURLを指定します。

image.png

これにてCognitoのログインページが作成されます。
ユーザー作成などを行い、ログイン後ページが表示されることを確認してみましょう。

image.png

image.png

以下のようにCognitoのログインページから作成したページにコールバックされることを確認できました。

image.png

ですが、現状だとCognito経由で無くとも、直接CloudFrontにリクエストした場合でもアクセスできてしまうので、以下のLambdaを利用してCognitoで認証しないとページの表示ができないようにしていきます。

Lambda@Edgeの作成

以下のリポジトリを参考に関数を作成していきます。

AWSから公開されているこのNode.jsのパッケージをCloudFrontとLambda@Edgeに適用することでCognitoと連携します。
本パッケージの概要は以下です。

Cognito authentication made easy to protect your website with CloudFront and Lambda@Edge.
This Node.js package helps you verify that users making requests to a CloudFront distribution are authenticated using a Cognito user pool. It achieves that by looking at the cookies included in the request and, if the requester is not authenticated, it will redirect then to the user pool's login page.
Cognito認証を簡単に実現し、CloudFrontとLambda@Edgeでウェブサイトを保護します。
このNode.jsパッケージは、CloudFrontディストリビューションへのリクエストを送信するユーザーがCognitoユーザープールで認証されていることを確認するのに役立ちます。リクエストに含まれるクッキーを確認し、リクエスト送信者が認証されていない場合、ユーザープールのログインページへリダイレクトすることでこれを実現します。

Lambda@Edgeにはus-east-1で作成しないといけない制約もあるため、そこも留意が必要です。

まず、マネコンでCloudShellを開き、以下のコマンドを打ち込んでいきます。

mkdir test-cognito-at-edge
cd  test-cognito-at-edge
npm install cognito-at-edge
vi index.js
zip -r hogehoge.zip *

この時必要な最小限のvimコマンドも記載しておきます。

vi index.js // vimの画面が開く
i //挿入モードのなる。その後貼り付けて編集
Esc //ノーマルモードに戻る
:wq + Enter //保存して終了

実際に編集して入力する内容は以下です。

const { Authenticator } = require('cognito-at-edge');

const authenticator = new Authenticator({
  // Replace these parameter values with those of your own environment
  region: 'us-east-1', // user pool region
  userPoolId: '(ユーザープールID)', // user pool ID
  userPoolAppId: '(クライアントID)', // user pool app client ID
  userPoolDomain: '(カスタムドメイン ※https://は不要)', // user pool domain
});

exports.handler = async (request) => authenticator.handle(request);

その後s3バケットに格納します。あらかじめバケットが作成されている必要があります。

aws s3 cp cognito-at-edge.zip s3://<S3バケット名>/cognito-at-edge.zip

続いて、アップロードしたzipファイルをLambda関数に適用します。
関数名は任意でいいですが、ランタイムはnodejs24.x、アーキテクチャはx86にしています。

image.png

また、関数作成時のロールは、「AWSポリシーテンプレートから新しいロールを作成」を選択し、基本的なLambda@edgeの権限を持つポリシーを選択し作成します。
image.png

関数画面から、先ほどアップロードしたS3を選択しコードを上書きして適用します。

image.png

その後Lambda@Edgeへデプロイし、CloudFrontとくっつけます。

image.png

ディストリビューションには、静的サイトに向いているCloudFrontのものを選択します。

image.png

その後、CloudFrontディストリビューションまでデプロイが完了したことを確認したら、実際にアクセスしてみて下さい。認証ページに遷移すれば今回したいことは完了となります。
うまくいかない場合はキャッシュが残っているか、どこかデプロイの段階でエラーが発生していないか確認してみるといいかもしれないです。

さいごに

今回は Amazon Cognito を使って 前回のCloudFront + S3 の静的サイトにシンプルなログイン機能を追加してみました。
パラメータ設定のためにjsファイルを若干編集したものの、ほぼノーコードで静的サイトに対して認証を追加することができました。この記事が参考になれば幸いです!

参考

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?