Application Load Balancer で Amazon Cognito 認証を使用したいのですが、ユーザープールは別の AWS アカウントにあります。そのため認証にはクロスアカウントユーザープールを使いたいと考えています。
簡単な説明
Application Load Balancer をユーザー認証用に設定する場合、デフォルトでは同じアカウントの Amazon Cognito ユーザープールのみがサポートされます。ただし、回避策として、クロスアカウントユーザープールを OpenID Connect (OIDC) ID プロバイダー (IdP) として設定することができます。
以下の手順に従って、あるアカウント (「アカウント B」) の Application Load Balancer を、別のアカウント (「アカウント A」) のユーザープールを介して認証するように設定します。
解決策
Application Load Balancer を作成する
まだ作成していない場合は、アカウント B で HTTPS リスナーを使用して Application Load Balancer を作成します。
注: authenticate-cognito と authenticate-oidc ルールアクションタイプは、HTTPSリスナーでのみサポートされます。
アカウント B の Application Load Balancer の DNS 名を取得する
- アカウント B で、Amazon Elastic Compute Cloud (Amazon EC2) コンソールの [ロードバランサー] ページを開きます。
- Application Load Balancer を選択します。
- [説明] タブで、ロードバランサーの DNS 名をコピーします。これは、後でロードバランサーのエンドポイント URL にアクセスしてテストするために必要です。
アカウント A でユーザープールを作成して設定する
- アカウント A で、アプリクライアントを使用して Amazon Cognito ユーザープールを作成します。アプリクライアントの場合は、必ず [クライアントシークレットを生成] オプションを選択してください。詳細については、「Amazon Cognito 使用の準備」を参照してください。
注: ユーザープールの作成時に、本番環境に必要な設定を行います。一部のユーザープール設定は、ユーザープールの作成後に変更できません。たとえば、ユーザー登録に必要な標準属性は変更できません。
- Amazon Cognito コンソールのユーザープールの [ユーザープールの概要] セクションで、ユーザープール ID を書き留めます。これは後でユーザープールの OIDC 設定の詳細を収集する際に必要になります。
- [アプリ統合] タブの [ドメイン] に移動します。ユーザープールに Amazon Cognito ドメイン名を追加します。これは、Cognito でホストされている UI に必要な固有のドメインプレフィックスです。
- [アプリ統合] タブで、[アプリクライアント] リストに移動します。
- 更新するアプリクライアントを選択します。[アプリクライアント] ページで、次の手順を実行します。
[クライアントシークレットを表示] をオンにします。
アプリクライアント ID とアプリクライアントシークレットをコピーします。Application Load Balancer をユーザー認証用に設定するには、これらの値が必要です。
- [アプリクライアント] ページで、[ホストされている UI] セクションに移動し**、** [編集] をクリックします。
- [ホストされている UI の編集] ページで、次の手順を実行します。
[ID プロバイダー] で、[Cognito ユーザープール] を選択します。
[コールバック URL を追加] には、https://loadBalancerDNSName/oauth2/idpresponse と入力します。または、CNAME レコードを使用してカスタムドメインをロードバランサーにマッピングした場合は、https://CNAME/oauth2/idpresponse と入力します。
注: loadBalancerDNSName を Amazon EC2 コンソールからコピーした DNS 名に置き換えます。CNAME レコードを使用している場合は、CNAME をカスタムドメインに置き換えてください。URL の値が小文字であることを確認してください。小文字でないと、エラーが表示されます。
[サインアウト URL の追加] に、サインアウト後にユーザーをリダイレクトする URL を入力します。テストでは、**https://www.example.com/**などの有効な URL を入力します。
[OAuth 2.0 の付与タイプ] では、[認証コード付与] を選択します。
[OpenID Connect のスコープ] では、[OpenID] を選択します。openid スコープが ID トークンを返します。
ユースケースの必要に応じて、その他の OAuth スコープを入力します。
- [変更を保存] を選択します。
詳細については、「ユーザープールアプリクライアントの設定」と「ユーザープールへの OIDC ID プロバイダーの追加」を参照してください。
ユーザープールの OIDC 設定の詳細を取得する
ユーザープールの OIDC 設定エンドポイントにアクセスします。ユーザープールを Application Load Balancer の OIDC IdP として設定するには、設定の詳細が必要です。
- ブラウザで、URL「** https://cognito-idp.region.amazonaws.com/userPoolId/.well-known/openid-configuration** 」と入力します。
注: region は、ユーザープールの AWS リージョンで置き換えてください(us-east-1 など)。 userPoolId は、先にメモしておいたユーザープールの ID に置き換えてください。
- ブラウザに表示される JSON レスポンスをコピーします。以下のフィールドの値に注意してください。
authorization_endpoint
issuer
scopes_supported
token_endpoint
userinfo_endpoint
アカウント B で Application Load Balancer を設定します。
- アカウント B の Amazon EC2 コンソールの [ロードバランサー] ページで、Application Load Balancer を選択します。
- [リスナー] タブの [ルール] で、HTTPS リスナーの [ルールを表示/編集] を選択します。
- メニューバーで、鉛筆アイコン ([ルールを編集]) を選択します。
- HTTPS リスナーのデフォルトルールの横にある鉛筆アイコン ([ルールを編集]) を選択します。
- [THEN] で [アクションを追加] を選択して、次の手順を実行します。
[認証] を選択します。
[認証] では [OIDC] を選択します。
[発行者] ではユーザープールの OIDC 設定の [発行者]の値を入力します。
[認証エンドポイント] には、authorization_endpoint の値を入力します。
[トークンエンドポイント] には、token_endpoint の値を入力します。
[ユーザー情報エンドポイント] には、userinfo_endpoint の値を入力します。
[クライアント ID] には、Amazon Cognito コンソールから先にコピーしたアプリクライアント ID を入力します。
[クライアントシークレット] には、先にコピーしたアプリクライアントシークレットを入力します。
[詳細設定] を展開します。
[スコープ] には、ユーザープールアプリクライアントに設定したスコープをスペースで区切って入力します。ユーザープールの OIDC 設定でスコープを検索します。たとえば、設定内の scopes_supported 値が ["openid","email","phone","profile"] の場合、openid メール電話プロファイルを入力します。
次に、チェックマークアイコンを選択します。
- [THEN] で [アクションを追加] を選択して、次の手順を実行します。
注: [アクションを追加] を選択できない場合は、現在のルーティングアクション ([リダイレクト先] など) を削除します。その後、もう一度お試しください。
[転送先] を選択します。
[転送先] で、1 つ以上のターゲットグループを選択します。
(オプション) [グループレベルの維持設定] を設定します。
次に、チェックマークアイコンを選択します。
- [更新] を選択します。HTTPS リスナーのデフォルトルールが更新されます。
詳細については、「ルールを編集する」を参照してください。
セットアップをテストする
ブラウザで、次の URL のいずれかを入力します。
- https://loadBalancerDNSName/
- https://CNAME/
注: LoadBalancerDNSName は、Amazon EC2 コンソールから先にコピーした DNS 名に置き換えます。または、CNAME をカスタムドメインに置き換えます。
ユーザープールの Amazon Cognito がホストするウェブ UI にリダイレクトされます。ユーザーがここにサインインし、ユーザープールによって認証されると、ターゲットにリダイレクトされます。
関連情報
Application Load Balancer の開始
Application Load Balancer の組み込み認証でログインを簡素化
Application Load Balancer を使用してユーザーを認証する
Application Load Balancer のリスナールール
OIDC ユーザープール IdP 認証フロー