--- title: "Kendra ã§ S3 ドã‚ュメントã®ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã‚’è¡Œã†æ–¹æ³•" slug: kendra-s3-access-control tags: [kendra] authors: [wadabee] --- [Amazon Kendra](https://aws.amazon.com/jp/kendra/) (以é™ã€Kendra) ã¯ã€æ©Ÿæ¢°å¦ç¿’ (ML) を利用ã—ãŸã‚¤ãƒ³ãƒ†ãƒªã‚¸ã‚§ãƒ³ãƒˆæ¤œç´¢ã‚µãƒ¼ãƒ“スã§ã™ã€‚ ã“ã®è¨˜äº‹ã§ã¯ã€ãƒ¦ãƒ¼ã‚¶ã®æ¨©é™ã«ã‚ˆã£ã¦æ¤œç´¢ãƒ‰ã‚ュメントã®ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã‚’è¡Œã†æ–¹æ³•ã‚’ã”紹介ã—ã¾ã™ã€‚ **[2023/07/12]:記事ã®å†…容をアップデートã—ã¾ã—ãŸã€‚** <!-- truncate --> 本記事ã§ç´¹ä»‹ã™ã‚‹ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã®ã‚µãƒ³ãƒ—ルコードã¯ã€[simple-lex-kendra-jp](https://github.com/aws-samples/simple-lex-kendra-jp/) ã¨ã„ㆠGitHub リãƒã‚¸ãƒˆãƒªã§å…¬é–‹ã—ã¦ãŠã‚Šã¾ã™ã®ã§ã€åˆã‚ã›ã¦ã”確èªãã ã•ã„。 ## Kendra ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã«ã¤ã„㦠Kendra ã§ã¯ã€`AccessControlList` を利用ã—ã¦ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã‚’行ã†ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚`AccessControlList` 㯠`ACL` ã¨çœç•¥ã—ã¦è¡¨ç¾ã•れるã“ã¨ã‚‚ã‚りã¾ã™ã€‚ 本記事ã§ã¯ã€ Amazon S3 (以é™ã€S3) ã® Data source connection ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã«ã¤ã„ã¦è§£èª¬ã—ã¾ã™ã€‚ ## アクセスコントãƒãƒ¼ãƒ«ã®ç¨®é¡ž Amazon S3 ドã‚ュメントã®ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã¯ã€ã€Œãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ä½¿ã†æ–¹æ³•ã€ã¨ã€Œè¨å®šãƒ•ã‚¡ã‚¤ãƒ«ã‚’ä½¿ã†æ–¹æ³•ã€ã® 2 ã¤ãŒã‚りã¾ã™ã€‚ - ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã‚’ä½¿ã†æ–¹æ³• - Amazon S3 ドã‚ュメントã«ã¯ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã‚’è¨å®šã§ãã¾ã™ãŒã€ãã®ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã®ã²ã¨ã¤ã¨ã—㦠`AccessControlList` ãŒã‚りã¾ã™ã€‚ - `AccessControlList` ã«ã‚¢ã‚¯ã‚»ã‚¹æ¡ä»¶ã‚’è¨å®šã™ã‚‹ã“ã¨ã§ã€ãƒ•ァイルã”ã¨ã«ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã‚’行ã†ã“ã¨ãŒã§ãã¾ã™ã€‚ - 本題ã¨ã¯ãれã¾ã™ãŒã€FAQ ã«ã‚‚アクセスコントãƒãƒ¼ãƒ«ç”¨ã®ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ãŒç”¨æ„ã•れã¦ã„ã‚‹ãŸã‚ã€ãã¡ã‚‰ã‚’利用ã™ã‚‹ã“ã¨ã§ S3 ドã‚ュメントã¨åŒæ§˜ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ãŒå¯èƒ½ã§ã™ï¼ˆ[å‚考](https://docs.aws.amazon.com/ja_jp/kendra/latest/dg/in-creating-faq.html))。 - è¨å®šãƒ•ã‚¡ã‚¤ãƒ«ã‚’ä½¿ã†æ–¹æ³• - アクセスコントãƒãƒ¼ãƒ«è¨å®šç”¨ã® JSON ファイルを定義ã™ã‚‹ã“ã¨ã§ã€ä¸€å…ƒçš„ã«ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã‚’è¨å®šã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚ - フォルダå˜ä½ã¾ãŸã¯ã€ãƒ•ァイルå˜ä½ã§ã€ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã‚’行ã†ã“ã¨ãŒã§ãã¾ã™ã€‚ ## メタデータã«ã‚ˆã‚‹ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ« メタデータファイルを使用ã—ã¦ã€S3 ドã‚ュメントã«å¯¾ã—ã¦ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã‚’è¨å®šã§ãã¾ã™ã€‚ メタデータã¯ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ä»¥å¤–ã®ç”¨é€”ã§ã‚‚利用ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã€å„属性をè¨å®šã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šå±žæ€§ã‚’考慮ã—ãŸãƒ‰ã‚ュメント検索(絞り込ã¿ã‚„ã‚ーワード検索)を行ã†ã“ã¨ãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ 詳細ã«ã¤ã„ã¦ã¯ã€[ã“ã¡ã‚‰ã®ãƒ‰ã‚ュメント (Amazon S3 document metadata)](https://docs.aws.amazon.com/kendra/latest/dg/s3-metadata.html) ã‚’ã”確èªãã ã•ã„。 ### アクセスコントãƒãƒ¼ãƒ«ã®å®šç¾© メタデータファイル㫠`AccessControlList` ã‚’è¨å®šã™ã‚‹ã“ã¨ã§ã€ãƒ•ァイルã”ã¨ã«ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã‚’行ã†ã“ã¨ãŒã§ãã¾ã™ã€‚ `AccessControlList` ã¯ä»¥ä¸‹ã®é€šã‚Šè¨å®šã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚ ```json "AccessControlList": [ { "Name": "group name | user name", "Type": "GROUP | USER", "Access": "ALLOW | DENY" } ], ``` - Name: アクセスコントãƒãƒ¼ãƒ«å¯¾è±¡ã®ã€Œã‚°ãƒ«ãƒ¼ãƒ—å or ユーザåã€ã‚’è¨å®š - Type: グループå˜ä½ã§åˆ¶å¾¡ã™ã‚‹ã‹ã€ãƒ¦ãƒ¼ã‚¶å˜ä½ã§åˆ¶å¾¡ã™ã‚‹ã‹ã‚’è¨å®š - Access: 当該ユーザを「許å¯ã€ã™ã‚‹ã‹ã€Œæ‹’å¦ã€ã™ã‚‹ã‹ã‚’è¨å®š ### アクセスコントãƒãƒ¼ãƒ«ã®å®šç¾©å†…å®¹ã¨æŒ™å‹• `AccessControlList` ãŒæœªè¨å®šã®å ´åˆã¯ã€ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãŒã€Œã‚¢ã‚¯ã‚»ã‚¹è¨±å¯ã€ã¨ãªã‚Šã¾ã™ã€‚ `AccessControlList` ã« 1 ã¤ã§ã‚‚定義ãŒã‚ã‚‹å ´åˆã¯ã€ã€Œã‚¢ã‚¯ã‚»ã‚¹è¨±å¯ã€ã¨ã—ã¦å®šç¾©ã•れãŸãƒ¦ãƒ¼ã‚¶ã‚’除ãã€å…¨å“¡ãŒã€Œã‚¢ã‚¯ã‚»ã‚¹æ‹’å¦ã€ã¨ãªã‚Šã¾ã™ã€‚ ãã®ãŸã‚ã€**ã‚るグループ以外ã®ã™ã¹ã¦ã®ã‚°ãƒ«ãƒ¼ãƒ—を「アクセス許å¯ã€ã¨ã„ã†è¨å®šã¯ã§ãã¾ã›ã‚“。** 以下ã®ã‚ˆã†ã«ã€`AdminGroup` ã®ã¿ `ALLOW` ã‚’è¨å®šã™ã‚‹ã¨ `AdminGroup` ã«æ‰€å±žã—ã¦ã„るユーザã®ã¿ã€ãƒ‰ã‚ュメントをå‚ç…§ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ ```json "AccessControlList": [ { "Name": "AdminGroup", "Type": "GROUP", "Access": "ALLOW" } ], ``` 以下ã®ã‚ˆã†ã«ã€`AdminGroup` ã®ã¿ã« `DENY` ãŒè¨å®šã•れã¦ã„ã‚‹ãŸã‚ `AdminGroup` ã«æ‰€å±žã—ã¦ã„ãªã„ユーザーã¯ã“ã®ãƒ•ァイルをå‚ç…§ã§ããã†ã«æ€ãˆã¾ã™ãŒã€å®Ÿéš›ã¯ãã†ã§ã¯ã‚りã¾ã›ã‚“。 `ALLOW` ã®è¨å®šãŒãªã„ãŸã‚ã€ã“ã®ãƒ•ァイルã«ã¯èª°ã‚‚アクセスã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 ```json "AccessControlList": [ { "Name": "AdminGroup", "Type": "GROUP", "Access": "DENY" } ], ``` `DENY` ã®ãƒ¦ãƒ¼ã‚¹ã‚±ãƒ¼ã‚¹ã¨ã—ã¦ã¯ã€ã‚るグループãŒå†…包ã—ã¦ã„るサブグループã®ã¿ã‚¢ã‚¯ã‚»ã‚¹ã‚’æ‹’å¦ã—ãŸã‚Šã€ç‰¹å®šã®ãƒ¦ãƒ¼ã‚¶ã®ã¿ã‚¢ã‚¯ã‚»ã‚¹ã‚’æ‹’å¦ã™ã‚‹ã¨ã„ã£ãŸã‚‚ã®ãŒè€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ ```json "AccessControlList": [ { "Name": "AnyGroup", "Type": "GROUP", "Access": "ALLOW" }, // AnyGroup ãŒå†…包ã—ã¦ã„る特定ã®ã‚µãƒ–グループã®ã¿æ‹’å¦ { "Name": "AnySubGroup", "Type": "GROUP", "Access": "DENY" }, // AnyGroup ã«æ‰€å±žã—ã¦ã„る特定ã®ãƒ¦ãƒ¼ã‚¶ã®ã¿æ‹’å¦ { "Name": "AnyUser", "Type": "USER", "Access": "DENY" } ], ``` ## è¨å®šãƒ•ァイルã«ã‚ˆã‚‹ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ« アクセスコントãƒãƒ¼ãƒ«ç”¨ã®è¨å®šãƒ•ァイル (JSON å½¢å¼) を使ã£ã¦ã€ä¸€å…ƒçš„ã«ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã‚’è¨å®šã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚ S3 ã®ãƒ‡ãƒ¼ã‚¿ã‚½ãƒ¼ã‚¹ã«å¯¾ã—ã¦ã€1 ã¤ã®è¨å®šãƒ•ァイルを定義ã§ãã¾ã™ã€‚ 詳細ã«ã¤ã„ã¦ã¯ã€[ã“ã¡ã‚‰ã®ãƒ‰ã‚ュメント (Access control for Amazon S3 data sources)](https://docs.aws.amazon.com/kendra/latest/dg/s3-acl.html) ã‚’ã”確èªãã ã•ã„。 ### アクセスコントãƒãƒ¼ãƒ«ã®å®šç¾© [S3 ã®ãƒ—レフィックス](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/using-prefixes.html)を利用ã—ã¦ã€ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«å¯¾è±¡ã‚’指定ã—ã¾ã™ã€‚ ディレクトリå˜ä½ã¾ãŸã¯ã€ã‚ªãƒ–ジェクトå˜ä½ã§ã€ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã®è¨å®šã‚’行ã†ã“ã¨ãŒã§ãã¾ã™ã€‚ > ãƒ—ãƒ¬ãƒ•ã‚£ãƒƒã‚¯ã‚¹ã®æŒ‡å®šã¯ã€`s3://` ã‹ã‚‰å§‹ã¾ã‚‹ãƒ•ãƒ«ãƒ‘ã‚¹ã§æŒ‡å®šã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã®ã§ã€ã”注æ„ãã ã•ã„。 `aclEntries` ã¯ã€ã€Œãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã«ã‚ˆã‚‹ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã€ã® `AccessControlList` ã¨åŒã˜å®šç¾©ã¨ãªã‚Šã¾ã™ã€‚ ```json [ { "keyPrefix": "s3://prefix1", "aclEntries": [ { "Name": "user name", "Type": "GROUP | USER", "Access": "ALLOW | DENY" } ] } ] ``` ### アクセスコントãƒãƒ¼ãƒ«ã®å®šç¾©å†…å®¹ã¨æŒ™å‹• 「メタデータã«ã‚ˆã‚‹ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã€ã¨åŒã˜æŒ™å‹•ã«ãªã‚Šã¾ã™ã€‚ ## メタデータã¨è¨å®šãƒ•ァイルã®ä½¿ã„分ã‘ã«ã¤ã„㦠ã“ã“ã¾ã§ã€ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã¨è¨å®šãƒ•ァイルã§ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã‚’実ç¾ã§ãã‚‹ã“ã¨ã‚’紹介ã—ã¾ã—ãŸã€‚ メタデータã¨è¨å®šãƒ•ァイルã§ã¯è¨å®šæ–¹æ³•ãŒç•°ãªã‚‹ã ã‘ã§ã€å®Ÿç¾ã§ãるアクセスコントãƒãƒ¼ãƒ«ã®å†…容ã¯åŒã˜ã§ã™ã€‚ ãれã§ã¯ã€ãれãžã‚Œã®ä½¿ã„分ã‘ã«ã¤ã„ã¦ã®ä¸€ä¾‹ã‚’ã”紹介ã—ã¾ã™ã€‚ - メタデータã®ãƒ¦ãƒ¼ã‚¹ã‚±ãƒ¼ã‚¹ - メータデータファイルを自動ã§ç”Ÿæˆã§ãる仕組ã¿ãŒã‚ã‚‹å ´åˆï¼ˆå¤§é‡ã®ãƒ•ァイルã«å¯¾ã—ã¦æ‰‹å‹•ã§ãƒ•ァイル作æˆã™ã‚‹ã®ã¯ç¾å®Ÿçš„ã§ã¯ãªã„ãŸã‚) - ファイルå˜ä½ã§ãã‚ç´°ã‚„ã‹ãªã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã‚’行ã„ãŸã„å ´åˆ - アクセスコントãƒãƒ¼ãƒ«ä»¥å¤–ã®å±žæ€§ã‚‚è¨å®šã—ã¦ã€æ¤œç´¢ã«æ´»ã‹ã—ãŸã„å ´åˆ - è¨å®šãƒ•ァイルã®ãƒ¦ãƒ¼ã‚¹ã‚±ãƒ¼ã‚¹ - フォルダå˜ä½ã§ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã‚’行ã„ãŸã„å ´åˆ - 権é™ã‚’考慮ã—ãŸãƒ•ォルダ体系ã§ã‚れã°ã€ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã‚’実装ã§ãã¾ã™ - 一元的ã«ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã®ãƒ«ãƒ¼ãƒ«ã‚’管ç†ã—ãŸã„å ´åˆ ## ユーザコンテã‚ストã«ã¤ã„㦠`AccessControlList` ã§ã€ãƒ¦ãƒ¼ã‚¶ã”ã¨ãƒ»ã‚°ãƒ«ãƒ¼ãƒ—ã”ã¨ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã®å®šç¾©ã‚’行ã„ã¾ã—ãŸãŒã€Kendra ã® Query を実行ã™ã‚‹éš›ã«ã€ãƒ¦ãƒ¼ã‚¶ã®æƒ…å ±ã‚’è¨å®šã—ãªã‘れã°ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã¯å®Ÿæ–½ã•れã¾ã›ã‚“。 ãƒ¦ãƒ¼ã‚¶ã®æƒ…å ±ã‚’è¨å®šã—ã¦ã„ãªã„å ´åˆã¯ã€`AccessControlList` ã®è¨å®šæœ‰ç„¡ã«é–¢ä¿‚ãªãã€ã™ã¹ã¦ã®ãƒ‰ã‚ãƒ¥ãƒ¡ãƒ³ãƒˆãŒæ¤œç´¢ã•れるã®ã§ã€ã”注æ„ãã ã•ã„。 ãƒ¦ãƒ¼ã‚¶ã®æƒ…å ±ã‚’è¨å®šã—ã¦ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã‚’è¡Œã†æ–¹æ³•ã¯ã€å¤§ãã 2 ã¤ã‚りã¾ã™ã€‚ - ユーザコンテã‚スト - [Query](https://docs.aws.amazon.com/ja_jp/kendra/latest/dg/API_Query.html) ã® `UserContext` ã«ã€ä»¥ä¸‹ã®æ–¹æ³•ã§ãƒ¦ãƒ¼ã‚¶æƒ…å ±ã‚’è¨å®šã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚ - JWT トークン - JWT トークンã®ãƒšã‚¤ãƒãƒ¼ãƒ‰ã‚’å…ƒã«ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã‚’行ã„ã¾ã™ã€‚ - èªè¨¼åŸºç›¤ã«è¨å®šã•れã¦ã„ã‚‹æ¨©é™æƒ…å ±ã‚’ãã®ã¾ã¾åˆ©ç”¨ã—ã¦ã€ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã‚’行ã„ãŸã„å ´åˆã«ä¾¿åˆ©ã§ã™ã€‚ - ユーザ ID ã¨ã‚°ãƒ«ãƒ¼ãƒ—å - ユーザ ID ã¨ã‚°ãƒ«ãƒ¼ãƒ—åを直接 Query ã«è¨å®šã—ã¦ã€ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã‚’行ã„ã¾ã™ã€‚ - JWT トークンを利用ã§ããªã„å ´åˆã€èªè¨¼åŸºç›¤ã¨ã¯ç•°ãªã‚‹æƒ…å ±ã§ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã‚’行ã„ãŸã„å ´åˆã«ä¾¿åˆ©ã§ã™ã€‚ - DataSourceGroup - [PutPrincipalMapping](https://docs.aws.amazon.com/ja_jp/kendra/latest/APIReference/API_PutPrincipalMapping.html) ã®æ©Ÿèƒ½ã‚’使ã£ã¦ã€Kendra ç”¨ã«æ‰€å±žã‚°ãƒ«ãƒ¼ãƒ—ã®è¨å®šã‚’行ã†ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚ - çµ„ç¹”æ§‹é€ ãŒè¤‡é›‘ãªå ´åˆã‚„ã€ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã®è¦ä»¶ãŒè¤‡é›‘ãªå ´åˆã«ä¾¿åˆ©ã§ã™ã€‚ - è¨å®šãƒ•ァイルを用ã„ãŸç®¡ç†ã‚‚å¯èƒ½ã§ã™ã€‚ - ユーザ属性フィルタリング - [Query](https://docs.aws.amazon.com/ja_jp/kendra/latest/dg/API_Query.html) ã® `AttributeFilter` ã‚’è¨å®šã™ã‚‹ã“ã¨ã§ã€ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã«ã‚ˆã‚‹ãƒ•ィルタリングを行ã†ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚ - `AccessControlList` ã§ã€Œè¨±å¯ã€ã—ã¦ã„るユーザ㯠`_user_id`ã€ã€Œè¨±å¯ã€ã—ã¦ã„るグループ㯠`_group_ids` ã¨ã„ã†å±žæ€§ã§ãƒžãƒƒãƒ”ングã•れã¦ã„ã¾ã™ã€‚ - `_user_id` 㨠`_group_ids` ã‚’ãƒ•ã‚£ãƒ«ã‚¿ãƒªãƒ³ã‚°ã®æ¡ä»¶ã¨ã—ã¦åˆ©ç”¨ã™ã‚‹ã“ã¨ã§ã€ã€Œè¨±å¯ã€ã•れãŸãƒ‰ã‚ュメントã®ã¿æ¤œç´¢å¯¾è±¡ã«å«ã‚ã‚‹ã“ã¨ãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ - **æ¡ä»¶å¼ã«ã‚ˆã£ã¦ã¯ã€`AccessControlList` ãŒæœªè¨å®šã®ãƒ‰ã‚ãƒ¥ãƒ¡ãƒ³ãƒˆãŒæ¤œç´¢ã§ããªã„ã®ã§ã”注æ„ãã ã•ã„。** å‚考:[ユーザーコンテã‚ストã§ã®ãƒ•ィルタリング](https://docs.aws.amazon.com/ja_jp/kendra/latest/dg/user-context-filter.html) ## èªè¨¼ãƒ»èªå¯ã«ã¤ã„㦠å‰é …ã§èª¬æ˜Žã—ãŸé€šã‚Šã€å„種èªè¨¼ã‚µãƒ¼ãƒ“スã®ç™ºè¡Œã—㟠JWT トークンを利用ã—ã¦ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã‚’実ç¾ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚ã“ã®æ©Ÿèƒ½ã¯ã€Kendra 自体ã®ã‚¢ã‚¯ã‚»ã‚¹åˆ¶é™ã‚’行ã†ã®ã§ã¯ãªãã€ãƒ‰ã‚ãƒ¥ãƒ¡ãƒ³ãƒˆã®æ¤œç´¢å¯å¦ã‚’制御ã™ã‚‹ã ã‘ãªã®ã§ã”注æ„ãã ã•ã„。 今回㯠[Amazon Cognito](https://aws.amazon.com/jp/cognito/) (以é™ã€Cognito) を利用ã—ãŸèªè¨¼ã«ã¤ã„ã¦è§£èª¬ã‚’行ã„ã¾ã™ã€‚ [simple-lex-kendra-jp](https://github.com/aws-samples/simple-lex-kendra-jp/) リãƒã‚¸ãƒˆãƒªã® `SimpleKendraAuth` ã®ã‚¹ã‚¿ãƒƒã‚¯ã¯ã“ã“ã§ç´¹ä»‹ã™ã‚‹ Cognito を利用ã™ã‚‹æ–¹æ³•ã§å®Ÿè£…ã‚’ã—ã¦ã„ã¾ã™ã€‚ Kendra ã®ãƒˆãƒ¼ã‚¯ãƒ³ã‚’使ã£ãŸã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã«ã¤ã„ã¦ã¯ã€[ã“ã¡ã‚‰ã®ãƒ‰ã‚ュメント (Controlling access to documents in an index)](https://docs.aws.amazon.com/kendra/latest/dg/create-index-access-control.html) ã‚’ã”覧ãã ã•ã„。 ### Kendra ã® JWT トークンè¨å®šã®è¦å¦ å‰é …ã§ã‚‚説明ã—ãŸé€šã‚Šã€JWT トークンを利用ã—ã¦ã‚‚ Kendra 自体ã®ã‚¢ã‚¯ã‚»ã‚¹åˆ¶é™ã‚’行ã†ã“ã¨ã¯ã§ãã¾ã›ã‚“。ã™ã¹ã¦ã®ãƒ•ァイル㫠`AccessControlList` ã‚’è¨å®šã—ã¦ã„れã°ã€æœªèªè¨¼ãƒ¦ãƒ¼ã‚¶ãŒæ¤œç´¢ã—ã¦ã‚‚ドã‚ュメント㯠1 件もヒットã—ã¾ã›ã‚“ãŒã€Kendra ã¸ã® Query 発行ã¯ã§ãã¾ã™ã€‚ 未èªè¨¼ãƒ¦ãƒ¼ã‚¶ã® Kendra ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹è‡ªä½“を制é™ã—ãŸã„å ´åˆã¯ã€[API Gateway ã® Cognito オーソライザー](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-integrate-with-cognito.html)ç‰ã‚’利用ã—㦠Query を発行ã™ã‚‹å‰ã«ã€ã‚¢ã‚¯ã‚»ã‚¹ã‚’ブãƒãƒƒã‚¯ã™ã‚‹ä»•組ã¿ã«ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚[simple-lex-kendra-jp](https://github.com/aws-samples/simple-lex-kendra-jp/) ã®ã€ŒAmazon Kendra Auth プãƒã‚¸ã‚§ã‚¯ãƒˆã€ã«ã€ã“ã¡ã‚‰ã®å®Ÿè£…サンプルãŒã‚ã‚‹ã®ã§åˆã‚ã›ã¦ã”確èªãã ã•ã„。 #### パターン別ã®å¯¾å¿œæ–¹æ³• 構築ã™ã‚‹ã‚·ã‚¹ãƒ†ãƒ ã®è¦ä»¶ã«ã‚ˆã£ã¦ã€ã•ã¾ã–ã¾ãª Kendra ã®è¨å®šãƒ‘ターンãŒã‚りã¾ã™ã®ã§ã€ã‚ˆãã‚るパターン別ã«å¯¾å¿œæ–¹æ³•ã‚’ã”紹介ã—ã¾ã™ã€‚ **ã“ã¡ã‚‰ã¯ã€IAM ã‚„ [VPC](https://docs.aws.amazon.com/ja_jp/kendra/latest/dg/vpc-interface-endpoints.html) ã®è¨å®šãŒæ£ã—ãã§ãã¦ãŠã‚Šã€ Kendra ã¸ç›´æŽ¥ Query ãŒç™ºè¡Œã§ããªã„状態ã«ãªã£ã¦ã„ã‚‹ã“ã¨ã‚’剿ã¨ã—ã¦ã„ã¾ã™ã€‚** **注æ„:Kendra ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã§ã¯ã€ S3 ãƒã‚±ãƒƒãƒˆè‡ªä½“ã®ã‚¢ã‚¯ã‚»ã‚¹åˆ¶é™ã¯ã§ãã¾ã›ã‚“。S3 ãƒã‚±ãƒƒãƒˆã®æ¨©é™è¨å®šã¯é©åˆ‡ã«è¡Œã£ã¦ãã ã•ã„。** - èªè¨¼ãƒ¦ãƒ¼ã‚¶ã®ã¿ Kendra ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã—ãŸã„ - 共通 - API Gateway ç‰ã§æœªèªè¨¼ãƒ¦ãƒ¼ã‚¶ã‚’ブãƒãƒƒã‚¯ã—ã¦ãã ã•ã„。 - JWT ãƒˆãƒ¼ã‚¯ãƒ³ã®æƒ…å ±ã§ãƒ‰ã‚ュメントã®ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã‚’実施ã—ãŸã„ - Index ã« JWT トークンã®è¨å®šã—ã€Query 発行時㫠JWT トークンをセットã—ã¦ãã ã•ã„。 - Kendra 独自ã®ãƒ¦ãƒ¼ã‚¶ãƒ»ã‚°ãƒ«ãƒ¼ãƒ—ã®å®šç¾©ã§ãƒ‰ã‚ュメントã®ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã‚’実施ã—ãŸã„ - Index ã« JWT トークンã®è¨å®šã¯ä¸è¦ã§ã™ã€‚ - Query 発行時ã«ã€ãƒ¦ãƒ¼ã‚¶ ID・グループ ID ã¾ãŸã¯ã€DataSourceGroup をセットã—ã¦ãã ã•ã„。 - JWT トークンã®ãƒšã‚¤ãƒãƒ¼ãƒ‰ã®æƒ…å ±ã‚’å…ƒã«ã€ãƒ¦ãƒ¼ã‚¶ ID・グループ ID ã¾ãŸã¯ã€DataSourceGroup をセットã™ã‚‹æ–¹æ³•も考ãˆã‚‰ã‚Œã¾ã™ã€‚ - APIGateway + Lambda ã®æ§‹æˆã ã¨ã€èªè¨¼ã«åˆ©ç”¨ã—㟠JWT トークンã®ãƒšã‚¤ãƒãƒ¼ãƒ‰ã‚’ç°¡å˜ã«å–å¾—ã§ãã¾ã™ (`event.requestContext.authorizer` ã§ãƒšã‚¤ãƒãƒ¼ãƒ‰ãŒå–å¾—ã§ãã¾ã™ [[å‚考]](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/http-api-jwt-authorizer.html))。 - ドã‚ュメントã®ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã‚’実施ã—ãªã„ - Index ã« JWT トークンã®è¨å®šã¯ä¸è¦ã§ã™ã€‚ - ドã‚ュメント㫠`AccessControlList` ã‚’è¨å®šã—ãªã„ã§ãã ã•ã„。 - Query 発行時ã«ãƒ¦ãƒ¼ã‚¶ã‚³ãƒ³ãƒ†ã‚ストã¨ãƒ¦ãƒ¼ã‚¶å±žæ€§ãƒ•ィルタリングã®è¨å®šã‚’ã—ãªã„ã§ãã ã•ã„。 - 未èªè¨¼ãƒ¦ãƒ¼ã‚¶ã‚‚ Kendra ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã—ãŸã„ - ドã‚ュメントã®ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã‚’実施ã—ãŸã„ - 未èªè¨¼ãƒ¦ãƒ¼ã‚¶ã«å…¬é–‹ã—ãŸããªã„ドã‚ュメント**ã™ã¹ã¦**ã« `AccessControlList` ã‚’è¨å®šã—ã¦ãã ã•ã„。 - éžå…¬é–‹ãƒ‰ã‚ュメントをå‚ç…§ã§ãるユーザã¯èªè¨¼ã‚’å¿…é ˆã¨ã—ã¦ãã ã•ã„。 - 対応方法ã¯ã€Œèªè¨¼ãƒ¦ãƒ¼ã‚¶ã®ã¿ Kendra ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã—ãŸã„ã€ã¨åŒæ§˜ã§ã™ã€‚ - `AccessControlList` ãŒè¨å®šã•れã¦ã„ãªã„ドã‚ュメントã¯ã€æœªèªè¨¼ãƒ¦ãƒ¼ã‚¶ã§ã‚‚アクセスå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ - 未èªè¨¼ãƒ¦ãƒ¼ã‚¶ã®å ´åˆã¯ã€Query 発行時ã«ãƒ¦ãƒ¼ã‚¶ã‚³ãƒ³ãƒ†ã‚ストã¨ãƒ¦ãƒ¼ã‚¶å±žæ€§ãƒ•ィルタリングã®è¨å®šã‚’ã—ãªã„ã§ãã ã•ã„。 - ドã‚ュメントã®ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã‚’実施ã—ãªã„ - Index ã« JWT トークンã®è¨å®šã¯ä¸è¦ã§ã™ã€‚ - ドã‚ュメント㫠`AccessControlList` ã‚’è¨å®šã—ãªã„ã§ãã ã•ã„。 - Query 発行時ã«ãƒ¦ãƒ¼ã‚¶ã‚³ãƒ³ãƒ†ã‚ストã¨ãƒ¦ãƒ¼ã‚¶å±žæ€§ãƒ•ィルタリングã®è¨å®šã‚’ã—ãªã„ã§ãã ã•ã„。 ### Kendra ã® JWT トークンã®è¨å®šæ–¹æ³• #### Index ã®è¨å®š JWT トークンを利用ã—ãŸã‚¢ã‚¯ã‚»ã‚¹åˆ¶é™ã‚’行ã†éš›ã¯ã€Kendra ã® Index ã«å¯¾ã—ã¦è¨å®šã‚’行ã†å¿…è¦ãŒã‚りã¾ã™ã€‚ Index è¨å®šç”»é¢ã®ã€ŒConfigure user access control (ユーザアクセスコントãƒãƒ¼ãƒ«ã®è¨å®š)ã€ã®ä¸ã«ã€ŒToken configuration(トークンè¨å®šï¼‰ã€ã¨ã„ã†é …ç›®ãŒã‚りã€ãã“ã§è¨å®šã‚’行ã†ã“ã¨ãŒã§ãã¾ã™ã€‚ Coginito を利用ã™ã‚‹å ´åˆã¯ã€ã€ŒToken Typeã€ã§ã€ŒOpenIDã€ã‚’é¸æŠžã—ã¦ãã ã•ã„。 JWT ãƒˆãƒ¼ã‚¯ãƒ³ã®æ£å½“性を検証ã™ã‚‹ãŸã‚ã®ã€ŒSigning key URLã€ã‚’è¨å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ãŒã€Cognito を利用ã™ã‚‹å ´åˆã¯ä»¥ä¸‹ã‚’è¨å®šã—ã¦ãã ã•ã„。([å‚考](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-verifying-a-jwt.html)) ```text https://cognito-idp.<Region>.amazonaws.com/<userPoolId>/.well-known/jwks.json ``` #### ユーザåã¨ã‚°ãƒ«ãƒ¼ãƒ—åã«ã¤ã„㦠Kendra ã§ã¯ã€ãƒ¦ãƒ¼ã‚¶åã¨ã‚°ãƒ«ãƒ¼ãƒ—åã§ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã‚’行ã†ã“ã¨ãŒã§ãã¾ã™ãŒã€JWT トークンã®ãƒšã‚¤ãƒãƒ¼ãƒ‰ã®ä¸ã®ã©ã®é …ç›®ã§ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã‚’行ã†ã‹ã‚’è¨å®šã§ãã¾ã™ã€‚ ãŸã¨ãˆã°ã€ã€ŒUsernameã€ã« `email` ã‚’è¨å®šã™ã‚Œã°ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã§ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ãŒå¯èƒ½ã§ã™ã—ã€ãれ以外ã®ã‚«ã‚¹ã‚¿ãƒ 属性を指定ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚ 「Groupsã€ã« `cognito:groups` ã‚’è¨å®šã™ã‚‹ã“ã¨ã§ã€Cognito ユーザグループã§ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã‚’行ã†ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚ å‚考:[ユーザプール属性](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/user-pool-settings-attributes.html) å‚考:[ユーザプルã«ã‚°ãƒ«ãƒ¼ãƒ—ã‚’è¿½åŠ ã™ã‚‹](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-pools-user-groups.html) å‚考:[ID トークンã®ãƒšã‚¤ãƒãƒ¼ãƒ‰](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/amazon-cognito-user-pools-using-the-id-token.html) #### Kendra ã® Query 実行 Query ã®ã‚ªãƒ—ションã§ã‚ã‚‹ `--user-context` ã« `Token` ã¨ã„ã†é …ç›®ãŒã‚ã‚‹ã®ã§ã€ãã¡ã‚‰ã« Cognito ã‹ã‚‰ç™ºè¡Œã•れ㟠JWT トークンをè¨å®šã—ã¦ãã ã•ã„。JWT ãƒˆãƒ¼ã‚¯ãƒ³ã®æ¤œè¨¼ãŠã‚ˆã³ã€ãƒ‰ã‚ュメントã®ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ãŒå®Ÿæ–½ã•れã¾ã™ã€‚ å‚考:[AWS CLI Referense kendra qurey](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/kendra/query.html) Cognito ã«ã¯ã€ã‚¢ã‚¯ã‚»ã‚¹ãƒˆãƒ¼ã‚¯ãƒ³ã¨ ID トークン㮠2 種類㮠JWT トークンãŒã‚りã¾ã™ã€‚ Kendra ã® Query ã§ã¯ã€ã©ã¡ã‚‰ã®ãƒˆãƒ¼ã‚¯ãƒ³ã‚‚利用ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ãŒã€èªè¨¼ã•れãŸãƒ¦ãƒ¼ã‚¶ã®å±žæ€§ï¼ˆã‚¢ã‚¤ãƒ‡ãƒ³ãƒ†ã‚£ãƒ†ã‚£ï¼‰ã‚’利用ã™ã‚‹ã“ã¨ãŒä¸»ãªç›®çš„ã§ã™ã®ã§ã€ID トークンを利用ã™ã‚‹æ–¹ãŒé©åˆ‡ã§ã™ã€‚ ## ã•ã„ã”㫠以上ãŒã€Kendra ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã‚’è¡Œã†æ–¹æ³•ã§ã—ãŸã€‚ é©åˆ‡ã«ã‚¢ã‚¯ã‚»ã‚¹ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ«ã‚’行ã†ã“ã¨ã§ã€ã‚ˆã‚Šå®‰å…¨ã«ã€ã‚ˆã‚Šä¾¿åˆ©ã« Kendra を利用ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ æ°—ã«ãªã‚‹æ–¹ã¯ã€[simple-lex-kendra-jp](https://github.com/aws-samples/simple-lex-kendra-jp/) ã®ãƒªãƒã‚¸ãƒˆãƒªã§æ°—軽ã«ãŠè©¦ã—å¯èƒ½ã§ã™ã®ã§ã€ãœã²ãŠè©¦ã—ãã ã•ã„。 ãƒã‚°ã‚„è¦æœ›ãŒã”ã–ã„ã¾ã—ãŸã‚‰ã€æ°—軽㫠Issue を起票ã—ã¦ã„ãŸã ã‘れã°å¹¸ã„ã§ã™ï¼