ALBとCognitoでプライベートサブネットのサービスに特定ユーザーのみアクセスできるようにしてみた

ALBとCognitoでプライベートサブネットのサービスに特定ユーザーのみアクセスできるようにしてみた

Clock Icon2025.07.18

ゲームソリューション部の えがわ です。

プライベートサブネットに配置している外部公開していないサービスに対して、協力会社やリモートワークなどで外部環境からアクセスが必要になるケースがあります。

今回は、最低限の構成で特定のユーザーのみに限定したアクセス制御を実装してみたので、同じような記事はありますが、備忘録として残します。

前提

  • ACM(AWS Certificate Manager)に証明書を設定済み

構成図

今回の構成図はこちらです。
プライベートサブネットに配置しているサービスに対して、特定のユーザーがアクセスできるようにします。

private_subnet_alb_cognito_26.png

ALBを配置し、任意のパスに対してCognitoで認証を設定します。
なお、認可の設定はないため、複数のサービスがある場合はアプリケーションレイヤーで制御するか、サービス毎にユーザープールを作成する必要があります。
よりセキュアにするために、WAFを追加することをお勧めします。

検証用サービスの準備

想定サービスとして、EC2で最低限のWebサービスを起動しておきます。

mkdir ~/ins1
cat > ~/ins1/index.html << EOF
<!DOCTYPE html>
<html>
<body>
    <h1>Ins 1</h1>
</body>
</html>
EOF

python3 -m http.server 8000

Cognitoユーザープールの作成

Cognitoのユーザープールを作成します。

email + パスワードでログインできるように、以下の設定にします。

private_subnet_alb_cognito_02.png
private_subnet_alb_cognito_01.png

特定のユーザーのみアクセス可能としたいため、自己登録を無効にします。

private_subnet_alb_cognito_03.png

セキュリティを向上させるため、MFAも有効にします。
private_subnet_alb_cognito_10.png

private_subnet_alb_cognito_11.png

コンソールからログイン可能なユーザーを登録します。

private_subnet_alb_cognito_04.png

private_subnet_alb_cognito_15.png

アプリケーションクライアントのログインページセクションの「許可されているコールバック URL」を以下に設定しておきます。

https://{your-domain}/oauth2/idpresponse

private_subnet_alb_cognito_08.png

ターゲットグループの作成

ALB用のターゲットグループを作成しサービスを起動しているEC2を登録します。

private_subnet_alb_cognito_14.png

Application Load Balancer(ALB)の作成

次にALBを作成します。

ALB作成時にはターゲットグループの設定が必須となっていますが、この段階ではルールの設定ができません。
HTTPやHTTPSを許可しているセキュリティグループを設定すると、ルールを設定するまで外部に公開されてしまうため、ALB作成時にはダミーターゲットグループを設定するか、何も許可していないセキュリティグループを設定しておくことをお勧めします。
今回は何も許可していないセキュリティグループを設定しています。

private_subnet_alb_cognito_12.png

private_subnet_alb_cognito_16.png

リスナールールの設定

設定したルートに対してルールを設定します。

private_subnet_alb_cognito_17.png

「ユーザーを認証」にチェックを入れ、Amazon Cognitoを選択します。

ユーザープール、ユーザープールドメイン、アプリケーションクライアントを設定して保存します。

private_subnet_alb_cognito_06.png

これで、リスナールールが設定できました。

private_subnet_alb_cognito_19.png

次に、セキュリティグループを変更してアクセスできるようにします。

private_subnet_alb_cognito_27.png

Route53の設定

Route53のレコードを作成し、ALBへルーティングさせます。

private_subnet_alb_cognito_20.png

動作確認

実際にアクセスしてみます。

ドメインにアクセスすると、Cognitoのログイン画面が表示されます。

private_subnet_alb_cognito_22.png

作成したユーザーでログインします。初回ログイン時は、メールで送られてきた仮パスワードでログインし、新しいパスワードを設定します。

private_subnet_alb_cognito_23.png

MFAを有効にしているため、認証アプリを使用する必要があります。

private_subnet_alb_cognito_24.png

認証が完了すると、対象のWebページが表示されました。

private_subnet_alb_cognito_25.png

さいごに

今回は、ALBとCognitoを組み合わせて、プライベートサブネットのサービスに対するアクセス制御を実装してみました。
CognitoはALBと簡単に連携できるので、簡単にアクセス制御を行うことが可能です。
ですが、冒頭にも記載していますが、認可の設定はないため、複数のサービスがある場合はアプリケーションレイヤーで制御するか、サービス毎にユーザープールを作成する必要があります。
どなたかの参考になれば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.