Tình huống xảy ra
Đã khuya. Một lần deploy vừa thất bại. Bạn chạy thử aws s3 ls để kiểm tra gì đó và thay vì danh sách bucket, bạn nhận được:
An error occurred (InvalidClientTokenId) when calling the GetCallerIdentity operation: The security token included in the request is invalid.
Không có gì trong code thay đổi. Pipeline vẫn chạy được hôm qua. Vậy mà bây giờ AWS không còn nhận ra bạn là ai nữa.
Lỗi này có nghĩa là AWS đã từ chối credentials của bạn trước khi kiểm tra bất kỳ chính sách quyền nào. Nó thậm chí không đi đến đó — bản thân access key đã không hợp lệ, bị xóa, hoặc chưa bao giờ khớp với một IAM user thực.
Chuyện gì đang xảy ra
InvalidClientTokenId không phải lỗi "access denied". Nó xảy ra sớm hơn thế. AWS không tìm thấy IAM entity nào khớp với Access Key ID bạn gửi lên. Các nguyên nhân phổ biến nhất:
- Access key đã bị xóa hoặc vô hiệu hóa trong IAM
- Key thuộc về một AWS account khác với account bạn đang nhắm tới
- Sai region — một số dịch vụ (đặc biệt là STS) cần chỉ định region rõ ràng
- File credentials chứa key cũ đã bị xoay vòng ở nơi khác
- Biến môi trường
AWS_ACCESS_KEY_IDđang âm thầm ghi đè profile của bạn - Key được tạo cho một IAM user đã bị xóa sau đó
- Copy-paste đã đưa các ký tự ẩn vào chuỗi key
Chẩn đoán nhanh
Trước khi làm bất cứ điều gì, hãy tìm hiểu xem CLI đang thực sự dùng credentials nào:
# Xem chính xác key ID nào đang được gửi đi
aws configure list
# Kết quả trông như sau:
# Name Value Type Location
# ---- ----- ---- --------
# profile <not set> None None
#access_key ****************ABCD shared-credentials-file
#secret_key ****************wxyz shared-credentials-file
# region us-east-1 config-file ~/.aws/config
Ghi lại 4 ký tự cuối của Access Key ID được hiển thị. Đối chiếu với IAM trong AWS Console — vào IAM → Users → user của bạn → Security credentials. Nếu key đó không được liệt kê là active, đó chính là thủ phạm.
Tiếp theo, kiểm tra xem có biến môi trường nào đang ghi đè profile của bạn không:
# Linux / macOS
echo $AWS_ACCESS_KEY_ID
echo $AWS_SECRET_ACCESS_KEY
echo $AWS_PROFILE
# Windows (PowerShell)
$env:AWS_ACCESS_KEY_ID
$env:AWS_SECRET_ACCESS_KEY
Các giá trị cũ trong những biến đó sẽ âm thầm ghi đè tất cả mọi thứ trong ~/.aws/credentials. Không có cảnh báo, không có dấu hiệu gì — chúng chỉ đơn giản được ưu tiên hơn.
Cách sửa 1 — Xóa các biến môi trường cũ
Biến môi trường là vấn đề? Hủy chúng và thử lại:
# Linux / macOS
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
unset AWS_SESSION_TOKEN
# Windows (PowerShell)
Remove-Item Env:AWS_ACCESS_KEY_ID -ErrorAction SilentlyContinue
Remove-Item Env:AWS_SECRET_ACCESS_KEY -ErrorAction SilentlyContinue
Remove-Item Env:AWS_SESSION_TOKEN -ErrorAction SilentlyContinue
Sau đó kiểm tra lại:
aws sts get-caller-identity
Cách sửa 2 — Cấu hình lại với key hợp lệ
Khi bản thân key đã cũ hoặc bị xóa, hãy tạo key mới:
- Đăng nhập AWS Console → IAM → Users → user của bạn → Security credentials
- Nếu key cũ còn trong danh sách, hãy vô hiệu hóa trước, rồi xóa đi
- Nhấn Create access key → chọn use case "CLI"
- Sao chép cả Access Key ID và Secret Access Key ngay lập tức — secret chỉ được hiển thị một lần duy nhất
Sau đó cấu hình CLI:
aws configure
# AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
# AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
# Default region name [None]: ap-southeast-1
# Default output format [None]: json
Hoặc chỉ cập nhật credentials mà không đụng đến region hay output format:
aws configure set aws_access_key_id AKIAIOSFODNN7EXAMPLE
aws configure set aws_secret_access_key wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Cách sửa 3 — Chỉnh sửa trực tiếp file Credentials
Nhanh hơn khi quản lý nhiều profile. Mở file và kiểm tra:
# Linux / macOS
cat ~/.aws/credentials
# Windows
type %USERPROFILE%\.aws\credentials
Một file hợp lệ trông như thế này:
[default]
aws_access_key_id = AKIAIOSFODNN7EXAMPLE
aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
[staging]
aws_access_key_id = AKIAI44QH8DHBEXAMPLE
aws_secret_access_key = je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY
Chú ý các ký tự ẩn xung quanh giá trị key. Điều này xảy ra sau khi sao chép từ Slack, Confluence, hoặc PDF. Long-term key luôn bắt đầu bằng AKIA; temporary STS key bắt đầu bằng ASIA. Bất kỳ thứ gì được thêm vào trước hoặc sau đó chính là lỗi.
Cách sửa 4 — STS Temporary Credentials đã hết hạn
Các key bắt đầu bằng ASIA là tạm thời — được cấp bởi aws sts assume-role hoặc SSO. Chúng hết hạn sau 1 giờ mặc định, tối đa 12 giờ nếu được cấu hình. Hãy làm mới chúng:
# Kiểm tra xem có session token nào trong credentials không
grep session_token ~/.aws/credentials
# Nếu dùng SSO, đăng nhập lại
aws sso login --profile your-profile
# Nếu dùng assume-role, assume lại
aws sts assume-role \
--role-arn arn:aws:iam::123456789012:role/YourRole \
--role-session-name session1 \
--query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]' \
--output text
Kiểm tra sau khi sửa
# Lệnh này sẽ trả về account ID, user ARN và user ID của bạn
aws sts get-caller-identity
# Kết quả mong đợi:
# {
# "UserId": "AIDIODR4TAW7CSEXAMPLE",
# "Account": "123456789012",
# "Arn": "arn:aws:iam::123456789012:user/your-username"
# }
Kết quả sạch nghĩa là bạn đã xong. Vẫn thấy InvalidClientTokenId? Key trong file credentials vẫn chưa khớp với bất kỳ IAM user active nào. Kiểm tra lại xem bạn đã lưu đúng key chưa — và xác nhận bản thân IAM user chưa bị xóa khỏi account.
Phòng tránh
Phần lớn sự cố InvalidClientTokenId đều xuất phát từ cùng một nguyên nhân: key rotation trong IAM, nhưng không ai cập nhật CI/CD, máy local, hoặc dịch vụ đã triển khai. Key và bản ghi của nó dần không còn đồng bộ.
- Dùng IAM roles thay vì long-term key ở bất cứ đâu có thể — EC2 instance profiles, Lambda execution roles, ECS task roles. Các role này tự động xoay vòng và không bao giờ hết hạn.
- Xoay vòng long-term key mỗi 90 ngày. IAM Access Analyzer có thể cảnh báo các key vượt quá ngưỡng chính sách của bạn.
- Lưu key trong secrets manager — AWS Secrets Manager, 1Password, hoặc tương tự. File plaintext không có audit trail và không có điểm cập nhật tập trung.
- Khi kiểm tra workflow credential, hãy dùng công cụ như Password Generator tại ToolCraft để tạo chuỗi ngẫu nhiên mạnh. Chạy hoàn toàn trên trình duyệt, không upload gì lên máy chủ.
- Kiểm tra các key đang active bằng:
aws iam list-access-keys --user-name your-user
Nhiều Profile bị lẫn lộn?
Đang quản lý nhiều AWS account? Hãy chỉ định rõ ràng profile nào bạn đang dùng:
# Tạm thời dùng một profile cụ thể
AWS_PROFILE=staging aws sts get-caller-identity
# Hoặc truyền qua flag
aws --profile staging s3 ls
# Đặt mặc định cho phiên shell hiện tại
export AWS_PROFILE=staging
Cách này tránh được lỗi cổ điển là chạy lệnh nhắm vào prod trong khi bạn nghĩ đang ở staging. Nó cũng phát hiện sự không khớp của key ngay lập tức — theo từng môi trường, chứ không phải sau khi đã gây ra hậu quả.

