Sửa lỗi AWS CLI 'RequestExpired' Do Đồng Hồ Hệ Thống Bị Lệch

beginner☁️ AWS2026-05-08| AWS CLI v2 trên Linux (Ubuntu/CentOS/RHEL/Amazon Linux 2), macOS, Windows — mọi dịch vụ AWS sử dụng SigV4 signing (S3, EC2, IAM, v.v.)

Error Message

RequestExpired: Request has expired. (Service: AmazonS3; Status Code: 403, Error Code: RequestExpired)
#aws-cli#đồng-bộ-thời-gian#ntp#xác-thực#s3

Tóm tắt nhanh

Đồng hồ hệ thống của bạn đã lệch quá ngưỡng 15 phút mà AWS cho phép. AWS từ chối mọi request được ký với timestamp lệch quá mức đó. Thường chỉ cần một lệnh là xong:

# Linux (systemd)
sudo systemctl restart systemd-timesyncd
timedatectl status

# Hoặc đồng bộ ngay với chrony
sudo chronyc makestep

# Amazon Linux 2 / EC2
sudo systemctl restart chronyd

Nếu đồng hồ chỉ lệch vài phút, làm vậy là đủ.

Nguyên nhân gốc rễ

AWS dùng SigV4 (Signature Version 4) để xác thực các API request. Mỗi request đều mang theo timestamp, và AWS so sánh nó với máy chủ của họ. Nếu lệch quá ±15 phút theo bất kỳ chiều nào, bạn sẽ nhận được:

RequestExpired: Request has expired. (Service: AmazonS3; Status Code: 403, Error Code: RequestExpired)

Đây là cơ chế phòng chống replay attack — các request đã ký cũ sẽ vô dụng nếu cửa sổ thời gian được siết chặt. Credentials của bạn vẫn ổn. Chỉ là đồng hồ bị sai.

Đây là những tình huống hay gặp khiến người ta bị bất ngờ:

  • VM hoặc container bị tạm dừng (pause/suspend) rồi tiếp tục — đồng hồ đóng băng trong lúc tạm dừng
  • Máy chủ cấu hình NTP sai hoặc NTP daemon bị crash
  • Docker container kế thừa đồng hồ bị lệch từ máy host
  • Laptop ngủ nhiều giờ và NTP không kịp đồng bộ lại sau khi thức dậy
  • EC2 instance bị vô tình dừng chronyd

Chẩn đoán trước

Chạy các lệnh này trước khi làm bất cứ điều gì — để xác nhận đồng hồ thực sự là thủ phạm:

# Kiểm tra giờ hệ thống hiện tại so với giờ AWS thấy
date -u
curl -s --head https://s3.amazonaws.com | grep -i date

# Kiểm tra trạng thái đồng bộ NTP (systemd)
timedatectl status

# Kiểm tra chrony (Amazon Linux, RHEL, CentOS)
chronyc tracking

Nếu timedatectl hiển thị System clock synchronized: no hoặc NTP service: inactive, đó chính là vấn đề. Độ lệch trên ~500ms trong chronyc tracking nghĩa là đồng hồ đang tiếp tục trôi.

Kiểm tra nhanh bằng số so với nguồn đã biết:

# So sánh giờ local với máy chủ thời gian của AWS
ntpdate -q time.aws.com 2>/dev/null || ntpdate -q pool.ntp.org

Cách sửa: Đồng bộ đồng hồ

Cách 1 — systemd-timesyncd (Ubuntu/Debian)

# Bật và khởi động đồng bộ NTP
sudo timedatectl set-ntp true
sudo systemctl restart systemd-timesyncd

# Kiểm tra lại
timedatectl status
# Phải hiển thị: System clock synchronized: yes

Cách 2 — chrony (Amazon Linux 2, RHEL, CentOS)

# Buộc đồng bộ ngay lập tức (không chờ điều chỉnh dần dần)
sudo chronyc makestep

# Khởi động lại nếu daemon đang tắt
sudo systemctl enable chronyd
sudo systemctl restart chronyd

# Kiểm tra lại
chronyc tracking
# Tìm dòng: System time offset < 1ms là lý tưởng

Cách 3 — ntpdate (đồng bộ một lần nhanh chóng)

# Cài đặt nếu chưa có
sudo apt install ntpdate   # Debian/Ubuntu
sudo yum install ntpdate   # RHEL/CentOS

