🥃

BedrockのナレッジベースとSharePointを連携してみた

に公開

はじめに

AWSでRAGを構築できるマネージドサービスとして、Amazon Bedrockのナレッジベースがあります。ナレッジベースのデータソースにはS3を用いるのが最も一般的と思いますが、実はMicrosoftのSharePointをデータソースとする機能も1年以上前にリリースされています。(ただし1年たった今でもプレビューです)

https://aws.amazon.com/jp/blogs/news/knowledge-bases-for-amazon-bedrock-now-supports-additional-data-connectors-in-preview/

こちらの機能を今更ながら試してみました。しかし、正直なところ現状では本格的な業務利用は難しそうと感じました。この記事ではイマイチに感じた点を交えながら、実際の連携方法について記述したいと思います。

セキュリティ的に推奨される連携方法が存在しない

この連携の最も良くないポイントとしては、推奨できる連携方法が存在しない点です。というか推奨されない連携方法しか存在しません。

https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/sharepoint-data-source-connector.html

AWSのドキュメントを見ると、連携方法は2つ存在しています。

  1. SharePoint App-Only 認証で接続
  2. OAuth2.0 認証で接続

この選択肢だけをみると、2つ目のOAuth2.0認証が良いように見えるかもしれません。しかし、この方式はAWS自らが非推奨としています。

というのも、この方式ではSharePointの管理者のユーザー名とパスワードをAWS上に保存することで、Bedrockが管理者になりすましてデータを取得します。普通にセキュリティ的に問題があると思います。しかも、この管理者にMFAが設定されていると認証を通せませんので、MFA必須の組織では選択肢に入りません。私も試せませんでした。

ということで、必然的に1つ目のSharePoint App-Only 認証での接続を試すことにしました。
ですがこの方式は、、、私が調べた限りだと既に廃止が決定しており、2026年4月以降は使えません。
https://learn.microsoft.com/ja-jp/sharepoint/dev/sp-add-ins/retirement-announcement-for-azure-acs

という感じで、用意されている選択肢の全てが推奨されないのが現状です。ですが、現時点ではまだSharePoint App-Only認証は使用できるので、この方式で実際にAWS上にナレッジベースを構築して動かすところまで試してみました。

実際にSharePoint App-Only 認証でナレッジベースとSharePointを連携してみる

では、実際に接続する手順を紹介します。なお、AWSとMicrosoftの公式ドキュメントだけではエラーが解消できず、主にGeminiのDeep Researchと、こちらの海外の技術記事を参考にさせていただきました。

https://www.c-sharpcorner.com/article/create-amazon-bedrock-kb-with-sharepoint-app-only-auth/

Microsoft EntraIDでアプリケーションを登録

今回はSharePoint App-Only 認証での接続ですが、なぜかEntra IDのアプリも必要です。(詳しい人いたらなぜ必要なのか教えて下さい。。。)

Entra 管理センターから以下の手順でアプリを作成します。
https://entra.microsoft.com/

  1. トップページで「テナントID」をメモっておく(だいぶ後で使います。)
  2. 「アプリの登録」から「新規登録」を実行
  3. 適当なアプリ名をつけて「この組織ディレクトリ内のアカウントのみ」を選択して登録(リダイレクトURIは不要)
  4. 登録したアプリの「証明書とシークレット」から新しいクライアントシークレットを作成。「シークレットID」と「値」をメモ(値は二度と確認できないので注意。メモを忘れたら再生成が必要)

なお、このアプリにSharePointの権限の付与が必要だと思っていたのですが、この記事を書きながら試していたら無くても動きました。やっぱりこのアプリの必要性が謎です。

SharePointサイトで、App-Onlyアプリの登録と権限付与

