BedrockのナレッジベースをRedshift Serverlessに接続して自然言語でクエリしてみた

BedrockのナレッジベースをRedshift Serverlessに接続して自然言語でクエリしてみた

Clock Icon2025.07.22

Amazon BedrockのナレッジベースをRedshift Serverlessに接続することで、 Redshift Serverlessに格納されている情報に対して自然言語でクエリができるようになります。

この設定を試す機会があったので、一通りのやり方をまとめておこうと思います。 先に書いておくと、案内がわかりやすいのでほとんど順を追っていくだけでできた感じです!

やってみる

Bedrockのページからスタートします。 デフォルト設定から変更するべき点だけ画像内に注釈しています。

ナレッジベース→作成→「構造化データストアを含むナレッジベース」
Pasted image 20250714171619

IAMロールは新規作成するので「サービスロール名」を入力します。

Pasted image 20250714171722

接続先のRedshift Serverless情報を入力します。 今回はBedrockのIAMロールとして接続する形で試すので 「認証」は「IAMロール」のままとします。

下部の「クエリ設定」の部分では、 特定のテーブルやカラムに説明文を加えたりできるようです。 また「キュレートクエリ」には 「こんな質問をされたらこんなSQLを生成してね」という感じで 質問とSQLの対応例を渡すことができるようです。 これを利用することで、ある典型的な言い回しを設定できたりするのだと思います(未検証)。

これらはオプションですので、何も記述せず次に進みます。

Pasted image 20250714171819

設定は以上なので、内容を確認してナレッジベースを作成します。

Pasted image 20250714171851

ナレッジベースが設定できました。

Pasted image 20250714172025

早速「ナレッジベースをテスト」したいのですが、まだ押せません。 > このナレッジベースをテストするには、1 つ以上のデータソースを同期する必要があります。

と表示されていますので同期をしてみたいと思いますが、 失敗してしまいます。

Pasted image 20250714172147

データソースの同期に失敗しました - 'knowledge-base-quick-start-46m3l-data-source' Errors: Ingestion failed. Either the database is empty, or the user does not have permission to read table data. Ensure the user has read permissions on the respective resource. Please see: https://docs.aws.amazon.com/bedrock/latest/userguide/knowledge-base-prereq-structured.html#knowledge-base-prereq-structured-service-role

と出ました。

これはどういうことかというと、 Redshift ServerlessにIAMロールから接続しようとしているものの、 実際にそのIAMロールではどのテーブルへもアクセスができないという状況のようです。 先ほどのナレッジベース作成で作成されたIAMロールはどこにもアクセスできないということですね。

実際に確認していきます。 このユーザです。

Pasted image 20250714172341

このユーザがどこにアクセスできるかを調べてみると、

WITH privilege_table AS (
    SELECT
          table_schema
         , table_name
         , HAS_TABLE_PRIVILEGE(usename, table_schema || '.' || table_name, 'select') AS select
         , HAS_TABLE_PRIVILEGE(usename, table_schema || '.' || table_name, 'insert') AS insert
         , HAS_TABLE_PRIVILEGE(usename, table_schema || '.' || table_name, 'update') AS update
         , HAS_TABLE_PRIVILEGE(usename, table_schema || '.' || table_name, 'delete') AS delete
         , HAS_TABLE_PRIVILEGE(usename, table_schema || '.' || table_name, 'drop') AS drop
         , HAS_TABLE_PRIVILEGE(usename, table_schema || '.' || table_name, 'references') AS references
         , HAS_TABLE_PRIVILEGE(usename, table_schema || '.' || table_name, 'alter') AS alter
         , HAS_TABLE_PRIVILEGE(usename, table_schema || '.' || table_name, 'truncate') AS truncate
    FROM
         (
              SELECT * from svv_tables
              WHERE table_schema = 'public'
         ) as tables,
         (
              SELECT * FROM PG_USER
              WHERE usename = 'IAMR:AmazonBedrockExecutionRoleForKnowledgeBase_qkbuc'
         ) AS users
)
select * from privilege_table;

主要なテーブル(ここではサンプルですが)へのselect権限がfalseになっています。

Pasted image 20250714172647

これらのテーブルへのアクセス権限を設定してみます。

publicスキーマと、その中の全てのテーブルへのアクセスを許可します。

GRANT USAGE ON SCHEMA public TO "IAMR:AmazonBedrockExecutionRoleForKnowledgeBase_qkbuc";
GRANT SELECT ON ALL TABLES IN SCHEMA public TO "IAMR:AmazonBedrockExecutionRoleForKnowledgeBase_qkbuc";

もう一度同じクエリで確認し、権限がついたことが確認できます。

Pasted image 20250714172849

この状態でナレッジベースの画面に戻り「同期」を試すと、成功しました!

Pasted image 20250714172958

クエリを試してみる

クエリ実行を試してみます。

「ナレッジベースをテスト」をクリックすると、 どのような形での返答を受け取るかの選択肢が出てきます。

  • 取得のみ: データソース
    • 自然言語から生成されたSQLクエリを実行して得られるテーブルデータを受け取る
  • 取得と応答生成: データソースとモデル
    • 自然言語から生成されたSQLクエリの結果を元に、それを説明する自然言語で応答を受け取る
  • SQL クエリの生成
    • 自然言語から生成されるSQLクエリを受け取る

表示される順番がなんか変な気がしますが、

  • SQLクエリを作って
  • それを実行した結果を受けて
  • その内容を説明する自然言語を作る

という順番で処理がされていることがわかります。 まずhデフォルトで選ばれている「取得と応答生成」で進めていきます。

適当なモデルを選択して、

Pasted image 20250714173442

自然言語で問い合わせをすると結果が返ってきました!

「詳細」をクリックすると、投げられたクエリも見られます。

Pasted image 20250714174445

他の受け取り形式も試してみます。 「取得のみ」とすると、クエリの結果だけが表示されます。

Pasted image 20250714174551

「SQLクエリの生成」はクエリのみです。

Pasted image 20250714174618
あまりにもつまらないサンプルテーブルですいません...!

まとめ

BedrockのナレッジベースでRedshift Serverlessに接続ができました。 案内も親切ですし、基本的に書かれている通りにやるだけだと思いますが、 新規IAMロールで接続する場合は、 そのユーザがスキーマ・テーブルにアクセスできるような権限設定が必要となります。 この設定についてはDB内部で設定する必要があるので少し迷うポイントかもしれません。

これでRedshift Serverlessに蓄積されたデータに対して自然言語での問い合わせが可能になりますね!

以上誰かの参考になれば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.