Amazon Bedrock Knowledge Bases 構造化データ取得機能の作成でデータ同期に躓いたので、その解決策を共有します

## Amazon Bedrock Knowledge Bases 構造化データ取得機能とは

AWS re:Invent 2024 の Keynote にて、 Amazon Bedrock Knowledge Bases で構造化データ取得のサポートが発表されました。
この機能によって、データソースから構造化データを取得するための自然言語クエリを用意すると、 Bedrock が自然言語クエリを自動で SQL クエリに変換して、構造化データを取得することができるようになりました。
つまり、ユーザは構造化データを移動したり前処理したりすることなく、自然言語クエリを使って（Redshift 等のデータソースから）直接取得することが可能になります。

https://aws.amazon.com/jp/about-aws/whats-new/2024/12/amazon-bedrock-knowledge-bases-structured-data-retrieval/


## 触ってみる
事前準備： Amazon Redshift で Redshift serverless リソースを構築し、任意のデータを取り込む。

①Amazon Bedrock のコンソールトップ画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467546/cc2016b8-5f43-49ec-938d-356393d7e7ff.png)

②「ナレッジベース」
＞「ナレッジベースを作成」＞「Knowledge Base structured data store」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467546/77b682d7-34a6-4e4d-89c4-6260eaf4691c.png)

③「ステップ1　ナレッジベースの詳細を入力」にて、

「ナレッジベースの詳細」＞「ナレッジベース名」

「Data source details」＞「Query engine」

「IAM許可」＞「新しいサービスロールを作成して使用」　＞「サービスロール名」（自動入力）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467546/1f4d58b4-d1d6-49ef-b25e-4f746267522a.png)

④「ステップ2　Configure query engine」にて、

「Query engine details」
＞「Connection options」　
　＞「Redshift serverless」
＞「Workgroup」
　＞作成したワークグループを選択

「Authentication」＞「IAM Role」

「Default storage metadata」
＞「Options」
　＞「Amazon Redshift databases」
　＞「Redshift database list」
＞「Database」
　＞「dev」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467546/3f1e29a2-6c05-45e3-a160-c0149c2772fe.png)


⑤「ステップ3　確認して作成」にて、

ステップ1&2の設定内容を確認して、「ナレッジベースを作成」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467546/05f820a6-89b6-4edb-b75a-b99b988ad985.png)

⑥「ステータス」=「利用可能」となったら、作成完了

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467546/1bbd4df5-21fb-4d24-be92-8f92fdd2eeee.png)

⑦（Redshift serverless側にて）データベースユーザーを作成
```
CREATE USER "IAMR:${service-role}" WITH PASSWORD DISABLE;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467546/e4e06d53-0694-42e6-a917-6e84d527f24c.png)

⑧（Redshift serverless側にて）データベースユーザーにデータベースから情報を取得する権限を付与
```
GRANT SELECT ON ${schemaName}.${tableName} TO "IAMR:${serviceRole}";
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467546/64ecee71-74ac-4795-8d7a-f9e32a7a5ca4.png)


## 躓き

この後、メタデータの取り込み処理＝「同期（Sync）」において失敗。
※同期してメタデータを取得することにより、Amazon Bedrock Knowledge Bases はユーザープロンプトを接続されたデータベースのクエリに変換できるようになります。

https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/kb-data-source-structured-sync-ingest.html

次のコマンドを実行することで解決！
```
GRANT USAGE ON SCHEMA ${schemaName} TO "IAMR:${serviceRole}";
```

※同期失敗の原因：スキーマを新規作成していたが、その使用権限が不足していた。


:::note info
なお、記事作成時点では、以下リンク先の公式ドキュメントが公開されており、私が躓いたポイントに対する対策がまとめられていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467546/4cac901e-0609-4663-afd4-df9d2586b439.png)


https://docs.aws.amazon.com/bedrock/latest/userguide/knowledge-base-prereq-structured-db-access.html

:::

## 参考情報

・Amazon Bedrock Knowledge Bases 構造化データ取得機能を検証するにあたって参考にした記事

https://qiita.com/hayao_k/items/460bf6aa8b0424eb0d82

https://zenn.dev/fusic/articles/github-zenn-linkage-20241206-1

・筆者にて当記事に関する LT を行った際の PowerPoint スライド

https://speakerdeck.com/shinyayoshidao/ji-tian-ltda-hui-20241216