- Tác giả

- Name
- Nguyễn Đức Xinh
- Ngày xuất bản
- Ngày xuất bản
AWS CLI là gì? Hướng dẫn sử dụng AWS Command Line Interface cho DevOps
AWS CLI là gì?
AWS Command Line Interface (AWS CLI) là công cụ dòng lệnh chính thức do Amazon cung cấp, cho phép bạn thao tác với hầu hết các dịch vụ AWS (như Amazon S3, Amazon EC2, AWS IAM, CloudWatch, RDS, v.v.) trực tiếp từ terminal.
Thay vì phải click từng bước trong AWS Management Console, bạn có thể:
- Gõ một lệnh để tạo EC2 instance.
- Viết shell script để backup S3 định kỳ.
- Gắn AWS CLI vào CI/CD pipeline.
- Dùng command để debug nhanh production.
Đối với DevOps / Infrastructure / Platform Engineer, AWS CLI gần như là tool bắt buộc phải biết, vì:
- Hỗ trợ automation mạnh mẽ (bash script, cronjob, GitHub Actions, GitLab CI, Jenkins, v.v.).
- Cho phép reproducible operations – cùng một command có thể chạy ở local, staging, production.
- Dễ dàng versioning các thao tác dưới dạng script (infrastructure scripting).
- Rất hữu ích trong incident / production debugging khi bạn cần check nhanh logs, metrics, status resource.
Trong bài viết này, chúng ta sẽ đi từ mức cơ bản đến các best practices thực tế khi dùng AWS CLI trong môi trường DevOps.
Cài đặt AWS CLI
Hiện tại, bạn nên sử dụng AWS CLI v2 (bản mới, hỗ trợ nhiều tính năng hơn, được AWS khuyến nghị).
Kiểm tra đã có AWS CLI chưa
aws --version
Nếu terminal báo command not found thì nghĩa là bạn chưa cài hoặc chưa cấu hình PATH.
Cài đặt trên macOS / Linux
Ví dụ trên Linux x86_64:
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
Sau khi cài xong:
aws --version
Bạn sẽ thấy output tương tự:
aws-cli/2.15.10 Python/3.11.6 Linux/arm64 exe/x86_64
Cài đặt trên macOS bằng Homebrew (tuỳ chọn)
Nếu bạn dùng Homebrew:
brew update
brew install awscli
Hoặc nếu đã cài rồi và muốn nâng cấp:
brew upgrade awscli
Cài đặt trên Windows
Trên Windows, bạn có thể dùng MSI installer:
- Tải từ trang chính thức: https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html
- Cài đặt như một phần mềm bình thường.
- Sau đó mở PowerShell / Command Prompt và chạy:
aws --version
Nếu version hiển thị đúng là bạn đã cài thành công.
Cấu hình AWS CLI cơ bản
Sau khi cài đặt, bước quan trọng tiếp theo là cấu hình credentials và region.
Dùng aws configure
Command cơ bản nhất:
aws configure
AWS CLI sẽ hỏi lần lượt:
AWS Access Key ID [None]: AKIA...
AWS Secret Access Key [None]: ****************
Default region name [None]: ap-southeast-1
Default output format [None]: json
Các giá trị này sẽ được lưu tại:
~/.aws/credentials
~/.aws/config
Ví dụ nội dung file config:
[default]
region = ap-southeast-1
output = json
Cấu hình nhiều profile (multi-account / multi-env)
Trong thực tế, bạn thường làm việc với nhiều account hoặc nhiều environment: dev, staging, prod, account cá nhân, account công ty, v.v. Khi đó, bạn nên dùng profile thay vì đổi credentials thủ công.
Cấu hình profile prod:
aws configure --profile prod
Cấu hình profile staging:
aws configure --profile staging
File ~/.aws/config có thể trông như sau:
[default]
region = ap-southeast-1
output = json
[profile staging]
region = ap-southeast-1
output = json
[profile prod]
region = ap-southeast-1
output = json
Khi chạy lệnh, bạn chỉ định profile:
aws s3 ls --profile staging
aws ec2 describe-instances --profile prod
Đây là best practice cho DevOps: không dùng chung credentials giữa nhiều môi trường.
Cú pháp lệnh AWS CLI và các command phổ biến
AWS CLI tuân theo một pattern rất rõ ràng:
aws <service> <operation> [parameters]
Ví dụ:
aws s3 lsaws s3api list-bucketsaws ec2 describe-instancesaws iam list-users
Ví dụ command thường dùng
Liệt kê S3 buckets
aws s3 ls
Liệt kê EC2 instances
aws ec2 describe-instances
Liệt kê IAM users
aws iam list-users
Tạo một S3 bucket (ví dụ)
aws s3api create-bucket \
--bucket my-example-bucket-123 \
--region ap-southeast-1 \
--create-bucket-configuration LocationConstraint=ap-southeast-1
Đồng bộ folder local lên S3
aws s3 sync ./backup s3://my-example-bucket-123/backup --delete
Command này rất hay dùng trong backup script / CI pipeline.
Query dữ liệu với --query và --output
Một trong những điểm mạnh nhất của AWS CLI là khả năng lọc dữ liệu JSON trực tiếp trên command line bằng --query (dựa trên ngôn ngữ JMESPath).
Ví dụ: lấy danh sách EC2 instance ID
aws ec2 describe-instances \
--query "Reservations[].Instances[].InstanceId"
Output mặc định ở dạng JSON. Nếu bạn chỉ muốn lấy text đơn giản để dùng trong script:
aws ec2 describe-instances \
--query "Reservations[].Instances[].InstanceId" \
--output text
Kết quả sẽ kiểu như:
i-0123456789abcdef0 i-0abcdef1234567890
Ví dụ: lấy tên và trạng thái EC2
aws ec2 describe-instances \
--query "Reservations[].Instances[].{Id:InstanceId,State:State.Name,Name:Tags[?Key=='Name']|[0].Value}" \
--output table
Output dạng bảng rất dễ đọc trên terminal:
--------------------------------------------
| DescribeInstances |
--------------------------------------------
| Id | Name | State |
|---------------|------------ |----------- |
| i-01234... | app-server | running |
| i-0abcd... | db-server | stopped |
Kết hợp --query + --output trong automation
Trong bash script, bạn thường muốn nhận output dạng text, từng dòng là một giá trị để loop:
INSTANCE_IDS=$(aws ec2 describe-instances \
--query "Reservations[].Instances[].InstanceId" \
--output text)
for id in $INSTANCE_IDS; do
echo "Stopping instance: $id"
aws ec2 stop-instances --instance-ids "$id"
done
Đây là pattern cực kỳ phổ biến trong infrastructure automation.
AWS CLI pager (less) – Vấn đề và cách tắt cho automation
Kể từ AWS CLI v2, mặc định nhiều lệnh sẽ pipe output qua pager (thường là less).
Ví dụ bạn chạy:
aws ec2 describe-instances
Thay vì in tất cả JSON ra màn hình, AWS CLI sẽ mở một cửa sổ less với dòng (END) phía dưới. Để thoát bạn phải gõ:
:q
Điều này khá tiện khi bạn xem thủ công vì tránh tràn màn hình, nhưng lại rất phiền trong các trường hợp:
- Chạy nhiều command liên tiếp.
- Chạy trong bash loop.
- Chạy non-interactive (CI/CD pipeline, cronjob).
- Viết automation script cần output chảy thẳng ra stdout.
Nếu không tắt pager, script của bạn có thể bị treo chờ người dùng bấm :q.
Cách 1 – Tắt pager cho từng command
Bạn có thể dùng flag:
aws ec2 describe-instances --no-cli-pager
Cách này phù hợp khi bạn chỉ muốn tắt pager tạm thời cho một vài command.
Cách 2 – Tắt pager toàn bộ trong config (khuyến nghị)
Thiết lập trong config để mọi command đều không dùng pager nữa:
aws configure set cli_pager ""
Lúc này file config sẽ chứa:
[default]
cli_pager=
Sau đó AWS CLI sẽ không dùng less nữa, output sẽ in thẳng ra terminal.
Đây là lựa chọn tốt nếu bạn thường xuyên dùng AWS CLI cho scripting.
Cách 3 – Dùng environment variable AWS_PAGER
Trong CI/CD hoặc script, thường không muốn đụng vào file config cá nhân, nên bạn có thể dùng biến môi trường:
export AWS_PAGER=""
Hoặc chỉ áp dụng cho một command:
AWS_PAGER="" aws ec2 describe-instances
Mọi output sẽ đi thẳng ra stdout, rất phù hợp để pipe hoặc parse tiếp.
Nhờ vậy script sẽ không bị block vì chờ pager, đảm bảo chạy tốt trên server hoặc trong container.
Ví dụ automation đơn giản với AWS CLI
Để thấy rõ sức mạnh của AWS CLI, dưới đây là một ví dụ script nhỏ để tắt tất cả EC2 instances trong một environment.
#!/bin/bash
set -euo pipefail
export AWS_PAGER=""
PROFILE="staging"
INSTANCE_IDS=$(aws ec2 describe-instances \
--profile "$PROFILE" \
--filters "Name=instance-state-name,Values=running" \
--query "Reservations[].Instances[].InstanceId" \
--output text)
if [ -z "$INSTANCE_IDS" ]; then
echo "No running instances found in profile $PROFILE"
exit 0
fi
echo "Stopping instances: $INSTANCE_IDS"
aws ec2 stop-instances --profile "$PROFILE" --instance-ids $INSTANCE_IDS
Trong thực tế bạn có thể:
- Gắn script này vào cron để tắt môi trường staging ngoài giờ làm.
- Gắn vào GitHub Actions / GitLab CI để scale up/down tài nguyên theo pipeline.
Best practices khi dùng AWS CLI
1. Luôn kết hợp --query + --output
Khi viết script, hãy cố gắng giảm tối đa lượng JSON cần xử lý, chỉ lấy đúng dữ liệu cần dùng.
Ví dụ:
aws ec2 describe-instances \
--query "Reservations[].Instances[].InstanceId" \
--output text
Giúp script parse dễ hơn, tránh phải dùng jq cho những trường hợp đơn giản.
2. Disable pager cho môi trường automation
Trong pipeline hoặc server, gần như luôn luôn nên set:
export AWS_PAGER=""
Điều này giúp các job chạy non-interactive, không bị kẹt ở (END).
3. Dùng profile cho multi-account / multi-env
Không dùng chung credentials cho dev, staging, prod. Thay vào đó:
- Tạo từng profile riêng:
dev,staging,prod. - Luôn chỉ định
--profiletrong script để giảm nguy cơ deploy nhầm môi trường.
Ví dụ:
aws s3 ls --profile prod
4. Không hard-code credentials trong code
- Không commit
AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEYvào Git. - Sử dụng environment variables, SSO, hoặc IAM Role (khi chạy trong EC2/ECS/Lambda).
5. Kết hợp với tools khác
Bạn có thể kết hợp AWS CLI với:
jqđể xử lý JSON phức tạp.xargsđể chạy song song nhiều command.makehoặc custom scripts để tạo command set chuẩn cho team.
So sánh AWS CLI, AWS Management Console và AWS SDK
Để chọn đúng công cụ cho từng use case, bạn có thể tham khảo bảng so sánh sau:
| Tiêu chí | AWS CLI | AWS Management Console | AWS SDK (Python/Node.js/...) |
|---|---|---|---|
| Giao diện | Dòng lệnh (terminal) | Web UI | Code (thư viện trong ứng dụng) |
| Độ tiện cho thao tác tay | Trung bình | Cao (trực quan) | Thấp (phải viết code) |
| Automation | Cao – rất phù hợp scripting / CI/CD | Thấp – khó tự động hoá | Rất cao – tích hợp sâu vào ứng dụng |
| Độ phức tạp | Trung bình | Thấp – dễ cho người mới | Cao – cần kiến thức lập trình |
| Use case chính | DevOps, Infra, CLI tools | Manual operations, monitoring nhanh | Ứng dụng backend, microservices, batch jobs |
| Độ chính xác / repeatability | Cao – lệnh có thể chạy lại giống nhau | Trung bình – thao tác tay dễ sai | Rất cao – logic nằm trong code |
Nhìn chung:
- AWS CLI: Lựa chọn số 1 cho DevOps/Infra khi cần chạy lệnh nhanh và tự động hoá.
- AWS Console: Phù hợp cho xem nhanh, demo, thao tác tay, hoặc khi cần visual.
- AWS SDK: Dùng khi cần tích hợp AWS vào ứng dụng (Python, Node.js, Java, v.v.).
Một số lỗi thường gặp khi dùng AWS CLI
1. Lỗi Unable to locate credentials
Nguyên nhân:
- Chưa chạy
aws configure. - Sai profile.
- Đang ở trong environment không có IAM Role mà lại không set credentials.
Cách xử lý:
- Kiểm tra lại
~/.aws/credentials. - Dùng đúng
--profile. - Nếu chạy trên EC2/ECS, đảm bảo instance được gắn IAM Role phù hợp.
2. Lỗi sai region – Could not connect to the endpoint URL
Ví dụ bạn gọi:
aws s3 ls --region us-east-1
trong khi bucket thực tế nằm ở ap-southeast-1. Hãy kiểm tra lại region của resource.
3. Lỗi bị throttle (TooManyRequests / ThrottlingException)
Khi bạn gọi quá nhiều request trong thời gian ngắn, AWS có thể throttle.
Giải pháp:
- Thêm retry/backoff trong script.
- Giảm tốc độ gọi API.
Kết luận
AWS Command Line Interface là công cụ không thể thiếu đối với DevOps, Infrastructure và Platform Engineer. Với AWS CLI, bạn có thể:
- Quản lý hầu hết dịch vụ AWS ngay từ terminal.
- Viết automation script mạnh mẽ phục vụ CI/CD, backup, housekeeping.
- Debug production nhanh chóng, chính xác.
Một số điểm quan trọng cần nhớ:
- Dùng
--queryđể lọc output JSON gọn nhất có thể. - Dùng
--output textkhi viết shell script để dễ xử lý. - Disable pager (
less) bằng--no-cli-pager,cli_pager=""hoặcAWS_PAGER=""khi chạy trong môi trường automation. - Sử dụng profile cho multi-account / multi-env để tránh nhầm lẫn.
Thiết lập nhỏ nhưng rất hữu ích cho mọi dự án DevOps:
export AWS_PAGER=""
Sau khi cấu hình xong, hãy bắt đầu xây dựng bộ lệnh AWS CLI chuẩn cho team (start/stop EC2, backup S3, rotate credentials, export logs, v.v.) – đây sẽ là nền tảng cực kỳ quan trọng cho hành trình làm Infra / Platform engineering của bạn.
