AWSのALB+Cognito認証で、 500エラーが発生したときの話

アイキャッチ画像

背景について

あるアプリケーションを構築する際、Community版(オープンソース版)とEnterprise版(商用版)の2つのエディションがありました。
そのうち、Community版には、多要素認証(MFA)の機能が標準で備わっていませんでした。

アプリ自体にもログイン機能はありますが、それだけではセキュリティ面で不十分だと判断し、ALBとAmazon Cognitoを組み合わせて、多要素認証を追加する構成を検討・検証することになりました。

また、私自身はAWSを利用した実務経験がなく、今回の検証を通してALBやCognito、セキュリティグループなどの仕組みを調べながら進めることになりました。

ALBとCognitoについて

1.  ALB(Application Load Balancer)

Webアプリケーションへのアクセスを複数のサーバーやコンテナに振り分け、負荷を分散するAWSのロードバランサーです。

AWSには、ALBのほかにもNLB(Network Load Balancer)やGWLB(Gateway Load Balancer)など、用途に応じた複数のロードバランサーが用意されています。 

2. Amazon Cognito

Webアプリケーションやモバイルアプリに、ユーザー登録・ログイン・認証といった機能を追加できるAWSのサービスです。
ユーザー情報の管理や、認証後のアクセス制御なども行うことができ、アプリ側で認証機能を一から実装する負担を減らせます。 

当時の状況

ALBとCognitoの設定を終え、メールOTP認証※1の検証を行っていたところ、ワンタイムパスワード自体は正常にメールで受信できました。

しかし、そのワンタイムパスワードを入力して認証を完了すると、500エラーが発生する状況となりました。

※1 メールOTP認証とは、ログイン時に登録されているメールアドレスへワンタイムパスワードを送信し、そのコードを入力することで本人確認を行う認証方式です。

調査について

1. 設定を調査 

最初に疑ったのは、Cognitoの設定やALBのリスナールール※2などでした。

しかし、今回はCognitoの認証画面の表示やメールOTPの受信までは正常に行えていました。
また、Cognitoを設定しない状態では正常にアプリへ到達できていたため、アプリ側ではなく、Cognito認証に関わる別の部分に原因があるのではないかと考えました。

※2 ALBのリスナールールとは、ALBが受け取ったリクエストに対して、URLのパスやホスト名などの条件をもとに、どの処理や接続先へ振り分けるかを決める設定です。 

2. 通信について調査 

ALBとCognitoの構成について参考サイトを確認しながら調査を進めたところ、ALBからCognitoへHTTPSによる外向き通信が必要であることが分かりました。 

そこでALBに設定されているセキュリティグループ※3を確認したところ、インターネットへの外向き通信が許可されていませんでした。

このことから、ALBからCognitoへ必要な通信を行えないことが、500エラーの原因であると判明しました。

※3 セキュリティグループとは、AWS上のリソースに対して、どの通信を許可するかを制御する仮想ファイアウォールです。受信する通信(インバウンド)と、外向きの通信(アウトバウンド)をそれぞれ設定できます。 

まとめ

CognitoはAWSが管理するマネージドサービス※4であり、利用する構成によってはインターネットへの通信が必要になります。

今回のように、VPC※5内に配置できないサービスや、VPC外のAWSサービスと通信する構成では、外向き通信が許可されているかを確認することが重要です。

そのため、同様のエラーが発生した場合は、アプリケーションやAWSサービスの設定だけでなく、セキュリティグループのアウトバウンド設定についても確認することをおすすめします。

※4 マネージドサービスとは、サービスを動かすためのサーバー管理や保守などをAWS側が行ってくれるサービスです。
※5 VPC(Virtual Private Cloud)とは、AWS上に作成できる仮想的なネットワーク環境です。IPアドレスの範囲やサブネット、ルーティングなどを設定し、AWSリソースを配置するネットワークを構築できます。