TL;DR
IAMユーザーまたはロールに bedrock:InvokeModel 権限が不足しています。以下のポリシーをアタッチして即座に修正してください:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream"
],
"Resource": "arn:aws:bedrock:*::foundation-model/*"
}
]
}
AWSコンソールでモデルアクセスの有効化も必要な場合は、以下のステップ3を参照してください — Bedrockでは、IAM権限だけでは不十分です。
エラーの全文
botocore.exceptions.ClientError: An error occurred (AccessDeniedException) when calling the InvokeModel operation: User: arn:aws:iam::123456789012:user/dev is not authorized to perform: bedrock:InvokeModel
このエラーは、boto3 を使ってBedrockのファウンデーションモデルを呼び出す際に発生します。典型的なコードは以下の通りです:
import boto3
import json
client = boto3.client("bedrock-runtime", region_name="us-east-1")
response = client.invoke_model(
modelId="anthropic.claude-3-sonnet-20240229-v1:0",
body=json.dumps({"prompt": "Hello", "max_tokens": 100}),
)
根本原因
AWS Bedrockには、両方を満たす必要がある2つの独立したアクセス制御があります:
- IAM権限 — ユーザー/ロールのポリシーに
bedrock:InvokeModelが含まれている必要があります - モデルアクセス — Bedrockコンソールで、対象のファウンデーションモデルをAWSアカウント向けに有効化する必要があります
このエラーは、少なくともIAM権限が不足していることを意味します。エラーメッセージ内のARN(arn:aws:iam::123456789012:user/dev)が、アクセスを拒否されているプリンシパルを正確に示しています。
ステップ1 — IAMプリンシパルを特定する
boto3が実際に使用しているクレデンシャルを確認します:
aws sts get-caller-identity
出力例:
{
"UserId": "AIDAEXAMPLEID",
"Account": "123456789012",
"Arn": "arn:aws:iam::123456789012:user/dev"
}
これが権限を付与すべきエンティティです。ロールの場合(EC2、Lambda、ECSで一般的)、ARNは arn:aws:sts::123456789012:assumed-role/MyRole/session のような形式になります。
ステップ2 — Bedrock IAMポリシーをアタッチする
オプションA:AWSコンソール経由
- IAM → ユーザー(またはロール)に移動し、ステップ1で確認したプリンシパルを選択します
- 権限を追加 → ポリシーを直接アタッチ → ポリシーを作成 をクリックします
- JSON タブに切り替えて、以下のポリシーを貼り付けます
BedrockInvokeAccessという名前を付けて保存します
オプションB:AWS CLI経由
ポリシーファイル bedrock-policy.json を作成します:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream"
],
"Resource": "arn:aws:bedrock:*::foundation-model/*"
}
]
}
次に、ポリシーを作成してアタッチします:
# ポリシーを作成する
aws iam create-policy \
--policy-name BedrockInvokeAccess \
--policy-document file://bedrock-policy.json
# ユーザーにアタッチする
aws iam attach-user-policy \
--user-name dev \
--policy-arn arn:aws:iam::123456789012:policy/BedrockInvokeAccess
# またはロールにアタッチする
aws iam attach-role-policy \
--role-name MyLambdaRole \
--policy-arn arn:aws:iam::123456789012:policy/BedrockInvokeAccess
すべてのモデル(/*)ではなく特定のモデルに制限する場合は、モデルARNを使用します:
"Resource": "arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0"
ステップ3 — Bedrockコンソールでモデルアクセスを有効化する
IAM権限が正しく設定されていても、アカウントでモデルが有効化されていない場合は AccessDeniedException が発生します。これはIAMとは別の、Bedrock固有のアクセスゲートです。
- AWS Bedrockコンソールを開きます
- 左サイドバーで モデルアクセス をクリックします
- 対象モデル(例:Claude 3 Sonnet)を見つけ、モデルアクセスを管理 をクリックします
- モデルの横のチェックボックスをオンにして、変更を保存 をクリックします
ほとんどのモデルは即時承認されます。Anthropicのモデルは利用規約への同意が必要な場合があります。MetaのLlamaモデルは簡単なフォームの送信が必要です。
ステップ4 — 修正を確認する
すべて正常に動作しているか、簡単なテストを実行して確認します:
import boto3
import json
client = boto3.client("bedrock-runtime", region_name="us-east-1")
try:
response = client.invoke_model(
modelId="amazon.titan-text-express-v1",
contentType="application/json",
accept="application/json",
body=json.dumps({
"inputText": "Say hello",
"textGenerationConfig": {"maxTokenCount": 20}
}),
)
body = json.loads(response["body"].read())
print("Success:", body["results"][0]["outputText"])
except Exception as e:
print("Error:", e)
Success: とテキストが出力されれば完了です。Amazon Titan Textは特別な承認が不要なため、テスト用モデルとして最適です。
ポリシーシミュレーターを使ってIAM権限を直接確認することもできます:
aws iam simulate-principal-policy \
--policy-source-arn arn:aws:iam::123456789012:user/dev \
--action-names bedrock:InvokeModel \
--resource-arns "arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0"
出力に "EvalDecision": "allowed" が含まれているか確認してください。
よくある間違い
- リージョンの間違い:Bedrockはすべてのリージョンで利用できるわけではありません。まず
us-east-1またはus-west-2を使用してください。boto3クライアントのリージョンは、モデルアクセスが有効化されているリージョンと一致する必要があります。 bedrock-runtimeの代わりにbedrockクライアントを使用している:invoke_modelはbedrock-runtimeクライアントに属しています。bedrockクライアントはモデルの一覧取得などの管理操作用です。- SCPが権限をブロックしている:AWS Organizationsでは、サービスコントロールポリシー(SCP)がポリシーを正しくアタッチしていてもIAM権限をブロックすることがあります。IAMポリシーが正しく見えるのにエラーが続く場合は、AWS管理者に確認してください。
- 環境内の古いクレデンシャル:IAMポリシーを更新した後もエラーが続く場合、
AWS_ACCESS_KEY_ID環境変数が更新されたクレデンシャルを上書きしていないか確認してください。

