AWS Learning
Fundamentals

AWS CLI (Command Line Interface)

Cài đặt, cấu hình, các lệnh thường dùng

Tổng quan

AWS CLI là công cụ dòng lệnh để tương tác với AWS services.

┌─────────────────────────────────────────────────────────┐
│                    Cách truy cập AWS                    │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  1. AWS Console (Web UI)     - Dùng browser             │
│  2. AWS CLI (Command Line)   - Dùng terminal    ← này   │
│  3. AWS SDK (Code)           - Dùng trong app           │
│  4. AWS CloudShell           - CLI trong browser        │
│                                                         │
└─────────────────────────────────────────────────────────┘

Khi nào dùng CLI?

  • Automation, scripting
  • Nhanh hơn click trên Console
  • CI/CD pipelines
  • Quản lý nhiều resources cùng lúc

Cài đặt

Linux

# Download và cài đặt
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
 
# Kiểm tra
aws --version
# aws-cli/2.x.x Python/3.x.x Linux/x86_64

macOS

# Download và cài đặt
curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
sudo installer -pkg AWSCLIV2.pkg -target /
 
# Hoặc dùng Homebrew
brew install awscli
 
# Kiểm tra
aws --version

Windows

# Download installer từ:
# https://awscli.amazonaws.com/AWSCLIV2.msi
 
# Hoặc dùng winget
winget install Amazon.AWSCLI
 
# Kiểm tra
aws --version

Cấu hình Credentials

Cách 1: aws configure (Đơn giản nhất)

aws configure
 
# Nhập thông tin:
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

File được tạo:

~/.aws/
├── credentials     # Access keys
└── config          # Region, output format
# ~/.aws/credentials
[default]
aws_access_key_id = AKIAIOSFODNN7EXAMPLE
aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
 
# ~/.aws/config
[default]
region = ap-southeast-1
output = json

Cách 2: Nhiều Profiles

Khi làm việc với nhiều AWS accounts:

# Tạo profile mới
aws configure --profile dev
aws configure --profile prod
# ~/.aws/credentials
[default]
aws_access_key_id = AKIA...DEFAULT
 
[dev]
aws_access_key_id = AKIA...DEV
aws_secret_access_key = ...
 
[prod]
aws_access_key_id = AKIA...PROD
aws_secret_access_key = ...
# Sử dụng profile
aws s3 ls --profile dev
aws s3 ls --profile prod
 
# Hoặc set environment variable
export AWS_PROFILE=dev
aws s3 ls  # Dùng profile dev

Cách 3: Environment Variables

export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
export AWS_DEFAULT_REGION=ap-southeast-1
 
# Dùng cho CI/CD, Docker containers

Cách 4: Assume Role trong Config

# ~/.aws/config
[profile dev]
region = ap-southeast-1
 
[profile prod]
role_arn = arn:aws:iam::123456789012:role/ProductionRole
source_profile = dev
region = ap-southeast-1
 
# CLI tự động assume role khi dùng profile prod

Thứ tự ưu tiên Credentials

CLI tìm credentials theo thứ tự:

1. Command line options     --profile, --region


2. Environment variables    AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY


3. ~/.aws/credentials       [default] hoặc [profile]


4. ~/.aws/config            role_arn (assume role)


5. EC2 Instance Metadata    Role gắn vào EC2


6. ECS Task Role / Lambda Role

Cấu trúc lệnh

aws <service> <command> [subcommand] [options]

Ví dụ:
aws   s3      ls                           # List buckets
aws   s3      cp      file.txt s3://bucket # Copy file
aws   ec2     describe-instances           # List EC2 instances
aws   iam     list-users                   # List IAM users

Các lệnh thường dùng

S3

# List buckets
aws s3 ls
 
# List objects trong bucket
aws s3 ls s3://my-bucket
aws s3 ls s3://my-bucket/folder/
 
# Copy file
aws s3 cp file.txt s3://my-bucket/
aws s3 cp s3://my-bucket/file.txt ./
 
# Sync folder
aws s3 sync ./local-folder s3://my-bucket/folder/
aws s3 sync s3://my-bucket/folder/ ./local-folder
 
# Delete
aws s3 rm s3://my-bucket/file.txt
aws s3 rm s3://my-bucket/folder/ --recursive
 
# Tạo bucket
aws s3 mb s3://my-new-bucket
 
# Xóa bucket (phải rỗng)
aws s3 rb s3://my-bucket
aws s3 rb s3://my-bucket --force  # Xóa cả objects

EC2

# List instances
aws ec2 describe-instances
 
