generative-ai-use-cases icon indicating copy to clipboard operation
generative-ai-use-cases copied to clipboard

KendraにACLを設定しCognitoのユーザーグループと連携したい

Open routeone34 opened this issue 1 year ago • 4 comments

機能リクエストは何か問題に関連していますか?背景を説明してください 1つのKendraインデックスをAccess Conteol List(以下ACL)で論理的に分割し、 Cognitoのユーザーグループ単位でアクセス制限したいと考えています。

これが可能になると1つのGenU環境を、セキュリティを確保しながら 多数の部門で評価することができ、Kendaコストも削減できるので、 当方としては非常にありがたい機能になります。

追加 or 改善したい機能について 機能追加要望として以下を挙げさせていただきます。 「S3データソースからmetadata.json等で生成したKendraのACLに対し Cognitoユーザーグループ単位でRAG生成できるようにする」

(詳細) GenUのデプロイで生成したKendraの「User Access Control」の設定は既定で Token type: OpenID Signing key object: cognitoユーザープールのURL Username: cognito:username Groups: cognito:groups となっており、すぐにも連携できそうに見えますが

{ "AccessControlList": [ { "Access": "ALLOW", "Name": "Group1", "Type": "GROUP" } ] } のようなmetadata.jsonを作ってACLを認識させても、 GenUからは正しく検索できません。

Amazonの技術担当の人に調べてもらったところ、 queryKendra.tsがkenrdaにQueryを投げるところでCognitoの情報を渡していないので ACLが付いたものはRAG対象外になってしまうようです。 これを可能にしてほしいという要望になります。

routeone34 avatar Dec 06 '24 01:12 routeone34

Kendra から情報を取得する際には retrieveKendra.ts が使われます。

以下の RetrieveCommand 内に https://github.com/aws-samples/generative-ai-use-cases-jp/blob/main/packages/cdk/lambda/retrieveKendra.ts#L43

UserContext -> Groups が設定できるので https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/kendra/command/RetrieveCommand/

そちらで動作でするか確認していただくのはどうでしょうか?

congito:groups は以下の要領で取得できると思います。 https://github.com/aws-samples/generative-ai-use-cases-jp/blob/main/packages/cdk/lambda/listChats.ts#L8-L9

まとめると、以下のような実装を追加することになるかと思います。(動作未確認です。)

const groups: string[] = event.requestContext.authorizer!.claims['cognito:groups'].split(',');

...

const retrieveCommand = new RetrieveCommand({
  IndexId: INDEX_ID,
  QueryText: query,
  AttributeFilter: attributeFilter,
  UserContext: {
    Groups: groups,
  },
});

tbrand avatar Dec 06 '24 07:12 tbrand

回答ありがとうございます。 当方にTypeScriptの技術が乏しく、また自由にソースを弄って試す環境を 作る能力が現状ないのですが、そこは色々調べてやってみます。

一方で需要が多そうな機能とも思うので、 エンハンス項目に含めていただくよう、要望としては継続して挙げさせて下さい。

routeone34 avatar Dec 09 '24 04:12 routeone34

このACLのやり方とかどうですか? https://dev.classmethod.jp/articles/methods-to-select-target-document-in-kendra-search/#toc-attributefilter

rag.tsを const dataSourceProps: kendra.CfnDataSourceProps = { indexId: index.attrId, type: 'S3', name: 's3-data-source', roleArn: s3DataSourceRole.roleArn, languageCode: 'ja', dataSourceConfiguration: { s3Configuration: { bucketName: dataSourceBucket.bucketName, inclusionPrefixes: ['docs'], accessControlListConfiguration:{ keyPath:'s3://generativeaiusecasesstack/meta/ACL.json' }
として、jsonファイルを読み込んでアクセス制限かけるというのはダメでしょうか?

ha-to11 avatar Jan 28 '25 10:01 ha-to11

This issue is stale because it has been open for 30 days with no activity.

github-actions[bot] avatar Mar 01 '25 02:03 github-actions[bot]