# Aws EC2 basic

# 1\. EC2 là gì?

**EC2 (Elastic Compute Cloud)** là dịch vụ cung cấp **máy chủ ảo có thể tùy chỉnh linh hoạt** để chạy ứng dụng trên nền tảng đám mây AWS.

> <mark>EC2 ≈ “máy chủ vật lý nhưng ở cloud”, chúng ta toàn quyền điều khiển hệ điều hành, phần mềm, mạng, và bảo mật.</mark>

# 2\. Những tính năng chính của EC2

| Tính năng | Mô tả |
| --- | --- |
| **Tùy chọn instance đa dạng** | Có thể khởi tạo các VM theo nhu cầu: CPU, RAM, disk, GPU, workload, storate, loại hệ điều hành phù hợp cho các mục đích sử dụng khác nhau, như web servers, databases |
| **Auto Scaling** | Tự động tăng/giảm số lượng máy theo tải |
| **Elastic IP** | Cung cấp IP cố định cho instance |
| **Elastic Block Store (EBS)** | Ổ đĩa lưu trữ độc lập, có thể gắn/rút linh hoạt |
| **Security Groups** | Firewall cấp máy chủ, tích hợp nhiều tính năng bảo mật như Security Groups, Network ACLs, IAM Roles, và khả năng mã hóa dữ liệu |
| **Key Pair** | Đăng nhập an toàn qua SSH |
| **Placement Groups** | Tối ưu hiệu suất trong môi trường phân tán |
| **Load Balancer** | Phân tải giữa nhiều instance |
| **Monitoring với CloudWatch** | Theo dõi hiệu suất, log và cảnh báo |
| **AMIs (Amazon Machine Images)** | Lưu mẫu cấu hình máy để khởi tạo nhanh |
| **Spot Instances** | Máy ảo giá rẻ theo cơ chế đấu giá |
| **Reserved Instances** | Giảm giá nếu cam kết sử dụng lâu dài |
| **Instance Metadata & User Data** | Truy xuất cấu hình hoặc chạy script khi khởi động |

# 3\. EC2 User data

## 3.1. EC2 User Data là gì?

**User Data** là một đoạn **script** hoặc **tập lệnh shell**, được truyền vào khi **khởi tạo một EC2 instance**, dùng để **tự động cấu hình máy chủ** trong lần boot đầu tiên.

Ví dụ:

* Cài đặt Apache/Nginx
    
* Cập nhật hệ thống
    
* Clone source code
    
* Tự động khởi chạy app
    

## 3.2. Cách hoạt động

* Khi EC2 instance khởi động lần đầu:
    
    * **EC2 Agent** sẽ tìm script User Data nếu có
        
    * Script được **chạy một lần duy nhất** (trừ khi cấu hình chạy lại)
        
    * Script sẽ **chạy dưới quyền root**
        

## 3.3. Cấu trúc User Data

**Linux (Amazon Linux / Ubuntu)**

```bash
!/bin/bash
yum update -y
yum install -y httpd
systemctl enable httpd
systemctl start httpd
echo "Hello from Boss!" > /var/www/html/index.html
```

**Ubuntu**

```bash
#!/bin/bash
apt update -y
apt install apache2 -y
systemctl enable apache2
systemctl start apache2
```

**PowerShell (Windows)**

```bash
<powershell>
Install-WindowsFeature -Name Web-Server
Add-Content -Path "C:\inetpub\wwwroot\index.html" -Value "Hello from Boss!"
</powershell>
```

## 3.4. Cách thêm User Data

**A. Dùng AWS Console**

1. Khi tạo EC2 → Mục “**Advanced details**”
    
2. Phần **User Data** → Dán script vào
    
3. Khởi tạo EC2 → Script sẽ chạy
    

**B. Dùng AWS CLI**

```plaintext
aws ec2 run-instances \
  --image-id ami-xxxxxxxx \
  --instance-type t2.micro \
  --key-name my-key \
  --user-data file://setup.sh \
  --security-groups my-sg \
  --count 1
```

## 3.5. Một số ví dụ thực tế

**Tự cài Apache + website**

```plaintext
#!/bin/bash
yum update -y
yum install -y httpd
systemctl start httpd
systemctl enable httpd
echo "<h1>Xin chào Boss! EC2 đang chạy ngon lành 😎</h1>" > /var/www/html/index.html
```

**Cài Node.js + app**

```plaintext
#!/bin/bash
curl -fsSL https://rpm.nodesource.com/setup_18.x | bash -
yum install -y nodejs git
git clone https://github.com/boss/app.git /home/ec2-user/app
cd /home/ec2-user/app
npm install
node index.js &
```

## 3.6. Những điều cần lưu ý

