BedrockのナレッジベースをS3データソースで作成した際に同期に失敗しました。ある思い込みのために解決に時間がかかってしまいました。その時の対処方法を教訓とともに解説します。
発生したエラー
データソースに指定したS3にファイルを追加してデータソースの同期を行った際に以下のエラーが発生しました。
Encountered error:
Access Denied (Service: S3, Status Code: 403, Request ID: hoge, Extended Request ID: foobar).
Issue occurred while processing file: s3://my-bucket/user01/test.txt.
Call to Customer Source did not succeed.
原因
Access Denied
とある通り権限が不足しています。
しかし、データソースを作成した際に格納されていたファイルについて正しくナレッジベースが構築できていました。ロールには問題ないだろうと思い込んでいたために解決に時間がかかりました。
IAMロールを確認したところナレッジベース構築時に
というロールが作成されていました。このロールのポリシーのバージョンを確認したところ3つバージョンが作成されていました。エラーが発生した時点のポリシーを確認したところ、以下のようになっていました。
AmazonBedrockS3PolicyForKnowledgeBase_AmazonBedrockExecutionRoleForKnowledgeBase
{
"Sid": "S3GetObjectStatement",
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::my-bucket/user01",
"arn:aws:s3:::my-bucket"
],
}
Resouceに /*
がついていないため、プレフィックス配下のファイルを読み取ることができませんでした。
対応方法
以下のようにポリシーを修正することで対応できました。
{
"Sid": "S3GetObjectStatement",
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::my-bucket/user01/*"
],
}
教訓
新しくサービスを動かす際にAWSでロールを作成してくれることがあります。このロールが変更されることがあるというのが今回の教訓です。あと、 Access Denied
が出たら権限に問題があるはずなので疑うべきはロールです。
AWSが作成するロールも変更されることがある
Access Deniedが出たらIAMロールを確認する
まとめ
Bedrockナレッジベースのデータソース同期に失敗した際の対応について解説しました。サービスを動かす際にAWSが作成するロールについてAWSが変更することを今回初めて知りました。皆さんもAWSが作るロールだから問題無いと思い込まずに権限系のエラーが発生したらIAMロールを確認するようにしましょう。
コメント