![]()
×
|
AWS cho phép bạn sử dụng miễn phí 01 năm với các dịch vụ free tier.
Các dịch vụ được tính phí linh hoạt theo nhu cầu sử dụng.
Khởi đầu từ nhu cầu thực được đặt ra, chúng ta sẽ tìm hiểu vài dịch vụ cơ bản của AWS từ lúc vừa đăng ký cho đến khi có 1 Website PHP/MySQL chạy thực với domain của mình.
Đầu tiên, ứng dụng của mình sẽ được phân tầng và ánh xạ vào AWS như sau:
Tương ứng với “management console”:
Vì đây là nhu cầu tối thiểu và cơ bản, chúng ta sẽ đi vào bài toán cụ thể và chưa có các thiết kế nâng cao (TD: load balancer).
Bài toán: cần thiết lập 1 website CMS đơn giản (từ đầu) hoặc di dời 1 website CMS đang hoạt động từ 1 hosting bình thường đến AWS sao cho môi trường được thiết lập chỉ dành riêng cho website này với cơ sở dữ liệu được vận hàng đáng tin cậy hơn. Dĩ nhiên, chúng ta cũng tận dụng được hầu hết các chức năng của AWS như theo dõi (monitoring) hệ thống…
Thành phần website đang có:
- Sử dụng WordPress và các plug-in, theme đi kèm.
- CSDL quan hệ: MySQL (schema & dữ liệu đã có vài năm).
- Website đang hoạt động nên đã có địa chỉ xác định; giả sử http://www.codingsoup.com. Đương nhiên chúng ta đã có CPanel để quản lý tên miền vừa nêu.
Đương nhiên, chúng ta cần download toàn bộ site hiện tại (bao gồm các hình ảnh, …. đi kèm) và sao lưu toàn bộ dữ liệu MySQL để chuẩn bị triển khai trên host mới AWS.
Bắt đầu với AWS
Sơ lược vài ngữ cảnh phổ biến tương ứng dịch vụ cung cấp bởi AWS:
- Lưu trữ thông tin cá nhân trên Cloud. Amazon cung cấp dịch vụ gọi là Amazon S3 (Amazon Simple Storage Service) để lưu trữ nội dung người dùng (hình ảnh, tập tin bất kỳ và cho phép quản lý truy cập). Họ còn cho phép sử dụng S3 để triển khai các trang web tĩnh (static web).
- Triển khai các ứng dụng web trên các ngôn ngữ/nền tảng như Java, PHP, Python, RubyRuby, .NET nhanh chóng và không cần bận tâm về hạ tầng AWS. Chúng ta có thể tham khảo tư liệu “AWS Elastic Beanstalk Developer guide”. Hoặc nếu resources dành cho ứng dụng đã được xác định rõ, ta có dùng AWS CloudInformationCloudInformation để xác định cụ thể tuỳ thuộc nhu cầu.
- Triển khai 1 server trong AWS Cloud: Sử dụng giao tiếp web service cung cấp bởi AWS để triển khai các instance (host) với hệ điều hành mong muốn. Dĩ nhiên, với cách này, chúng ta hoàn toàn quyết định môi trường trong instance của server được tạo, cấu hình và phần mềm. AWS cung cấp dịch vụ AWS Elastic Compute Cloud (Amazon EC2) để làm việc đó.
- Quản lý các tập dữ liệu lớn: đây cũng là đề tài thú vị để nghiên cứu khi hệ thống chúng ta triển khai có dữ liệu lớn. AWS hỗ trợ các dịch vụ cloud để quản lý các CSDL quan hệ truyền thống.
- Gửi mail cho khách hàng (marketing): AWS cung cấp dịch vụ Amazon SES (Simple Email Service) để thực hiện việc gửi mail số lượng lớn một cách hiệu quả với các công cụ phân tích đi kèm, thậm chí ta có thể biết được các thống kê thời gian thực (real-time stats), và các thông báo nếu thông tin không thể chuyển thành công.
Vài tình huống có thể thấy rõ làm thế nào sử dụng dịch vụ AWS cho ngữ cảnh cụ thể của mình. Khi có thời gian, chúng ta sẽ phân tích thêm.
Nếu chưa có tài khoản AWS, chúng ta cần tại http://aws.amazon.comcom (bấm lên nút “Sign Up Now” và làm theo các hướng dẫn).
Lưu ý: AWS cung cấp dịch vụ miễn phí 1 năm đầu kèm 1 số hạn mức và ràng buộc (AWS FREE Usage Tier). Nghĩa là chúng ta có thể “thử” sử dụng rồi quyết định thật sự sau đó. Dĩ nhiên cái hay của Cloud nói chung và AWS nói riêng là chúng ta có thể nâng cấp (và trả phí tương ứng) các tài nguyên một cách dễ dàng (TD: nâng từ 512MB RAM lên 2 GB). Cần chú ý rõ các hướng dẫn khi sử dụng dịch vụ miễn phí này để đảm bảo không có chi phí phát sinh; hoặc nếu có thì đó là do mình quyết định.
Có nhiều cách để truy cập AWS như AWS MarketPlace, AWS Command Line interface, AWS SDKs (Java, .NET, PHP, Android, iOS, Ruby), toolkits cho developer, AWS Web service APIs và AWS Management Console). Ở đây chúng ta sử dụng AWS Management Console, là công cụ giao diện web rất dễ sử dụng và quản trị.
Chúng ta cũng cần quan tâm đến các việc sau:
- Cài đặt máy tính để chạy ứng dụng.
- Bảo mật ứng dụng và tài nguyên.
- Cài đặt các thiết lập mạng để cho phép người dùng truy cập.
- Độ lớn và khả năng mở rộng (Scale) của ứng dụng.
- Theo dõi và kiểm soát ứng dụng và tài nguyên hệ thống.
- Đảm bảo khả năng chịu lỗi của ứng dụng (Fault tolerant) (khi sụp hệ thống hoặc quá tải…)
Sau khi đã login vào tài khoản đăng ký. Chúng ta bắt đầu từ màn hình quản lý ở trên (management console https://console.aws.amazon.com) để triển khai giải pháp cho bài toán đặt ra ở trên.
Bắt tay vào làm việc thôi!
- Bước 1: Tạo instance server LINUX với dịch vụ AWS EC2.
Trong màn hình Management Console ở trên, chọn dịch vụ EC2, trình duyệt sẽ chuyển sang màn hình chính (Dash Board) của EC2. EC2 DashBoard sẽ như sau (ngoại trừ khi mới đăng ký dịch vụ, tất cả các Resources sẽ là 0 – chưa có gì hết):
Bấm vào nút “Lauch Instance” để tạo EC2 instance mới (host mới của chúng ta).
Sẽ có 7 bước để có được 1 server với cấu hình và hệ điều hành mong muốn; dưới đây chỉ chụp lại vài màn hình đơn giản:
- Chọn AMI (Amazon Machine Image): AMS cung cấp sẵn nhiều file ảnh của hệ điều hành. Trong bài này, chúng ta sẽ chọn RedHat Enterprise Linux 64 bit như trong hình:
Lưu ý: dĩ nhiên chúng ta cần trang bị các kiến thức cơ bản và 1 số kiến thức quản trị Linux để tiếp tục các bước phía dưới. Đoạn sau, thật ra là phần quản trị hệ thống trong Linux và các thành phần có liên quan đến AWS.
- Chọn Instance Type, quyết định cấu hình của EC2 instance được tạo ra, dĩ nhiên nó sẽ đụng đến túi tiền của chúng ta đó nhe! Vì đây là 1 website có lượng truy cập và dữ liệu tương đối, cấu hình dưới đây khá ổn và cũng tốn 1 mớ phí hàng tháng:
Vâng, chúng ta chọn m1.large với CPU 2 nhân và 7.5G Ram. Dễ thấy rằng nó sẽ tốn 1 mức phí cao hơn hẳn so với t1.micro với chỉ ~512MB.
- Các bước sau hầu như không thay đổi nhiều so với mặc định, chúng ta làm theo hướng dẫn mà thôi. Có vài lưu ý:
- Cần xác định số instance (số host muốn tạo), chỉ cần 1 instance trong trường hợp này là đủ.
- Public IP: mặc địch tuỳ chọn này sẽ được chọn “Automatically assign a public IP address to your instances”. Chúng ta sẽ gán IP tĩnh cho host sau, nên giữ thông tin mặc định ban đầu.
- Add storage: xác định dung lượng cho các phân vùng hệ thống (root volume), ta cũng có thể sử dụng EBS volume để thêm vào sau khi tạo instance.
- Security group: chúng ta cần phải chọn 1 group mặc định có sẵn hoặc tạo group mới để kiểm soát các truy xuất từ ngoài internet vào instance vừa tạo và từ trong ra. Đây là “tường lửa” mà AWS cung cấp giúp bảo vệ hệ thống chúng ta. Sẽ bàn chi tiết sau, căn bản chúng ta cần cho phép các yêu cầu (request) từ bên ngoài vào dịch vụ web ở 2 port 80 (http) và 443 (https). Cấu hình này có thể thực hiện sau khi tạo instance và nó rất quan trọng; dĩ nhiên nếu không thiết lập đúng, không ai có thể truy xuất website chúng ta cài đặt.
- Đây là bước cuối cùng để xác nhận:
Lưu ý: 1 chú ý khác, chúng ta nên chọn vùng (region) của hệ thống khi tạo các instance cho phù hợp ngữ cảnh hiện tại (quốc gia, nghiệp vụ kinh doanh…)
Sau cùng, khi tạo EC2 instance thành công, chúng ta sẽ thấy màn hình sau:
Lưu ý: chúng ta nên thiết lập các thông tin cảnh báo từ hệ thống để đảm bảo rằng chi phí hàng tháng là trong tầm kiểm soát.
- Bước 2: chuẩn bị và truy xuất instance EC2 vừa tạo ở bước trên.
Đây là instance chúng ta vừa tạo ra:
Instance này nằm trong hệ thống cloud của AWS, có IP nội (internal IP) và IP ngoài (Public IP). Chúng ta cần phải truy xuất vào server Linux này để cài đặt các ứng dụng cần thiết và cho phép truy xuất từ bên ngoài vào.
Mặc định chúng ta sẽ không có IP ngoài cố định, do đó cần tạo ra 1 Elastic IP (static) và gán cho instance Linux vừa rồi (Elastic IP: có phí):
(truy xuất về sau vào host sẽ dựa vào 1 trong 2 địa chỉ: IP thực cố định vừa gán hoặc public DNS; dĩ nhiên khi chúng ta kết hợp với domain sẵn có, ta cũng sẽ truy cập được từ domain, và việc đó chưa có tại bước này)
Vậy việc tiếp theo là truy cập SSH từ terminal (dòng lệnh) và quản lý trực tiếp instance như 1 server Linux RHEL thông thường!
Để truy xuất, ta cần tạo cặp khóa (Pub/Priv) bằng cách vào màn hình “Key Pairs” ở menu bên trái vào chỉ việc gõ tên để tạo khoá:
Chú ý: cần phải download file khoá với format .pem về máy tính của mình để truy xuất hệ thống ở các bước sau.
Sau khi đã tạo key pair và gán nó cho instance Linux vừa tạo, ở màn hình Instances, chọn instance bằng cách click lên check box trước nó (duy nhất đến bước này), chúng ta sẽ thấy thông tin chi tiết phía dưới. Mục tiêu là truy xuất instance Linux này, do đó chúng ta sẽ click lên nút “Connect” phía trên (chỉ cho phép khi đánh dấu chọn instance ở bảng dưới). Màn hình hướng dẫn sẽ như sau:
Dòng lệnh hướng dẫn là dành cho hệ thống máy trạm Linux/MAC, nếu sử dụng Windows, ta cần phải xài 1 công cụ khác như là Putty (về phương pháp là tương tự nhưng sẽ có nhiều bước hơn, để bài viết không quá dài, chúng tôi chỉ tập trung cho MAC/Linux; mọi người tham khảo Putty ở đây http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/putty.html). Nếu chúng ta chọn Elastic IP, IP trong màn hình chính là IP tĩnh của host và có thể truy xuất từ bên ngoài.
Truy xuất Linux instance:
Từ command line (Linux/MAC), gõ lệnh:
ssh -i <path>/<filename.pem> ec2-user@54.200.132.21
Sau khi đã vào màn hình SSH từ Terminal console, chúng ta có thể kiểm tra instance bằng cách dòng lệnh Linux căn bản như sau:
Vậy là tại bước này, chúng ta đã sẵn sàng cho việc cài đặt các ứng dụng.
Bước 3: Cài đặt các ứng dụng để triển khai ứng dụng WordPress.
Có nhiều cài đặt cấu hình và ứng dụng chúng ta sẽ thực hiện trên hệ thống này. Việc cài 1 ứng dụng nào đó được thực hiện khá dễ dàng và trực tiếp với công cụ YUM.
Ngoài lề 1 chút về YUM (cho các bạn chưa quen Linux): YUM (Yellow dog Update Modified) là một trình quản lý gói (package manager) được phát triển bởi đại học Duke, nó được sử dụng để cải tiến việc cài đặt các RPM (Redhat Package Manager). Yum sẽ tìm kiếm từ nhiều kho package (repositories) để xác định package đích và tất cả những package liên quan (dependencies) rồi tiến hành cài đặt tất cả cho chúng ta. Redhat 5 trở đi sử dụng Yum để tải tất cả các packages về và cài đặt RPM luôn. Vì Yum cũng là 1 ứng dụng chạy trong hệ thống, chúng ta hoàn toàn có thể thay đổi cấu hình trong file /etc/yum.conf.
Trước khi tiến hành các ứng dụng, chúng ta cần SSH vào instance Linux, sau đó chạy trước dòng lệnh sau:
[ec2-user ~]$ sudo yum update -y Mục đích: để đảm bảo tất cả package được cập nhậtnhật. Rất cần thiết để đảm bảo instance Linux này được câp nhật tất cả các bản sửa lỗi và bảo mật. Mất vài phút nhưng chỉ cần chạy lần đầu và an toàn, ổn định cho toàn hệ thống.
- Cài đặt LAMP apps: Web server Apache, MySQL DB (thật ra chúng ta không cần MySQL Server vì sẽ sử dụng RDS), PHP.
[ec2-user ~]$ sudo yum groupinstall -y "Web Server" "MySQL Database" "PHP Support"
Tất cả các package liên quan cũng sẽ được cài đặt. Đương nhiên, nếu muốn chúng ta cũng có thể cài đặt riêng rẽ từng ứng dụng bằng Yum. TD: sudo yum install <package name>.
- Cài đặt gói php-mysql (là 1 module, DSO – Dynamic Shared Object của PHP được sử dụng để hỗ trợ CSDL MySQL; kết nối đến MySQL server từ PHP code).
[ec2-user ~]$ sudo yum install -y php-mysql
- Khởi động web server đã cài đặt ở bước trên:
[ec2-user ~]$ sudo service httpd start Starting httpd: [ OK ]
- Thiết lập Apache tự động chạy khi server được khởi động lại.
[ec2-user ~]$ sudo chkconfig httpd on Để kiểm tra thông tin cho chắc ăn, ta có thể chạy dòng lệnh sau và thấy kết quả như thí dụ:[ec2-user ~]$ chkconfig --list httpd httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off(httpd đã được bật ON ở các runlevel 2, 3, 4 & 5)
- Duyệt thử web server vừa cài đặt. Nếu mọi thứ thành công không trở ngại, chúng ta sẽ thấy màn hình như sau (duyệt web tại port 80 bằng IP hoặc sub-domain của instance) (nội dung chỉ được thể hiện như trong hình nếu không có file trong thư mục /var/www/html, đây là root của Apache server) ==> nếu không truy xuất được, hãy kiên nhẫn bỏ qua màn hình này và đọc xuống đoạn dưới!
- Thiết lập quyền của thư mục Document Root của Apache, mặc định thư mục /var/www/html thuộc sở hữu của user “root”, chúng ta cần thay đổi về user khác như sau:
+ Tạo 1 nhóm (group) mới “www”:
[ec2-user ~]$ sudo groupadd www+ Đưa user “ec2-user” vào nhóm này:
[ec2-user ~]$sudo usermod -a -G www
(sau khi chạy các dòng lệnh, nếu muốn kiểm tra, chúng ta cần phải "exit" và vào SSH trở lại, chạy dòng lệnh "groups", chúng ta sẽ thấy các nhóm hiện tại của user "ec2-user" hiện hành. + Thay đổi chủ sở hữu của thư mục:ec2-user
[ec2-user ~]$ sudo chown -R root:www /var/www + Thay đổi quyền (group write permission) trên thư mục gốc Apache và các thư mục con:[ec2-user ~]$ sudo chmod 2775 /var/www [ec2-user ~]$ find /var/www -type d -exec sudo chmod 2775 {} +[ec2-user ~]$ find /var/www -type f -exec sudo chmod 0664 {} +Sau các dòng lệnh này, user "ec2-user" đã có toàn quyền để quản lý!
- Kiểm tra thông tin PHP được cài đặt và hoạt động Apache server (không bắt buộc):
[ec2-user ~]$ echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php File phpinfo.php sẽ được tạo ra trong Document Root của Apache với nội dung là 1 dòng lệnh in ra màn hình thông tin chi tiết của PHP. Nếu mọi thứ tốt đẹp thì chúng ta sẽ có thể duyệt trang php vừa tạo và thấy được tất cả thông tin như màn hình sau:
WOW, vậy là tui đã có 1 cái server Linux chạy PHP/Apache! Chúng ta có thể nói thế nếu thấy được 2 màn hình trên qua web browser Tuy nhiên, vấn đề không đơn giản lắm! Nếu duyệt không được địa chỉ server mình vừa tạo, đừng lo lắng, chúng ta nghiên cứu tiếp 1 vài vấn đề ở bước kế tiếp.
AWS Security Group
Như đã đề cập, ngoài cơ chế Firewall nội tại của instance chúng ta tạo ra (tuỳ OS), AWS cung cấp 1 cơ chế bảo vệ hệ thống gọi là Security Group. Nó là 1 tường lửa ảo (Virtual Firewall), tất cả các dữ liệu qua lại trong các instance trong hệ thống (traffic) được quản lý và điều phối tại đây. Người quản trị có thể tạo 1 hay nhiều group và các quy tắc (rule) rồi đưa vào quản lý các instance đã tạo (traffic vào, ra hệ thống và giữa các instance với nhau, TD: giữa DB server và Application server).
Để biết thêm chi tiết, chúng ta có thể tham khảo tài liệu của AWS tại đây https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html.
Trong trường hợp của mình, chúng ta cần các dịch vụ web HTTP & HTTPS, do đó việc đầu tiên là cần đảm bảo các cổng (port) 80 & 443 được cho phép truy xuất từ bên ngoài vào instance máy chủ Linux đã tạo. Sau đó, chúng ta cũng cần các dịch vụ cho phép upload file, SSH, … các port tương ứng cũng cần cấu hình để cho phép (cần phải biết rõ chúng ta đang làm gì, cho phép những gì trên hệ thống để tránh mất kiểm soát về sau). Màn hình dưới đây minh hoạ cho mô tả vừa rồi, Inbound nghĩa là các traffic từ ngoài vào hệ thống.
Sau khi đã tạo group, chúng ta cần quay về điều chỉnh Properties của instance, chỉ đơn giản là xác định instance đó sử dụng group nào. Sau khi đã điều chỉnh, các request từ ngoài vào sẽ có thể đến server trong hệ thống AWS.
Trên lý thuyết, chúng ta đã có thể duyệt Apache server với màn hình thí dụ ở trên. Tuy nhiên, hiện tại chúng ta đang sử dụng Linux và bản thân OS này (image này) cũng có cấu hình firewall riêng biệt của nó. Do đó, truy xuất từ ngoài tại bước này vẫn chưa xong! (nếu sử dụng wget từ localhost đến url của web server, chúng ta sẽ lấy được nội dung HTML của trang home, nghi).
Bước cuối cùng để “thấy” được port 80 & Apache server từ ngoài: từ dòng lệnh SSH của server instance, gõ lệnh sau:
sudo system-config-firewall-tui
Click on “Customize” to simply allow the services we want as below: