Gần đây do yêu cầu công việc nên mình có tiếp xúc một số dịch vụ của Amazon. Bài viết này mục đích tổng hợp lại kinh nghiệm và hướng dẫn để sau này sử dụng lại dịch vụ của AWS cũng sẽ dễ dàng hơn.
Mục lục
Dịch vụ EC2
Amazon EC2 (Amazon Elastic Compute Cloud) là một cơ sở hạ tầng điện toán đám mây được cung cấp bởi Amazon Web Services (AWS) giúp cung cấp tài nguyên máy tính ảo hoá theo yêu cầu. Amazon EC2 cung cấp các ứng dụng máy tính ảo hoá có thể mở rộng về khả năng xử lý cùng các thành phần phần cứng ảo như bộ nhớ máy tính (ram), vi xử lý, linh hoạt trong việc lựa chọn các phân vùng lưu trữ dữ liệu ở các nền tảng khác nhau và sự an toàn trong quản lý dịch vụ bởi kiến trúc ảo hoá đám mây mạnh mẽ của AWS.
Tạo EC2 Instance
Amazon EC2 Instance là một cloud server. Với một tài khoản bạn có thể tạo và sử dụng nhiều Amazon EC2 Instance. Các Amazon EC2 Instance được chạy trên cùng một server vật lý và chia sẻ memory, CPU, ổ cứng… EC2 thường hay sử dụng để chạy các node trên blockchain.
Nhưng giá so với cấu hình thì cũng khá là đắt đỏ, nhưng bạn sẽ có nhiều lợi thế khác như bảo mật, an toàn, dễ dàng mở rộng… Để kiểm tra cấu hình và giá của EC2, bạn xem trang: https://instances.vantage.sh, Contabo VPS. Có nhiều nơi có giá thuê server rẻ như https://www.hetzner.com/sb, nhưng bù lại bạn phải chịu rủi ro bảo mật, với những server kiểu này bạn không bao giờ dám đẩy Private key hay thông tin quan trọng lên server.
Để tạo một EC2 Instance bạn vào trang EC2 Dashboard, chọn Instances và kích nút “Launch instances” làm theo hướng dẫn. Một số chú ý:
- Trong mục Key pair, mỗi region bạn phải tạo key pair mới, bạn nên chọn kiểu ED22519 để có độ bảo mật cao hơn. Private key hệ thống sẽ không lưu mà sẽ tài về máy bạn ngay lần đầu tiên tạo.
- Trong phần Network setting -> Firewall, bạn nên chọn “Select existing security group” và chọn default. Sau này trong cấu hình cho phép truy cập ta chỉ cần cập trọng trong nhóm default này là xong.
- Storage thường chọn gp2 hoặc gp3. Theo như bài viết Migrate your Amazon EBS volumes from gp2 to gp3 and save up to 20% on costs thì gp3 có nhiều lợi thế hơn.
Di chuyển / Sao chép server EC2 từ vùng này sang vùng khác
Để di chuyển hoặc sao chép server EC2 từ region này sang một region khác thì bạn làm theo hướng dẫn từ bài viết: How to Migrate EC2 Instance From One AWS Region to Another Region. Tôi đã thực hiện và đã thành công.
Theo như hướng dẫn bài viết có 4 bước khá đầy đủ, nhưng trong quá trình làm thực tế mình thấy có một số vấn đề cần chú ý, đặc biệt là với người mới:
- B1: Tạo AMI từ EC2 Instance
- Bước này khi thực hiện trên giao diện thì không thấy cảnh báo gì nhưng khi thực hiện thì thấy EC2 Instance bị restart, bạn cần chú ý vấn đề này để chuẩn bị trước. Mình dự đoán quá trình này là để hệ thống lưu lại checkpoing để thực hiện tạo AMI.
- Sau khi tạo xong thì AMI có trạng thái là pending. Ở trạng thái này bạn vẫn thực hiện được B2, nhưng sang B3 thì sẽ lỗi.
- Mình thử với server nhỏ với dung lượng SSD tầm 30G thì mất 4 phút mới xong, sau khi xong thì AMI sẽ chuyến sang trạng thái available. Với dung lượng SSD càng lớn thì thời gian càng lâu.
- B2: Copy AMI sang region mới
- Bước này thực hiện bình thường
- B3: Chạy EC2 Instance mới từ AMI đã copy ở trên
- Bước này bạn chuyển sang region mới, nơi bạn muốn triển khai EC2 Instance, sau đó vào phần quản lý AMI để bắt đầu tạo
- Bạn phải chờ AMI có status là available thì mới thực hiện được.
- Nếu status đang pending mà bạn thực hiện sẽ luôn nhận được lỗi “Launch initiation: Failed” và trong trường hợp này cũng bị hạn chế khi chọn “Instance Type”. Ban đầu mình không biết nên mặc dù status là pending vẫn thực hiện tạo lỗi rồi mất công search xem tại sao lại bị lỗi.
- B4: Tắt EC2 Instance cũ
- Bước này thì bạn thực hiện hay không là do yêu cầu thực tế của bạn
- Nếu bạn dịch chuyển server thì bạn tắt EC2 Instance cũ đi để tiết kiệm tiền
- Nếu bạn muốn tạo thêm server mới thì không cần thực hiện bước này.
Mở rộng Storage cho EC2 Instance
Việc mở rộng Storage trên EC2 Instance có thể thực hiện online mà không cần phải tắt server. Tất nhiên nếu bạn tắt server, thực hiện mở rộng rồi bật lại, thì thao tác sẽ đơn giản hơn, sau khi bật lại hệ thống tự nhận dung lượng mới.
Còn bạn muốn mở rộng Storage online mà không muốn tắt server thì bạn cần làm thêm nhiều thao tác hơn. Các bước thực hiện như sau:
* B1: Mở rộng Storage
Bạn vào dịch vụ EC2, chọn Instance , vào Storage và chọn Volume ID tương ứng, sau đó thực hiện “Modify Volume“. Bạn tăng dung lượng lên mức bạn mong muốn, tôi nâng từ 1.3T lên 1.6T
Sau khi làm xong bước này, Instance chưa cập nhật ngay đâu, bạn có thể kiểm bằng lệnh sau:
df -h
--------------------
Filesystem Size Used Avail Use% Mounted on
/dev/root 1.3T 1.1T 140G 89% /
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 1.6G 892K 1.6G 1% /run
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/xvda15 105M 6.1M 99M 6% /boot/efi
tmpfs 795M 4.0K 795M 1% /run/user/1000
* B2: Mở rộng dung lượng cho phân vùng
Bây giờ ta cần kiểm tra thông tin phân vùng bằng lệnh sau:
sudo lsblk
--------------------
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 24.4M 1 loop /snap/amazon-ssm-agent/6312
loop1 7:1 0 55.6M 1 loop /snap/core18/2745
loop2 7:2 0 63.3M 1 loop /snap/core20/1879
loop3 7:3 0 111.9M 1 loop /snap/lxd/24322
loop4 7:4 0 53.2M 1 loop /snap/snapd/19122
loop5 7:5 0 40.8M 1 loop /snap/snapd/20092
loop6 7:6 0 55.7M 1 loop /snap/core18/2790
loop7 7:7 0 63.5M 1 loop /snap/core20/2015
loop8 7:8 0 24.6M 1 loop /snap/amazon-ssm-agent/7528
xvda 202:0 0 1.6T 0 disk
├─xvda1 202:1 0 1.3T 0 part /
├─xvda14 202:14 0 4M 0 part
└─xvda15 202:15 0 106M 0 part /boot/efi
Bạn thấy xvda là SSD của bạn, trên Ubuntu nó tương đương với đường dẫn /dev/xvda. Còn xvda1 là phân vùng 1 của ổ xvda, bạn chú ý số 1 này. Như vậy chúng ta cần mở rộng dung lượng cho phân vùng 1 bằng lệnh sau:
# Cập nhật dung lượng cho phân vùng 1
sudo growpart /dev/xvda 1
# Check lại phân vùng đã cập nhật
sudo lsblk
--------------------
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 24.4M 1 loop /snap/amazon-ssm-agent/6312
loop1 7:1 0 55.6M 1 loop /snap/core18/2745
loop2 7:2 0 63.3M 1 loop /snap/core20/1879
loop3 7:3 0 111.9M 1 loop /snap/lxd/24322
loop4 7:4 0 53.2M 1 loop /snap/snapd/19122
loop5 7:5 0 40.8M 1 loop /snap/snapd/20092
loop6 7:6 0 55.7M 1 loop /snap/core18/2790
loop7 7:7 0 63.5M 1 loop /snap/core20/2015
loop8 7:8 0 24.6M 1 loop /snap/amazon-ssm-agent/7528
xvda 202:0 0 1.6T 0 disk
├─xvda1 202:1 0 1.6T 0 part /
├─xvda14 202:14 0 4M 0 part
└─xvda15 202:15 0 106M 0 part /boot/efi
# Nhưng hệ điều hành vẫn chưa cập nhật, vẫn là 1.3T
df -hT
--------------------
Filesystem Type Size Used Avail Use% Mounted on
/dev/root ext4 1.3T 570G 691G 46% /
tmpfs tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs tmpfs 1.6G 1.1M 1.6G 1% /run
tmpfs tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/xvda15 vfat 105M 6.1M 99M 6% /boot/efi
tmpfs tmpfs 795M 4.0K 795M 1% /run/user/1000
Đến lúc này phân vùng đã cập nhật dung lượng nhưng hệ điều hành vẫn chưa cập nhật dung lượng mới.
* B3: Cập nhật dung lượng quản lý bởi hệ điều hành
Do kiểu filesystem là ext4 lên bạn phải dùng thêm lệnh sau để cập nhật dung lượng:
# Cập nhật dung lượng trên Hệ điều hành
sudo resize2fs /dev/xvda1
--------------------
resize2fs 1.46.5 (30-Dec-2021)
Filesystem at /dev/xvda1 is mounted on /; on-line resizing required
old_desc_blocks = 163, new_desc_blocks = 200
The filesystem on /dev/xvda1 is now 419401979 (4k) blocks long.
# Kiểm tra lại, đã cập nhật 1.6T
df -hT
--------------------
Filesystem Type Size Used Avail Use% Mounted on
/dev/root ext4 1.6T 570G 981G 37% /
tmpfs tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs tmpfs 1.6G 1.1M 1.6G 1% /run
tmpfs tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/xvda15 vfat 105M 6.1M 99M 6% /boot/efi
tmpfs tmpfs 795M 4.0K 795M 1% /run/user/1000
Đến đây chúng ta đã hoàn thành xong thêm Storage cho EC2 Instance mà không cần tắt server. Bạn có thể tham khảo thêm bài viết: Tutorial: Increase the size of an Amazon EBS volume on an EC2 instance
Hướng dẫn giảm kích thước EBS Storage trong EC2
Trong giao diện “Modify Volume”, bạn chỉ có thể tăng dung lượng EBS trong EC2 nhưng giao diện không cho phép bạn giảm dung lượng. Nếu bạn cố tình giảm dung lượng bạn sẽ gặp lỗi: “The size of a volume can only be increased, not decreased“. Đây thực sự là điều hết sức khủng khiếp vì dung lượng vì dung lượng ảnh hưởng rất nhiều đến chi phí. Ví dụ tôi cài đặt Fullnode chạy blockchain của Base, dung lượng cần thực sự chỉ là 1.5TB, nhưng tải dữ liệu về sau đó cần giải nén như vậy cần phải có dung lượng gấp 2 lần khoảng trên 3TB, sau khi làm xong thì dư ra 1.5TB (~150$/tháng), điều này hết sức lãng phí. Vậy có cách nào để giảm dung lượng EBS xuống không?
Giải pháp 1
May mắn là tôi đã tìm được bài viết “Decrease the size of EBS volume in your EC2 instance” chỉ ra cách để giảm dung lượng EBS. Nhưng thao tác không hề đơn giản, bạn phải rất cẩn thận khi thực hiện:
- B1: Snapshot the volume
- Để an toàn và đảm bảo tính toàn vẹn dữ liệu, bạn nên tắt EC2 đang sử dụng Volume này.
- Sau đó bạn vào volume tương ứng, chọn nút Actions, sau đó chọn “Create snapshot“.
- B2: Tạo EBS mới với dung lượng nhỏ hơn
Trong giao diện quản lý Volumes (Elastic Block Store -> Volumes), chúng ta kích nút “Create volume“, chọn thông số với dung lượng nhỏ hơn, type và zone giống với EBS ở B1. - B3: Attach new volume
Chúng ta sẽ attach Volume mới vào instance - B4: Format new volume
Chúng ta thực hiện format Volume mới theo chuẩn ext4 - B5: Copy dữ liệu từ volume cũ sang volume mới
Sử dụng rsync để copy dữ liệu. - B6: Cập nhật thêm dư liệu cho new volume
Chúng ta cài đặt thêm grub, copy UUID cũ,… - B7: Loại bỏ volume cũ
Chúng ta tắt instance, loại bỏ volume cũ và thay thế bằng volume mới.
Thực sự quá trình này quá phức tạp, chỗ cốt lõi nhất nó dùng rsync để đồng bộ dữ liệu giữa 2 volume. Nếu như vây tôi đề xuất giải pháp khác đơn giản hơn.
Giải pháp 2: Sử dụng trực tiếp rsync
Với giải pháp này chúng ta sẽ tạo EC2 mới với volume mong muốn và thực hiện đồng bộ thư mục cần qua rsync. Các bước thực hiện như sau:
- B1: Tạo ra một EC2 instance mới (Server mới) giống hệt con cũ (Cùng Zone và Storage Type), cho có dung lượng của Storage nhỏ hơn.
- B2: Mở kết nối SSH từ server mới sang server cũ thông qua SSH Key:
- Trên server mới sinh ra ssh key bằng lệnh sau:
ssh-keygen
Bạn sẽ thấy 2 tệp id_rsa và id_rsa.pub được tạo trong thư mục ~/.ssh - Lấy nội dung trong tệp ~/.ssh/id_rsa.pub trên server mới, thêm thành 1 dòng mới trong tệp ~/.ssh/authorized_keys của server cũ.
- Trên server mới, bạn kiểm tra kết nối SSH đến server cũ xem okie chưa bằng lệnh:
ssh <user1>@<IP1>
Trong đó user là user1 trên server cũ và IP1 là IP của server cũ, do cùng Zone nên sử dụng IP Private cho nhanh.
- Trên server mới sinh ra ssh key bằng lệnh sau:
- B3: Thực hiện đồng bộ qua rsync
Trên server mới, chúng ta chạy các lệnh sau để đồng bộ dữ liệu qua rsync từ server cũ sang server mới:
rsync -avzu <user1>@<IP1>:/home/<user1>/<dir_1> /home/<user2>
…
rsync -avzu <user1>@<IP1>:/home/<user1>/<dir_n> /home/<user2>
Tip: Nếu dữ liệu đồng bộ lớn thì việc đồng bộ sẽ mất nhiều thời gian. Trong trường hợp này chúng ta không cần phải dừng các dịch vụ trên server cũ, mà cứ để các dịch vụ chạy bình thường rùi thực hiện đồng bộ bằng rsync lần đầu trước. Sau khi chạy xong bạn mới tắt các dịch vụ trên server cũ và thực hiện đồng bộ lại, việc này giúp đảm bảo tính toàn vẹn dữ liệu và đồng thời việc đồng bộ lại rất nhanh, giúp dịch vụ của bạn không bị gián đoạn lâu. - B4: Triển khai lại các dịch vụ trên server mới và tắt server cũ.
Dịch vụ Lightsail
Amazon Lightsail là một phần của dịch vụ điện toán đám mây AWS của Amazon, tuy nhiên, nó giống như dịch vụ lưu trữ riêng ảo tiêu chuẩn của hãng với các gói đăng ký lưu trữ khác nhau và nó tính toán số tiền cố định với chi phí cố định mỗi tháng. Nó cho phép bạn dễ dàng triển khai các máy chủ web hoặc ứng dụng web khác nhau như WordPress trên đám mây AWS, chỉ với vài cú click chuột và bạn có thể bắt đầu với Amazon Cloud.
Amazon Lightsail là cách dễ nhất cho các nhà phát triển, doanh nghiệp nhỏ, sinh viên và những người dùng khác cần một giải pháp máy chủ riêng ảo (VPS) đơn giản với mức giá rẻ để bắt đầu với AWS. Nó khá tương tự như DigitalOcean, Vultr… nhưng với mức giá khá hợp lý.
Lỗi “AWS Lightsail: Server refused our key”
Lỗi khi tạo AWS mới trên server, khi truy cập đúng key mà vẫn báo lỗi:
Server refused our key
Mở console trên trình duyệt check log thì thấy báo lỗi như dưới:
tail -f /var/log/auth.log
Sep 9 07:56:28 ip-172-26-9-213 sshd[42028]: userauth_pubkey: key type ssh-rsa not in Pubk
eyAcceptedAlgorithms [preauth]
Sep 9 07:56:28 ip-172-26-9-213 sshd[42028]: error: Received disconnect from 1.53.140.220
port 33248:14: No supported authentication methods available [preauth]
Sep 9 07:56:28 ip-172-26-9-213 sshd[42028]: Disconnected from authenticating user ubuntu
1.53.140.220 port 33248 [preauth]
Theo lỗi “userauth_pubkey: key type ssh-rsa not in PubkeyAcceptedAlgorithms [preauth]“, do server không hỗ trợ kiểu RSA. Cách sửa lỗi này như sau:
// Mở tệp /etc/ssh/sshd_config
sudo nano /etc/ssh/sshd_config
// Thêm dòng sau vào cuối file và lưu lại
PubkeyAcceptedAlgorithms +ssh-rsa
// Sau đó restart lại sshd
sudo systemctl restart sshd
Chi tiết lỗi này xem: SSH server gives “userauth_pubkey: key type ssh-rsa not in PubkeyAcceptedAlgorithms [preauth]” when connecting with Putty
Quản lý tài khoản trên AWS
Tạo thêm các tài khoản phụ (Sub account)
AWS cho phép bạn có 1 tài khoản chính và nhiều tài khoản phụ thông qua dịch vụ IAM (Identity and Access Management). Tài khoản phụ có thể tạo mới dễ dàng thông qua giao diện: https://us-east-1.console.aws.amazon.com/iamv2/home#/users
Sau khi tạo xong thì bạn gán quyền để account phụ có thể truy cập vào các dịch vụ bạn mong muốn. Thực tế quyền này khá phức tạp, đòi hỏi bạn phải có kiến thức.
1 Pingbacks