Site logo
Tác giả
  • avatar Nguyễn Đức Xinh
    Name
    Nguyễn Đức Xinh
    Twitter
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 credentialsregion.

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 ls
  • aws s3api list-buckets
  • aws ec2 describe-instances
  • aws 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--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 --profile trong 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_KEY và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.
  • make hoặ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 text khi viết shell script để dễ xử lý.
  • Disable pager (less) bằng --no-cli-pager, cli_pager="" hoặc AWS_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.