KendraにACLを設定しCognitoのユーザーグループと連携したい
機能リクエストは何か問題に関連していますか?背景を説明してください 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対象外になってしまうようです。 これを可能にしてほしいという要望になります。
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,
},
});
回答ありがとうございます。 当方にTypeScriptの技術が乏しく、また自由にソースを弄って試す環境を 作る能力が現状ないのですが、そこは色々調べてやってみます。
一方で需要が多そうな機能とも思うので、 エンハンス項目に含めていただくよう、要望としては継続して挙げさせて下さい。
この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ファイルを読み込んでアクセス制限かけるというのはダメでしょうか?
This issue is stale because it has been open for 30 days with no activity.