# Chỉ lấy thông tin cần thiết
aws ec2 describe-instances \
  --query 'Reservations[*].Instances[*].[InstanceId,State.Name,PublicIpAddress]' \
  --output table
 
# Start/Stop instance
aws ec2 start-instances --instance-ids i-1234567890abcdef0
aws ec2 stop-instances --instance-ids i-1234567890abcdef0
 
# Terminate instance
aws ec2 terminate-instances --instance-ids i-1234567890abcdef0

IAM

# List users
aws iam list-users
 
# List roles
aws iam list-roles
 
# Xem policy của user
aws iam list-attached-user-policies --user-name john
 
# Xem ai đang dùng credentials này
aws sts get-caller-identity

Lambda

# List functions
aws lambda list-functions
 
# Invoke function
aws lambda invoke \
  --function-name my-function \
  --payload '{"key": "value"}' \
  response.json
 
# View logs
aws logs tail /aws/lambda/my-function --follow

Output Formats

# JSON (default)
aws iam list-users --output json
 
# Table (dễ đọc)
aws iam list-users --output table
 
# Text (dễ parse với grep, awk)
aws iam list-users --output text
 
# YAML
aws iam list-users --output yaml

Query với --query (JMESPath)

Lọc output với JMESPath syntax:

# Lấy tất cả UserName
aws iam list-users --query 'Users[*].UserName'
 
# Lấy user đầu tiên
aws iam list-users --query 'Users[0]'
 
# Lấy nhiều fields
aws ec2 describe-instances \
  --query 'Reservations[*].Instances[*].[InstanceId,State.Name]'
 
# Filter với điều kiện
aws ec2 describe-instances \
  --query 'Reservations[*].Instances[?State.Name==`running`].InstanceId'

Các Tips hữu ích

1. Auto-complete

# Bash
complete -C '/usr/local/bin/aws_completer' aws
 
# Zsh - thêm vào ~/.zshrc
autoload bashcompinit && bashcompinit
complete -C '/usr/local/bin/aws_completer' aws

2. Dry-run (test trước khi chạy)

# Kiểm tra xem command có chạy được không (không thực sự chạy)
aws ec2 run-instances --dry-run --image-id ami-12345 --instance-type t2.micro

3. Wait (đợi resource sẵn sàng)

# Đợi instance running
aws ec2 wait instance-running --instance-ids i-1234567890abcdef0
 
# Đợi instance terminated
aws ec2 wait instance-terminated --instance-ids i-1234567890abcdef0

4. Pagination

# Mặc định CLI tự paginate, nhưng có thể control
aws s3api list-objects-v2 --bucket my-bucket --max-items 100
 
# Lấy tất cả (cẩn thận với buckets lớn)
aws s3api list-objects-v2 --bucket my-bucket --no-paginate

5. Debug

# Xem request/response chi tiết
aws s3 ls --debug

AWS CloudShell

CLI chạy ngay trong browser, không cần cài đặt:

┌─────────────────────────────────────────────────────────┐
│  AWS Console → Click icon CloudShell (góc trên phải)    │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  ✅ Đã cài sẵn AWS CLI                                  │
│  ✅ Đã authenticate với user đang login Console         │
│  ✅ Có 1GB storage persistent                           │
│  ✅ Miễn phí                                            │
│                                                         │
│  Hạn chế:                                               │
│  - Timeout sau 20 phút idle                             │
│  - Không có ở tất cả regions                            │
│                                                         │
└─────────────────────────────────────────────────────────┘

Local vs EC2: Không cần config trên EC2

LOCAL:                            EC2 với Role:
──────                            ─────────────
aws configure                     Không cần configure!
  ↓                                    ↓
~/.aws/credentials                CLI tự dùng Instance Role
  ↓                                    ↓
aws s3 ls                         aws s3 ls  ← Just works

Xem thêm: IAM - Local vs EC2


Best Practices

1. Dùng Profiles cho nhiều accounts

aws s3 ls --profile prod   # Rõ ràng đang dùng account nào

2. Không commit credentials

# .gitignore
.aws/
*.pem

3. Rotate Access Keys định kỳ

# Tạo key mới
aws iam create-access-key --user-name my-user
 
# Xóa key cũ
aws iam delete-access-key --user-name my-user --access-key-id AKIA...OLD

4. Dùng Role trên EC2/Lambda thay vì Access Keys

# Trên EC2 với Role, không cần config
aws s3 ls  # Tự động dùng Instance Role

5. Kiểm tra identity trước khi chạy lệnh quan trọng

aws sts get-caller-identity
# Đảm bảo đúng account trước khi delete/modify

Tài liệu tham khảo