# Đồng bộ ngay
sudo ntpdate -u pool.ntp.org
# hoặc dùng máy chủ NTP riêng của AWS (169.254.169.123 trên EC2)
sudo ntpdate -u 169.254.169.123

Lưu ý: ntpdate chỉ là công cụ đồng bộ một lần. Nó sửa đồng hồ ngay lúc đó nhưng không duy trì đồng bộ liên tục. Nếu cần hơn là cứu cấp tạm thời, hãy dùng chrony hoặc systemd-timesyncd.

Cách 4 — macOS

# Bật đồng bộ giờ qua mạng
sudo sntp -sS time.apple.com

# Hoặc vào System Settings → General → Date & Time → "Set time automatically"

Cách 5 — Windows

# Chạy trong PowerShell với quyền Administrator
w32tm /resync /force
w32tm /query /status

Xác nhận đã sửa xong

Bây giờ hãy kiểm tra lại. Chạy lệnh đang bị lỗi, hoặc dùng các lệnh sau:

# Thử list một bucket S3 đơn giản
aws s3 ls s3://your-bucket-name

# Hoặc kiểm tra danh tính (hoạt động ngay cả khi không có quyền truy cập S3)
aws sts get-caller-identity

Nhận được phản hồi bình thường thay vì RequestExpired nghĩa là đã xong.

Trường hợp đặc biệt: Docker Container

Các container dùng chung đồng hồ với máy host — chúng không có NTP riêng. Vì vậy nếu host lệch 20 phút, mọi container trên đó đều lệch 20 phút. Hãy sửa trên host, không phải trong container:

# Trên Docker host
sudo chronyc makestep

# Kiểm tra bên trong container
docker exec your-container date -u

Đang chạy Docker trên VM (Docker Desktop trên macOS hoặc Windows)? Đồng hồ VM bị lệch khi máy host ngủ. Khởi động lại Docker Desktop thường giải quyết được — nó khởi động lại VM bên dưới và reset đồng hồ.

Riêng cho EC2: Dùng AWS Time Sync Service

Các EC2 instance có endpoint NTP riêng tại 169.254.169.123 — link-local, không cần internet, và chính xác hơn các pool NTP công cộng. Amazon Linux 2 trỏ đến nó theo mặc định. Các AMI khác thường không.

# Amazon Linux 2 — đã cấu hình sẵn, chỉ cần đảm bảo chronyd đang chạy
sudo systemctl status chronyd

# Ubuntu trên EC2 — thêm máy chủ thời gian AWS vào systemd-timesyncd
sudo nano /etc/systemd/timesyncd.conf
# Thêm hoặc chỉnh sửa:
# [Time]
# NTP=169.254.169.123

sudo systemctl restart systemd-timesyncd
timedatectl show-timesync

Phòng ngừa

  • Luôn giữ cho daemon đồng bộ thời gian chạy liên tục (chrony hoặc systemd-timesyncd) — tắt nó để "tiết kiệm tài nguyên" sẽ khiến bạn tốn thời gian debug nhiều hơn sau này
  • Trên EC2, dùng 169.254.169.123 làm nguồn NTP chính — miễn phí, độ chính xác dưới millisecond, và không cần internet
  • Trong CI/CD pipeline có container, thêm bước kiểm tra trước khi chạy bằng cách so sánh date -u với nguồn đã biết trước khi thực thi bất kỳ lệnh AWS nào
  • Đang dùng HashiCorp Vault hay hệ thống secret dựa trên token? Đồng hồ lệch cũng phá vỡ các hệ thống đó, vì cùng lý do

Khi debug các lỗi xác thực liên quan đến thời gian trên máy chủ bị hạn chế không thể cài thêm package, một cách nhanh để kiểm tra độ lệch UTC là dùng công cụ trên trình duyệt. ToolCraft có tùy chọn không cần upload, chạy hoàn toàn trên trình duyệt, rất hữu ích trong tình huống này.

Đọc thêm

  • Tài liệu AWS: Signing AWS API Requests — giải thích SigV4 và cửa sổ 15 phút
  • Amazon EC2 User Guide: Setting the time for your Linux instance
  • Tài liệu chrony: man chronyc, đặc biệt là chỉ thị makestep

Related Error Notes