Fix AWS Bedrock AccessDeniedException: User Not Authorized to Perform bedrock:InvokeModel

intermediate🧠 AI Tools2026-06-20| AWS Bedrock, Python 3.8+, boto3 1.28+, mọi hệ điều hành

Error Message

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
#aws-bedrock#boto3#iam-policy

TL;DR

IAM user hoặc role của bạn đang thiếu quyền bedrock:InvokeModel. Gắn policy sau để khắc phục ngay:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "bedrock:InvokeModel",
        "bedrock:InvokeModelWithResponseStream"
      ],
      "Resource": "arn:aws:bedrock:*::foundation-model/*"
    }
  ]
}

Nếu bạn cũng cần bật model access trong AWS console, xem phần Bước 3 bên dưới — chỉ có IAM permission thôi là chưa đủ với Bedrock.

Toàn bộ lỗi

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

Lỗi này xuất hiện khi gọi boto3 để invoke một Bedrock foundation model, thường với đoạn code như sau:

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}),
)

Nguyên nhân gốc rễ

AWS Bedrock có hai lớp kiểm soát truy cập riêng biệt, cả hai đều phải được đáp ứng:

  • IAM permission — user/role của bạn phải có bedrock:InvokeModel trong policy
  • Model access — foundation model cụ thể phải được bật cho tài khoản AWS của bạn trong Bedrock console

Lỗi này có nghĩa là ít nhất IAM permission đang bị thiếu. ARN trong thông báo lỗi (arn:aws:iam::123456789012:user/dev) cho biết chính xác principal nào bị từ chối.

Bước 1 — Xác định IAM Principal

Kiểm tra xem boto3 đang thực sự dùng credentials nào:

aws sts get-caller-identity

Kết quả:

{
    "UserId": "AIDAEXAMPLEID",
    "Account": "123456789012",
    "Arn": "arn:aws:iam::123456789012:user/dev"
}

Đây là entity bạn cần cấp quyền. Nếu là role (phổ biến trong EC2, Lambda, ECS), ARN sẽ có dạng arn:aws:sts::123456789012:assumed-role/MyRole/session.

Bước 2 — Gắn Bedrock IAM Policy

Cách A: Qua AWS Console

  • Vào IAM → Users (hoặc Roles) và chọn principal từ Bước 1
  • Click Add permissions → Attach policies directly → Create policy
  • Chuyển sang tab JSON và dán policy bên dưới
  • Đặt tên là BedrockInvokeAccess và lưu lại

Cách B: Qua AWS CLI

Tạo file policy bedrock-policy.json:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "bedrock:InvokeModel",
        "bedrock:InvokeModelWithResponseStream"
      ],
      "Resource": "arn:aws:bedrock:*::foundation-model/*"
    }
  ]
}

Sau đó tạo và gắn policy:

# Tạo policy
aws iam create-policy \
  --policy-name BedrockInvokeAccess \
  --policy-document file://bedrock-policy.json

# Gắn vào user
aws iam attach-user-policy \
  --user-name dev \
  --policy-arn arn:aws:iam::123456789012:policy/BedrockInvokeAccess

# Hoặc gắn vào role
aws iam attach-role-policy \
  --role-name MyLambdaRole \
  --policy-arn arn:aws:iam::123456789012:policy/BedrockInvokeAccess

Để giới hạn chỉ một model cụ thể thay vì tất cả (/*), dùng ARN của model:

"Resource": "arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0"

Bước 3 — Bật Model Access trong Bedrock Console

Dù đã có IAM permission đúng, bạn vẫn gặp AccessDeniedException nếu model chưa được bật cho tài khoản. Đây là cổng kiểm soát riêng của Bedrock, tách biệt hoàn toàn với IAM.

  • Mở AWS Bedrock console
  • Trong thanh sidebar bên trái, click Model access
  • Tìm model bạn cần (ví dụ: Claude 3 Sonnet) và click Manage model access
  • Tích vào ô bên cạnh model và click Save changes

Phê duyệt thường diễn ra ngay lập tức với hầu hết các model. Các model của Anthropic có thể yêu cầu đồng ý điều khoản sử dụng. Các model Llama của Meta yêu cầu điền một form ngắn.

Bước 4 — Xác minh đã sửa xong

Chạy test nhanh để xác nhận mọi thứ đã hoạt động:

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)

Nếu in ra Success: kèm theo text, bạn đã xong. Amazon Titan Text là model tốt để test vì không cần phê duyệt đặc biệt.

Bạn cũng có thể xác minh IAM permission trực tiếp bằng policy simulator:

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"

Tìm "EvalDecision": "allowed" trong kết quả trả về.

Những lỗi hay mắc phải

  • Sai region: Bedrock không khả dụng ở tất cả các region. Hãy dùng us-east-1 hoặc us-west-2 để bắt đầu. Region trong boto3 client phải khớp với nơi model access được bật.
  • Dùng bedrock client thay vì bedrock-runtime: invoke_model thuộc về bedrock-runtime client. Client bedrock dùng cho các thao tác quản lý như liệt kê model.
  • SCP chặn permissions: Trong AWS Organizations, Service Control Policies (SCPs) có thể chặn IAM permission ngay cả khi policy đã được gắn đúng. Hỏi AWS admin nếu IAM policy trông có vẻ đúng nhưng lỗi vẫn còn.
  • Credentials cũ trong environment: Nếu bạn vừa cập nhật IAM policy nhưng vẫn thấy lỗi, kiểm tra xem biến môi trường AWS_ACCESS_KEY_ID có đang ghi đè credentials mới không.

Related Error Notes