BedrockのナレッジベースのデータソースにするSharePointサイトに、App-Onlyアプリを登録して権限を付与します。
この記事では https://yourdomain.sharepoint.com/sites/bedrock-source/ を対象とすることにして話を進めます。実際に作業をする場合は自分のSharePointのURLに置き換えてください。

  1. まずは、https://yourdomain.sharepoint.com/sites/bedrock-source/_layouts/15/appregnew.aspxにアクセスします。
    • 直接URLを指定する必要があります。/_layouts/15/appregnew.aspxをコピーして自分のサイトのURLの後ろにくっつけてください。
  2. 雑に作られた設定ページが表示されたら「タイトル」に分かりやすい名前を入れてください。「アプリドメイン」と「リダイレクト先のURI」は使用しないので何でも良いはずです。ですが、localhostにしたら「原因不明のエラー」が表示されて作成できなかったので、画面に表示されている例をそのまま入力しました。
  3. 作成を押下して、表示される「クライアントID」と「クライアント シークレット」をメモします。
    • なお「クライアントシークレット」は二度と確認できないので注意してください。また「クライアントID」の方も私には再確認方法が分かりませんでした。両方しっかりメモしましょう。
  4. 次はhttps://yourdomain.sharepoint.com/sites/bedrock-source/_layouts/15/appinv.aspxにアクセスします。
    • こんどは、末尾が/_layouts/15/appinv.aspxです。
  5. アプリIDに直前でメモった「クライアントID」を入力して「参照」を押下します。
  6. 「権限の要求 XML」に以下の入力します。(公式ドキュメントだけではここで設定するべき権限がよく分からず、結構ハマりました。)
<AppPermissionRequests AllowAppOnlyPolicy="true">
  <AppPermissionRequest Scope="http://sharepoint/content/sitecollection" Right="Read" />
</AppPermissionRequests>
  1. 「作成」を押下して、次のページで「信頼する」を押下します。

SharePointの権限設定は以上です。

AWS Secrets Managerに認証情報を設定

AWS Secrets Managerに新規シークレットを作成して、以下のkey:valueを設定してください。

  • clientId: Entra IDのクライアントのシークレットID
  • clientSecret: Entra IDのクライアントのシークレットの値
  • sharePointClientId: SharePointのクライアントID
  • sharePointClientSecret: SharePointのクライアントシークレット

なお、シークレットとナレッジベースは同じregionで作る必要があるのでご注意ください。
私はシークレットを東京、ナレッジベースをオレゴンに作ってエラーになりました。

シークレットが作成できたら、シークレットのARNをコピーしておいてください。

Bedrockのナレッジベースのデータソースの作成

最後にナレッジベースのデータソースを作成します。
なお、この記事ではナレッジベース自体の作成は省略して、データソースの部分だけ説明します。

  1. AWSコンソールでAmazon Bedrockのナレッジベースの画面からデータソースを追加まで進みます。
  2. データソースタイプとしてSharepointを選択します。
  3. 名前は分かりやすい名前を適当につけます。
  4. ソースに以下を入力します。
    • サイトURL: https://yourdomain.sharepoint.com/sites/bedrock-source/
    • ドメイン: yourdomain
      • ここが最もハマりました。ドメインは、yourdomain.sharepoint.comではなくyourdomainの部分のみを指定する必要があります。
  5. 認証を設定します。
    • 認証方式: 「SharePointアプリ専用認証」を選択
      • なお、編集時に初期表示が「OAuth2.0認証」に固定されるバグがあります。編集のたびに選び直す必要があるので注意しましょう。
    • テナントID: 最初にメモったEntraのテナントIDを入力
    • AWS Secrets Manager シークレット: さっき作ったシークレットのARNを入力
  6. こだわりがあれば、チャンク戦略やメタデータ等を設定
  7. 「Next」を押下して内容を確認したら、「Add data source」
  8. データソースが作成されたら同期を実行

設定が間違っていなければ、同期が成功するはずです。
なお失敗した場合、エラー文言が殆どの場合で原因を特定できない内容なので、あきらめて気合で見直してください。

実際に動かしてみる

構築できたら、コンソール上で実際に動かしてみましょう。

無事にSharePoint上のファイルからAIが回答を生成してくれました!

まとめ

連携は出来たのですが、エンタープライズ利用に耐えうる連携方法が実質的に存在しないのは致命的かと思います。今後のバージョンアップによりEntraIDのアプリだけで連携できるようになってくれれば、使えるケースもでてくるのではないかと思うので期待したいです。
あとプレビュー機能とはいえ、もうちょっとドキュメントを充実させるべきだと思います。
今回は公式情報から読み取れない設定方法を海外の技術記事を調べ上げてまとめてくれたGeminiくんが非常に役に立ちました。

NCDCエンジニアブログ

Discussion