Lỗi thường gặpPipeline CI/CD của bạn đang chạy mượt mà thì đột nhiên dừng lại. Mọi thứ tạm dừng và log hiển thị một thông báo gây khó chịu:
An error occurred (ExpiredTokenException) when calling the ListBuckets operation: The security token included in the request is expired
Điều này thường xảy ra ngay giữa lúc đang thực hiện Terraform apply lâu hoặc tải tệp lớn lên S3. Nó có nghĩa là các khóa (key) tạm thời mà bạn tạo đã hết hạn sử dụng.
Tại sao điều này xảy raKhi bạn gọi sts assume-role, AWS sẽ cấp cho bạn một bộ thông tin xác thực tạm thời. Chúng không vĩnh viễn như secret key của IAM User. Chúng bao gồm Access Key ID, Secret Access Key và Session Token - thứ cuối cùng sẽ hết hạn.
Theo mặc định, các token này hết hạn sau đúng 1 giờ (3600 giây). Nếu script triển khai của bạn mất 61 phút, 10% công việc cuối cùng sẽ thất bại. Thời gian chờ này cũng xảy ra nếu bạn đang lưu cache các biến môi trường từ một bước build cũ thay vì tạo mới cho job hiện tại.
Các bước khắc phục### 1. Kéo dài thời gian phiên làm việc (Session Duration)Bạn có thể yêu cầu thời gian tồn tại lâu hơn khi assume role. AWS cho phép các phiên kéo dài lên đến 12 giờ (43.200 giây). Tuy nhiên, bạn phải cập nhật ở hai nơi để thay đổi này có hiệu lực.
Cập nhật lệnh AWS CLI của bạn:
# Yêu cầu phiên làm việc 4 giờ (14400 giây)
CREDENTIALS=$(aws sts assume-role \
--role-arn arn:aws:iam::123456789012:role/MyCiCdRole \
--role-session-name "CiCdSession" \
--duration-seconds 14400)
Cập nhật IAM Role: Ngay cả khi bạn yêu cầu 12 giờ, AWS sẽ giới hạn bạn ở mức 1 giờ trừ khi chính role đó cho phép nhiều hơn. Hãy truy cập IAM > Roles > [Tên Role của bạn]. Trong tab Settings, tìm "Maximum CLI/API session duration." Nhấn Edit và đặt thành 4 giờ hoặc hơn.
2. Sử dụng Refreshable Credentials trong Python (Boto3)Các session Boto3 tiêu chuẩn không tự động gia hạn token tạm thời. Nếu bạn có một script Python xử lý hàng nghìn hình ảnh trong vài giờ, nó sẽ bị lỗi ngay khi token ban đầu hết hạn. Bạn có thể giải quyết vấn đề này bằng cách sử dụng RefreshableCredentials của botocore.
import boto3
from botocore.credentials import RefreshableCredentials
from botocore.session import get_session
def get_refreshable_session():
sts_client = boto3.client('sts')
def refresh():
# Hàm này tự động chạy trước khi token hết hạn
params = {
"RoleArn": "arn:aws:iam::123456789012:role/MyRole",
"RoleSessionName": "refreshable-session",
"DurationSeconds": 3600
}
res = sts_client.assume_role(**params)
creds = res['Credentials']
return {
"access_key": creds['AccessKeyId'],
"secret_key": creds['SecretAccessKey'],
"token": creds['SessionToken'],
"expiry_time": creds['Expiration'].isoformat()
}
# advisory_refresh_timeout: làm mới 10 phút trước khi thực sự hết hạn
session_creds = RefreshableCredentials.create_from_metadata_generator(
metadata_generator=refresh,
refresh_timeout=300,
advisory_refresh_timeout=600
)
bc_session = get_session()
bc_session._credentials = session_creds
return boto3.Session(botocore_session=bc_session)
3. Hiện đại hóa GitHub Actions WorkflowHãy ngừng việc phân tách JSON thủ công từ CLI để export AWS_SESSION_TOKEN. Cách này rất dễ lỗi và khó bảo trì. Thay vào đó, hãy sử dụng OpenID Connect (OIDC) với action chính thức của AWS. Phương pháp này xử lý việc trao đổi token một cách an toàn và cho phép bạn thiết lập thời gian hiệu lực dễ dàng.
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::123456789012:role/MyRole
aws-region: us-east-1
role-duration-seconds: 7200 # Thời gian 2 giờ
Cách kiểm tra phiên làm việc của bạnĐể xem thông tin xác thực của bạn có đang hoạt động hay không, hãy chạy aws sts get-caller-identity. Tuy nhiên, lệnh này sẽ không hiển thị thời gian hết hạn. Để kiểm tra khi nào phiên của bạn thực sự kết thúc, hãy xem trường Expiration trong phản hồi JSON khi bạn chạy assume-role lần đầu, hoặc kiểm tra cấu hình hiện tại của bạn:
aws configure list
Mẹo nhỏ để Pipeline ổn định
- Lưu ý giới hạn của Role: Nếu bạn yêu cầu
--duration-seconds 36000nhưng IAM Role được thiết lập là 3600, lệnh sẽ thất bại ngay lập tức với một thông báo lỗi. - Loại bỏ IAM User Keys: Sử dụng OIDC cho GitHub hoặc GitLab. Nó loại bỏ nhu cầu về các secret dài hạn và quản lý thời gian phiên làm việc linh hoạt hơn.
- Tối ưu hóa, đừng chỉ kéo dài: Nếu một công việc mất 3 giờ, hãy kiểm tra các điểm nghẽn. Đôi khi tối ưu hóa code 10 phút sẽ tốt hơn là dùng một token có hiệu lực 10 giờ.
- Đảm bảo bảo mật: Khi cấu hình trust policy cho các role này, hãy sử dụng Password Generator để tạo một External ID duy nhất nhằm tăng cường bảo mật chống lại các cuộc tấn công "confused deputy".

