2026年7月17日金曜日

Autonomous AI Databaseのデータベース・ツールを外部認証する - AWS Cognito編

本記事では、AWS Cognitoを外部アイデンティティ・プロバイダーとした設定手順を紹介します。

AWS Cognitoまでは確認しなくて良いかなと思ったのですが、AWS Cognitoのページに「5分未満で無料で開始できます」というボタンがあったので、クリックしました。

データベースの環境などは、これまでの作業環境を踏襲します。GCPの構成を確認した環境をそのまま使用します。DBMS_CLOUD_ADMIN.ENABLE_EXTERNAL_AUTHENTICATIONで設定する環境は、Oracle IAMかMicrosoft Entra IDかのどちらかを選択しますが、DBMS_CLOUD_FUNCTION_ADMIN.CREATE_IDPで作成するIDPは、同時に複数のIDPを作成できます。


AWS Cognitoの構成



アプリケーションを定義します。

アプリケーションタイプとして従来のウェブアプリケーションを選択します。アプリケーションの名前SALESADBとします。

最低限のオプションを設定します。

サインイン識別子のオプションメールアドレスチェックします。また、サインアップのための必須属性としてemailを選択します。

リターンURLとして以下の形式のリダイレクトURIを設定します。

https://[パブリック・アクセスURLのホスト部]/adb/auth/v1/connect/aws/callback

以上でユーザーディレクトリを作成します。


ユーザープールが作成されます。作成されたユーザープールを開きます。


OpenID Connect設定URLをコピーします。この値はDBMS_CLOUD_FUNCTION_ADMIN.CREATE_IDPの引数discovery_urlの値になります。


サイド・メニューのアプリケーションからアプリケーションクライアントを開き、作成済みのアプリケーションクライアントSALESADBを開きます。


クライアントIDクライアントシークレットをコピーします。これらも、DBMS_CLOUD_FUNCTION_ADMIN.CREATE_IDPの引数の値になります。


ユーザー管理ユーザーを開き、接続に使用するユーザーを作成します。

メールアドレスとパスワードでサインインできるように、ユーザーを作成しています。


グループとしてsales_dbusersを作成します。説明に、データベースに接続できるユーザーと書きました。

公式ドキュメントのProvider Specific Noteには、shared-role mappings with AWS_ROLEと記述されているのですが、実際にAWS_ROLEとして指定するのは、ここで作成しているグループ名でした。ロールを作成して同様にユーザー認証されるかどうかは、確認していません。


グループsales_dbusersに、先ほど作成したテスト用のユーザーを追加します。


以上で、AWS CognitoにOAuthクライアントが作成されました。



データベース・ツールの外部認証の構成



GCPでの構成から、作業を継続している前提です。

IDPとしてAWS Cognitoを作成します。
BEGIN
   DBMS_CLOUD_FUNCTION_ADMIN.CREATE_IDP(
      idp_name       => 'AWS',
      client_id      => '<client-id>',
      client_secret  => '<client-secret>',
      params         => JSON_OBJECT(
                           'discovery_url' VALUE
                           'https://cognito-idp.<region>.amazonaws.com/<user-pool-id>/.well-known/openid-configuration'
                           ));
END;
/

SQL> BEGIN

  2     DBMS_CLOUD_FUNCTION_ADMIN.CREATE_IDP(

  3        idp_name       => 'AWS',

  4        client_id      => '**********************',

  5        client_secret  => '**************************************',

  6        params         => JSON_OBJECT(

  7                             'discovery_url' VALUE

  8                             'https://cognito-idp.us-east-1.amazonaws.com/us-east-1_***************/.well-known/openid-configuration'

  9                             ));

 10  END;

 11* /


PL/SQLプロシージャが正常に完了しました。


SQL>


データベース・ユーザーWKSP_APEXDEVに紐づけられている、グローバル・ユーザーの定義を更新します。

alter user wksp_apexdev identified globally as 'AWS_ROLE=sales_dbusers';

SQL> alter user wksp_apexdev identified globally as 'AWS_ROLE=sales_dbusers';


User WKSP_APEXDEVが変更されました。


SQL> 


初回の構成であれば、ユーザーWSKP_APEXDEVへの権限の付与、DBMS_CLOUD_ADMIN.ENABLE_EXTERNAL_AUTHENTICATIONおよびORDS_ADMIN.ENABLE_SCHEMAも実行します。

以上で、データベース・ツールの認証にAWS Cognitoを使用できるようになりました。


データベース・ツールへの接続



Autonomous AI Databaseに接続し、使用するツールとしてSQL Developer Webを選択します。


SSOでサインインをクリックします。


外部アイデンティティ・プロバイダーとしてAWSを選択します。


AWS Cognitoのサインイン画面が表示されます。テスト用に作成したユーザーのメールアドレスを入力し、Nextをクリックします。


パスワードを入力し、Continueをクリックします。


HTTPのステータス・コードとして404 Not Foundが返されました。これは、ORDS別名として設定したapexdevではなく、スキーマ名がURLに含まれるために発生しています。

ブラウザに表示されているURLの/ords/wksp_apexdev/_sdw/の部分を/ords/apexdev/_sdw/に変更して、URLにアクセスします。

URLを変更すると、データベース・アクションに接続されます。


AWS Cognitoで認証したユーザーにて、データベース・ツールに接続できました。



Oracle APEXへの接続




ワークスペースAPEXDEVが作成済みとします。AWS Cognitoで作成したユーザーを管理者ユーザーとして追加します。

APEX_UTIL.SET_WORKSPACEを呼び出し、対象のワークスペースに切り替えてから、APEX_UTIL.CREATE_USERを呼び出します。
begin
apex_util.set_workspace('APEXDEV');
apex_util.create_user(
    p_user_name        => upper('<AWS Cognitoユーザー>'),
    p_web_password     => '<パスワード>',
    p_developer_privs  => 'ADMIN:CREATE:DATA_LOADER:EDIT:HELP:MONITOR:SQL',
    p_email_address    => '<AWS Cognitoユーザー>',
    p_default_schema   => 'WKSP_APEXDEV',
    p_change_password_on_first_use => 'N'
);
end;
/
commit;
exit
以上で、APEXワークスペースと管理者ユーザーの追加ができました。

APEXへの接続を確認します。

ORDSのランディング・ページより、Oracle APEX実行します。


AWSを選択します。


AWS Cognitoでサインインします。


AWS Cognitoでサインインしたユーザーに、ワークスペースAPEXDEVが紐づいています。

APEXDEVを選択します。


APEXにサインインできました。


以上で、外部アイデンティ・プロバイダーで認証したユーザーで、Oracle APEXの開発ツールに接続できました。

今回の記事は以上になります。