Amazon Q Business で S3 をデータソースに設定して、ACL でアクセス制御する

記事タイトルとURLをコピーする

こんにちは、やまぐちです。

概要

今回は、Amazon Q Business で S3 をデータソースに設定して、ACL でアクセス制御してみます。

S3 バケットをデータソースとした場合に、特定のユーザには指定したプレフィックス内のデータを基に回答してほしくないといったユースケースが想定されます。
この場合に、S3 バケット内にアクセス制御について記載した Json ファイルを設置しておき、これをデータソース側で ACL 設定ファイルとして指定することでアクセス制御が可能です。
Json ファイルは以下のフォーマットで設定します。

[
    {
        "keyPrefix": "s3://BUCKETNAME/prefix1/",
        "aclEntries": [
            {
                "Name": "user1@example.com",
                "Type": "USER",
                "Access": "ALLOW"
            },
            {
                "Name": "group1",
                "Type": "GROUP",
                "Access": "DENY"
            }
        ]
    },
    {
        "keyPrefix": "s3://BUCKETNAME/prefix2/",
        "aclEntries": [
            {
                "Name": "user2@example.com",
                "Type": "USER",
                "Access": "ALLOW"
            },
            {
                "Name": "user1@example.com",
                "Type": "USER",
                "Access": "DENY"
            },
            {
                "Name": "group1",
                "Type": "GROUP",
                "Access": "DENY"
            }
        ]
    }
]

docs.aws.amazon.com

やってみる

前提

今回は、バケット直下に「weather-sample.xlsx」、piiプレフィックス配下に「sample-pii-data.xlsx」というファイルを配置して実施します。

バケット直下
pii/ 配下

それぞれのファイル内容は以下となります。

weather-sample.xlsx → 天気に関する質問で利用

date area city weather temperature_celsius
2025/8/13 Kanto Tokyo Sunny 32
2025/8/13 Kanto Yokohama Partly_cloudy 31
2025/8/13 Kansai Osaka Cloudy 30
2025/8/13 Kansai Kobe Showers 29


sample-pii-data.xlsx→ 従業員に関する質問で利用

employee_id full_name email_address phone_number department status
E1001 鈴木 一郎 i.suzuki@example.com 090-1111-2222 営業部 在籍
E1002 田中 花子 h.tanaka@example.com 090-3333-4444 人事部 在籍
E1003 高橋 次郎 j.takahashi@example.com 090-5555-6666 開発部 在籍
E1004 佐藤 裕美 y.sato@example.com 090-7777-8888 営業部 休職
E1005 伊藤 健太 k.ito@example.com 090-9999-0000 開発部 退職


今回は、Identity Center の「Amazon-Q-Pro」というグループにいるユーザはpiiプレフィックス配下のファイルからの回答はさせないようにします。

アクセス制御せずにチャットで質問する

この S3 バケットをデータソースとして設定します。
田中さんについて質問したら回答が返ってきました。
大阪の天気についても回答が返ってきました。

ACL でアクセス制御を設定する

S3 の設定

S3 バケットに以下のacl.jsonを配置します。
Identity Center のグループ「Amazon-Q-Pro」はpii/配下の内容を基にした回答がされなくなる内容になっています。

[
    {
        "keyPrefix": "s3://S3バケット名/pii/",
        "aclEntries": [
            {
                "Name": "Amazon-Q-Pro",
                "Type": "GROUP",
                "Access": "DENY"
            }
        ]
    }

]

Amazon Q Business 側の設定

次は、Amazon Q Business 側の設定を行います。
対象のデータソースを選択して「Action」-「Edit」を選択します。
「Sync scope」内にある「Access control list (ACL) configuration file location - optional」にacl.jsonを指定して更新します。
同期を開始します。
ステータスが「Completed」になれば OK です!

ACL を設定した状態で質問してみる

それではさっそく「Amazon-Q-Pro」グループにいるユーザから質問してみます。

田中さんについて質問したら意図した通り、回答が返ってきませんでした!
天気の質問は制御をかけていないので、回答が返ってきました。

まとめ

ACL を利用して S3 プレフィックスごとのアクセス制御が簡単に実装できました。
Json ファイルを更新して同期すれば、制御の要件が増えたにもクイックに対応ができそうです。

フィールド属性を利用した制御方法も挙げられますが、ACL の方が手ごろに始められる印象を受けました。
S3 をデータソースにしてアクセス制御したい場合は積極的に採用したいなと思います。

それではまたどこかで~

やまぐち まさる (記事一覧)

CS部・CS2課

AWS の構築・運用をやってます

3度の飯より野球が好き

2025 Japan AWS All Certifications Engineers