| Mục | Ghi chú |
| --- | --- |
| 🔁 Script chỉ chạy **1 lần duy nhất** | Trừ khi tạo AMI hoặc sửa file metadata |
| 📄 Script phải **bắt đầu bằng** `#!` | Ví dụ: `#!/bin/bash` |
| 🔍 Kiểm tra log tại | `/var/log/cloud-init-output.log` hoặc `/var/log/user-data.log` |
| 🔐 Chạy với quyền root | Không cần sudo |
| 🐌 Nếu script có lỗi → instance vẫn khởi tạo bình thường | Cần kiểm tra log để debug |

## 3.7. Trường hợp nâng cao

* User Data kết hợp CloudInit (Ubuntu, Amazon Linux 2)
    
* Gọi script từ S3:
    
    ```bash
    #!/bin/bash
    aws s3 cp s3://boss-bucket/scripts/init.sh /tmp/init.sh
    chmod +x /tmp/init.sh
    /tmp/init.sh
    ```
    
* **Khởi tạo container (ngay từ EC2):**
    
    ```bash
    #!/bin/bash
    yum update -y
    yum install docker -y
    service docker start
    docker run -d -p 80:80 nginx
    ```
    

# 4\. Phân loại Instance Types (Loại máy)

| Nhóm | Mục đích | Ví dụ |
| --- | --- | --- |
| **General Purpose** | Cân bằng CPU-RAM. Thường được sử dụng cho các yêu cầu công việc workload như web server, code repository, cân bằng giữa compute, memory, networking. | `t4g`, `t3`, `m5`, `m6g` |
| **Compute Optimized** | Tối ưu CPU. Phù hợp với các công việc <mark>tính toán chuyên sâu</mark> (<mark>compute-intensive tasks</mark>), yêu cầu hiệu năng xử lý cao. Ví dụ như batch processing, high performance web server, high performance computing (HPC), scientific modeling, mechine learning, game server. | `c6g`, `c5` |
| **Memory Optimized** | RAM lớn. <mark>Sử dụng cho công việc xử lý dữ liệu lớn trên memory</mark> (process large data set in memory), high performance relational/non-relational database, distributed cache, in-memory database, real-time processing, | `r5`, `x1`, `z1d` |
| **Storage Optimized** | Disk IO cao. <mark>Tối ưu hóa các tác vụ yêu cầu nhiều dung lượng lưu trữ, tác vụ đọc ghi trên các tệp dữ liệu lớn</mark> (storage intensive tasks, require high and sequential read and write access to large data on local storage). Ví dụ: OLTP, relational & NoSQL database, data warehouse application, distributed file system | `i3`, `d2`, `h1` |
| **Accelerated Computing** | GPU, ML. Tối ưu cho các tác vụ xử lý như traning AI, đồ họa nặng. | `p4`, `g4`, `inf1` |

# 5\. Những điều cần lưu ý khi sử dụng EC2

**Bảo mật**

* Luôn giới hạn SSH port (`22`) chỉ cho IP tin cậy
    
* Dùng **key pair** để đăng nhập (không dùng mật khẩu)
    
* Sử dụng **Security Group và Network ACL** để kiểm soát traffic
    
* Không để EBS hay snapshot ở chế độ public
    

**Chi phí**

* Dùng đúng **loại instance phù hợp**, tránh lãng phí
    
* Ưu tiên dùng **Spot Instance** cho workload ngắt quãng (giá rẻ)
    
* Dùng **Auto Scaling** để tối ưu tài nguyên
    
* Xem xét dùng **Savings Plans** hoặc **Reserved Instances** cho dịch vụ dài hạn
    

**Quản lý**

* Luôn dùng **CloudWatch** để theo dõi CPU, RAM, disk I/O
    
* Bật **Termination Protection** nếu không muốn ai đó xóa nhầm
    
* Dùng **Lifecycle Hooks** nếu dùng Auto Scaling
    

**Tính khả dụng**

* Chạy **multi-AZ deployment** để đảm bảo hệ thống không bị gián đoạn
    
* Kết hợp với **ELB (Load Balancer)** để phân tải
    

# 6\. Tạo và truy cập EC2 Instance

1. Vào AWS Console → EC2 → “Launch Instance”
    
2. Chọn Amazon Machine Image (AMI) → Ubuntu, Amazon Linux,...
    
3. Chọn loại máy (instance type): t3.micro, t2.small...
    
4. Tạo hoặc chọn Key Pair (để SSH vào máy)
    
5. Cấu hình Network (VPC, subnet, security group)
    
6. Gán EBS (tùy dung lượng)
    
7. Gắn IAM Role nếu cần
    
8. Review → Launch
    

Sau đó SSH vào instance:

```bash
ssh -i my-key.pem ec2-user@<Public-IP>
```
