Nội Dung Chính
Trong thời đại số hóa ngày nay, việc sở hữu một máy chủ ảo riêng (VPS) đã trở thành nhu cầu cấp thiết đối với nhiều cá nhân và doanh nghiệp. Không chỉ dành cho các công ty công nghệ lớn, VPS giờ đây đã trở nên phổ biến với người dùng thông thường muốn xây dựng website, ứng dụng, hay đơn giản là tìm một nơi lưu trữ dữ liệu an toàn. Giữa vô số nhà cung cấp dịch vụ VPS trên thị trường, Amazon Web Services (AWS) nổi lên như một lựa chọn hàng đầu với dịch vụ Amazon VPS (chính thức gọi là Amazon EC2 – Elastic Compute Cloud).
Amazon VPS không chỉ đơn thuần là một dịch vụ lưu trữ máy chủ, mà còn là một hệ sinh thái đám mây toàn diện mang đến sự linh hoạt, bảo mật và khả năng mở rộng vượt trội. Đối với người mới bắt đầu, việc tiếp cận với nền tảng này có thể khiến bạn cảm thấy choáng ngợp bởi vô số thuật ngữ kỹ thuật và tùy chọn cấu hình. Thế nhưng, một khi đã nắm vững các kiến thức cơ bản, Amazon VPS có thể trở thành công cụ mạnh mẽ giúp bạn hiện thực hóa các ý tưởng dự án của mình với chi phí hợp lý.
Bài viết này sẽ cung cấp một cái nhìn toàn diện về Amazon VPS từ cơ bản đến nâng cao, giúp người mới làm quen với khái niệm, cách thiết lập, quản lý và tối ưu hóa máy chủ ảo của mình. Chúng ta sẽ khám phá các loại instance AWS cung cấp, cách lựa chọn cấu hình phù hợp với nhu cầu, phương pháp đảm bảo an ninh, và các chiến lược tối ưu hóa chi phí – những yếu tố quan trọng nhất khi bắt đầu với Amazon VPS.
Hơn thế nữa, chúng ta sẽ tìm hiểu cách tận dụng các dịch vụ tích hợp trong hệ sinh thái AWS để xây dựng nên hệ thống hoàn chỉnh, từ lưu trữ cơ sở dữ liệu, cân bằng tải, đến sao lưu và khôi phục dữ liệu. Không chỉ dừng lại ở lý thuyết, bài viết còn cung cấp các hướng dẫn thực tế và ví dụ cụ thể, giúp bạn từng bước triển khai và quản lý Amazon VPS một cách hiệu quả.
Dù bạn là một lập trình viên, quản trị viên hệ thống, hay đơn giản chỉ là người đam mê công nghệ muốn tìm hiểu thêm về đám mây, bài viết này sẽ cung cấp cho bạn nền tảng kiến thức vững chắc để bắt đầu hành trình của mình với Amazon VPS. Hãy cùng khám phá tiềm năng vô hạn mà dịch vụ này mang lại và tận dụng sức mạnh của điện toán đám mây để đưa dự án của bạn lên tầm cao mới.
I. Tổng quan về Amazon VPS và hệ sinh thái AWS
1. Khái niệm cơ bản về VPS và Amazon EC2
a. Hiểu về VPS (Virtual Private Server)
VPS, hay máy chủ riêng ảo, là một giải pháp lưu trữ mang tính cách mạng trong ngành công nghiệp hosting. Khác với shared hosting truyền thống, VPS cung cấp cho người dùng một phần tài nguyên riêng biệt từ một máy chủ vật lý thông qua công nghệ ảo hóa. Điều này đồng nghĩa với việc mỗi VPS hoạt động như một máy chủ độc lập với hệ điều hành và tài nguyên được phân bổ riêng.
Về mặt kỹ thuật, một VPS được tạo ra khi một máy chủ vật lý (máy chủ mẹ) được phân chia thành nhiều máy chủ ảo thông qua phần mềm hypervisor. Phần mềm này quản lý việc phân bổ tài nguyên như CPU, RAM, và không gian lưu trữ cho từng VPS, đảm bảo chúng không can thiệp vào nhau mặc dù cùng chia sẻ một nền tảng phần cứng chung.
Lợi thế đáng kể của VPS so với shared hosting là người dùng có toàn quyền kiểm soát môi trường máy chủ của mình. Điều này bao gồm quyền truy cập root, khả năng cài đặt bất kỳ phần mềm nào tương thích với hệ điều hành, và tự do tùy chỉnh cấu hình máy chủ theo nhu cầu cụ thể.
b. Amazon EC2 – Nền tảng VPS của AWS
Amazon Elastic Compute Cloud (EC2) là dịch vụ cung cấp máy chủ ảo của Amazon Web Services, thường được gọi là Amazon VPS trong cộng đồng người dùng. Được ra mắt vào năm 2006, EC2 đã trở thành một trong những dịch vụ đám mây phổ biến nhất trên thế giới nhờ tính linh hoạt và khả năng mở rộng vượt trội.
EC2 cung cấp các instance (thực thể máy chủ ảo) với nhiều loại và kích thước khác nhau, cho phép người dùng lựa chọn cấu hình phù hợp với nhu cầu của họ. Từ các máy chủ nhỏ với chi phí thấp cho các ứng dụng đơn giản đến các instance hiệu năng cao dành cho các ứng dụng đòi hỏi tính toán phức tạp, EC2 đáp ứng được đa dạng nhu cầu sử dụng.
Sự khác biệt chính giữa EC2 và dịch vụ VPS truyền thống là mô hình elasticity (co giãn) mà Amazon cung cấp. Người dùng có thể dễ dàng tăng hoặc giảm tài nguyên máy chủ khi nhu cầu thay đổi, chỉ phải trả tiền cho tài nguyên họ thực sự sử dụng. Điều này đặc biệt hữu ích cho các doanh nghiệp có lưu lượng truy cập không đều hoặc các startup cần linh hoạt trong việc mở rộng quy mô.
c. Vị trí của EC2 trong hệ sinh thái AWS
Amazon EC2 là một mảnh ghép quan trọng trong hệ sinh thái rộng lớn của AWS, hoạt động trong sự kết hợp hài hòa với nhiều dịch vụ đám mây khác. EC2 không đơn thuần là một dịch vụ hosting, mà còn là nền tảng cho việc xây dựng các ứng dụng phức tạp trên đám mây.
Trong kiến trúc AWS, EC2 thường được kết hợp với Amazon S3 (Simple Storage Service) để lưu trữ dữ liệu, Amazon RDS (Relational Database Service) cho cơ sở dữ liệu, Amazon CloudFront cho mạng phân phối nội dung, và nhiều dịch vụ khác. Sự tích hợp này tạo nên một môi trường phát triển toàn diện, cho phép xây dựng các ứng dụng có khả năng mở rộng cao và độ tin cậy lớn.
Một điểm mạnh nữa của EC2 trong hệ sinh thái AWS là khả năng triển khai trong nhiều khu vực địa lý khác nhau (AWS Regions) và nhiều vùng khả dụng (Availability Zones). Điều này cho phép tạo ra các hệ thống có tính sẵn sàng cao và khả năng chịu lỗi tốt, đáp ứng nhu cầu của các ứng dụng quan trọng đòi hỏi thời gian hoạt động liên tục.
2. Lợi thế của Amazon VPS so với các giải pháp thay thế
a. So sánh với shared hosting truyền thống
Shared hosting là giải pháp lưu trữ phổ biến nhất cho người mới bắt đầu nhờ chi phí thấp và sự đơn giản trong quản lý. Tuy nhiên, khi đặt cạnh Amazon VPS, shared hosting bộc lộ nhiều hạn chế đáng kể.
Về hiệu năng, shared hosting buộc người dùng chia sẻ tài nguyên máy chủ với hàng trăm, thậm chí hàng nghìn website khác. Hiện tượng “hàng xóm ồn ào” (noisy neighbor) khiến website của bạn có thể chậm đi đáng kể khi các website khác trên cùng máy chủ tiêu thụ quá nhiều tài nguyên. Ngược lại, Amazon VPS cung cấp tài nguyên chuyên dụng và đảm bảo hiệu năng ổn định hơn nhiều.
Về tính linh hoạt, shared hosting thường giới hạn người dùng trong một môi trường đã được cấu hình sẵn với các phần mềm và cài đặt tiêu chuẩn. Amazon VPS cho phép tùy chỉnh toàn diện, từ hệ điều hành, cấu hình máy chủ đến việc cài đặt bất kỳ phần mềm nào bạn cần.
Khả năng mở rộng cũng là một lợi thế lớn của Amazon VPS. Trong khi shared hosting thường yêu cầu nâng cấp gói dịch vụ hoặc chuyển đổi nhà cung cấp khi website phát triển, Amazon VPS cho phép tăng hoặc giảm tài nguyên trong vài phút, thậm chí có thể tự động mở rộng dựa trên tải hệ thống thông qua tính năng Auto Scaling.
b. So sánh với các nhà cung cấp VPS khác
Thị trường VPS hiện nay khá sôi động với nhiều nhà cung cấp như DigitalOcean, Linode, Vultr hay Google Cloud Platform. Tuy nhiên, Amazon VPS vẫn có những ưu điểm riêng biệt.
Về độ tin cậy, AWS sở hữu cơ sở hạ tầng đám mây lớn nhất thế giới với hơn 25 khu vực địa lý và 81 vùng khả dụng (tính đến đầu năm 2023). Điều này cung cấp độ tin cậy và khả năng chịu lỗi vượt trội so với nhiều nhà cung cấp khác. AWS cũng đảm bảo thời gian hoạt động lên đến 99.99% thông qua thỏa thuận mức dịch vụ (SLA) của họ.
Về hệ sinh thái dịch vụ, AWS cung cấp hơn 200 dịch vụ đám mây tích hợp chặt chẽ với EC2, từ cơ sở dữ liệu, phân tích dữ liệu, đến trí tuệ nhân tạo và máy học. Điều này tạo ra một lợi thế lớn khi bạn muốn mở rộng ứng dụng của mình với các tính năng mới mà không cần tích hợp với nhà cung cấp dịch vụ bên thứ ba.
Về mô hình định giá, mặc dù Amazon VPS không nhất thiết là giải pháp rẻ nhất trên thị trường, nhưng mô hình “trả tiền theo mức sử dụng” (pay-as-you-go) của họ cho phép tối ưu hóa chi phí đáng kể. Người dùng chỉ trả tiền cho tài nguyên họ thực sự sử dụng, với khả năng giảm chi phí thông qua các tùy chọn như Spot Instances hay Reserved Instances.
c. Trường hợp sử dụng phù hợp cho Amazon VPS
Amazon VPS phù hợp với nhiều trường hợp sử dụng khác nhau, từ đơn giản đến phức tạp:
Đối với các website và ứng dụng web, Amazon VPS cung cấp môi trường lưu trữ mạnh mẽ và linh hoạt. Các website WordPress, Magento, hay các ứng dụng web tùy chỉnh đều có thể hoạt động hiệu quả trên nền tảng này, với khả năng mở rộng để đáp ứng lưu lượng truy cập tăng đột biến.
Trong lĩnh vực phát triển và kiểm thử phần mềm, Amazon VPS cho phép tạo ra các môi trường phát triển, kiểm thử và dàn dựng (staging) riêng biệt, giúp quá trình phát triển phần mềm trở nên hiệu quả hơn. Khả năng tạo và xóa các instance nhanh chóng cũng rất lý tưởng cho việc áp dụng phương pháp DevOps và CI/CD (Continuous Integration/Continuous Deployment).
Đối với các ứng dụng doanh nghiệp, Amazon VPS kết hợp với các dịch vụ AWS khác có thể hỗ trợ các hệ thống phức tạp như ERP, CRM, hoặc các ứng dụng phân tích dữ liệu lớn. Khả năng tích hợp với các dịch vụ như Amazon RDS, ElastiCache, hay các giải pháp bảo mật của AWS tạo nên một nền tảng vững chắc cho các ứng dụng doanh nghiệp quan trọng.
Các startup và doanh nghiệp nhỏ đặc biệt hưởng lợi từ mô hình chi phí linh hoạt của Amazon VPS. Thay vì đầu tư lớn vào cơ sở hạ tầng từ đầu, họ có thể bắt đầu nhỏ và mở rộng theo thời gian khi nhu cầu tăng lên, giảm thiểu rủi ro tài chính trong giai đoạn đầu.
3. Các thuật ngữ và khái niệm cơ bản trong AWS
a. Regions và Availability Zones
AWS Regions (khu vực) là các vị trí địa lý trên toàn cầu nơi AWS đặt các trung tâm dữ liệu của mình. Mỗi Region là một khu vực địa lý riêng biệt, như US East (N. Virginia), Europe (London), hay Asia Pacific (Tokyo). Việc chọn Region phù hợp là quyết định quan trọng khi triển khai Amazon VPS, ảnh hưởng đến độ trễ, chi phí, và tuân thủ quy định pháp lý.
Mỗi Region lại bao gồm nhiều Availability Zones (AZ) – các trung tâm dữ liệu riêng biệt với nguồn điện, mạng và kết nối độc lập. Các AZ trong cùng một Region được kết nối với nhau bằng mạng băng thông cao, độ trễ thấp, nhưng vẫn đủ xa nhau về mặt địa lý để tránh bị ảnh hưởng bởi cùng một sự cố như thiên tai hay mất điện.
Kiến trúc đa AZ là nền tảng cho khả năng chịu lỗi cao trong AWS. Bằng cách triển khai ứng dụng của bạn trên nhiều AZ, bạn có thể đảm bảo rằng hệ thống vẫn hoạt động ngay cả khi một AZ gặp sự cố. Đây là yếu tố then chốt trong việc xây dựng các hệ thống có tính sẵn sàng cao trên AWS.
b. AMI (Amazon Machine Images)
AMI, hay Amazon Machine Images, là các template chứa cấu hình phần mềm (hệ điều hành, máy chủ ứng dụng và các ứng dụng) cần thiết để khởi động một instance EC2. Bạn có thể hình dung AMI như một “snapshot” của một máy chủ đã được cấu hình sẵn, sẵn sàng để triển khai.
AWS Marketplace cung cấp hàng nghìn AMI, từ những hệ điều hành cơ bản như Amazon Linux, Ubuntu, Windows Server đến các AMI chuyên biệt đã được cài đặt sẵn các phần mềm như WordPress, LAMP stack, hay các ứng dụng doanh nghiệp. Nhiều AMI trong Marketplace đến từ các nhà cung cấp phần mềm uy tín, đảm bảo tính bảo mật và hiệu năng tối ưu.
Một trong những tính năng mạnh mẽ của AMI là khả năng tạo AMI tùy chỉnh. Sau khi cấu hình một instance EC2 theo nhu cầu của bạn, bạn có thể tạo một AMI từ instance đó. AMI tùy chỉnh này có thể được sử dụng để khởi động các instance giống hệt nhau, rất hữu ích cho việc triển khai hàng loạt hay khôi phục sau sự cố.
c. Instance Types và các loại tài nguyên EC2
AWS cung cấp một danh sách đa dạng các loại instance EC2, mỗi loại được tối ưu hóa cho các trường hợp sử dụng cụ thể. Việc hiểu rõ về các loại instance này giúp bạn chọn cấu hình phù hợp nhất với nhu cầu của mình:
– General Purpose Instances (T2, T3, M5, etc.): Cân bằng giữa CPU, bộ nhớ và mạng, phù hợp cho nhiều ứng dụng đa dạng như web servers, môi trường phát triển, hay cơ sở dữ liệu nhỏ.
– Compute Optimized Instances (C5, C6g, etc.): Cung cấp tỷ lệ hiệu năng CPU trên bộ nhớ cao, lý tưởng cho các workload tính toán mạnh như máy chủ batch processing, phân tích dữ liệu khoa học, hay máy chủ game.
– Memory Optimized Instances (R5, R6g, X1, etc.): Được thiết kế để xử lý các workload yêu cầu nhiều bộ nhớ như cơ sở dữ liệu lớn, máy chủ cache bộ nhớ, hay phân tích big data trong bộ nhớ.
– Storage Optimized Instances (I3, D2, etc.): Cung cấp SSD NVMe hoặc HDD với hiệu năng I/O cao, phù hợp cho cơ sở dữ liệu NoSQL, Elasticsearch, hay các ứng dụng xử lý dữ liệu tập trung.
– Accelerated Computing Instances (P3, G4, F1, etc.): Sử dụng các bộ tăng tốc phần cứng như GPU hoặc FPGA để xử lý các tác vụ như machine learning, xử lý đồ họa, hay mô phỏng khoa học.
Ngoài các loại instance, EC2 còn cung cấp nhiều loại tài nguyên bổ sung như Elastic Block Store (EBS) cho lưu trữ dữ liệu, Elastic IP Addresses cho địa chỉ IP tĩnh, và các tùy chọn mạng như Virtual Private Cloud (VPC) và Security Groups. Những tài nguyên này kết hợp với nhau tạo nên một môi trường điện toán đám mây toàn diện, đáp ứng nhu cầu đa dạng của người dùng.
II. Bắt đầu với Amazon VPS: Thiết lập và cấu hình cơ bản
1. Tạo tài khoản AWS và chuẩn bị môi trường
a. Đăng ký tài khoản AWS và thiết lập bảo mật cơ bản
Bước đầu tiên trong hành trình với Amazon VPS là tạo một tài khoản AWS. Quá trình này khá đơn giản nhưng đòi hỏi một số thông tin quan trọng. Truy cập aws.amazon.com và nhấp vào “Create an AWS Account”. Bạn sẽ cần cung cấp địa chỉ email, tạo mật khẩu và đặt tên cho tài khoản AWS của mình.
Sau khi điền thông tin cơ bản, AWS sẽ yêu cầu chi tiết thanh toán của bạn. Mặc dù AWS cung cấp Free Tier với nhiều dịch vụ miễn phí trong 12 tháng đầu tiên, bạn vẫn cần cung cấp thông tin thẻ tín dụng hợp lệ. AWS sẽ thực hiện một khoản phí xác minh nhỏ (thường là $1) và hoàn lại ngay sau đó để xác nhận thẻ của bạn.
Bước cuối cùng trong quá trình đăng ký là xác minh danh tính qua điện thoại. AWS sẽ gọi hoặc nhắn tin cho bạn với mã xác minh mà bạn cần nhập vào trang web để hoàn tất quá trình đăng ký.
Ngay sau khi tạo tài khoản, việc thiết lập các biện pháp bảo mật cơ bản là vô cùng quan trọng:
– Bật xác thực đa yếu tố (MFA) cho tài khoản root: Đây là biện pháp bảo vệ quan trọng nhất. Vào AWS Management Console, nhấp vào tên tài khoản ở góc trên bên phải, chọn “Security Credentials” và thiết lập MFA. Bạn có thể sử dụng ứng dụng xác thực như Google Authenticator hoặc Authy.
– Tạo người dùng IAM thay vì sử dụng tài khoản root: Identity and Access Management (IAM) cho phép tạo các tài khoản người dùng riêng biệt với quyền hạn cụ thể. Tạo một người dùng IAM với quyền quản trị viên cho công việc hàng ngày và chỉ sử dụng tài khoản root khi thực sự cần thiết.
– Thiết lập báo động chi phí: Để tránh hóa đơn AWS bất ngờ, hãy thiết lập cảnh báo chi phí trong AWS Budgets. Thường thì ngưỡng $5 hoặc $10 đầu tiên là hợp lý cho người mới bắt đầu.
b. Hiểu về Free Tier và hạn chế của nó
AWS Free Tier là một chương trình cho phép người dùng mới khám phá và sử dụng các dịch vụ AWS mà không phát sinh chi phí trong giới hạn nhất định. Đối với Amazon EC2 (VPS), Free Tier cung cấp 750 giờ sử dụng instance t2.micro hoặc t3.micro mỗi tháng trong 12 tháng đầu tiên. Điều này tương đương với một instance chạy liên tục 24/7.
Tuy nhiên, Free Tier có một số hạn chế quan trọng cần lưu ý:
– Giới hạn về loại instance: Chỉ t2.micro hoặc t3.micro (tùy thuộc vào khu vực) được bao gồm trong Free Tier. Đây là những instance có cấu hình khá khiêm tốn với 1 vCPU và 1GB RAM, phù hợp cho các website nhỏ hoặc môi trường phát triển.
– Giới hạn về lưu trữ: Free Tier bao gồm 30GB lưu trữ EBS, 2 triệu I/O, và 1GB snapshot. Nếu vượt quá giới hạn này, bạn sẽ bị tính phí.
– Giới hạn về băng thông: Free Tier bao gồm 15GB băng thông ra (data transfer out). Lưu lượng truy cập cao có thể nhanh chóng vượt quá giới hạn này.
– Thời hạn 12 tháng: Sau 12 tháng, bạn sẽ bị tính phí theo giá thông thường cho tất cả dịch vụ, kể cả khi sử dụng dưới mức Free Tier.
Một điểm quan trọng cần lưu ý là AWS sẽ không tự động dừng tính phí khi bạn vượt quá giới hạn Free Tier. Thay vào đó, bạn cần chủ động giám sát việc sử dụng của mình thông qua AWS Billing Dashboard và thiết lập cảnh báo chi phí để tránh hóa đơn bất ngờ.
c. Cài đặt các công cụ quản lý AWS
AWS cung cấp nhiều công cụ giúp bạn quản lý tài nguyên Amazon VPS của mình hiệu quả hơn:
– AWS Management Console: Đây là giao diện web chính để quản lý tài nguyên AWS. Giao diện trực quan này rất phù hợp cho người mới bắt đầu, cho phép bạn tạo, quản lý và giám sát các instance EC2 cũng như các dịch vụ AWS khác.
– AWS Command Line Interface (CLI): Đây là công cụ dòng lệnh cho phép bạn tương tác với các dịch vụ AWS thông qua terminal. AWS CLI có thể được cài đặt trên Windows, macOS hoặc Linux bằng cách tải về từ trang web AWS hoặc sử dụng trình quản lý gói như pip:
“`bash
pip install awscli
“`
Sau khi cài đặt, bạn cần cấu hình AWS CLI với thông tin đăng nhập của mình:
“`bash
aws configure
“`
– AWS CloudShell: Là một shell dựa trên trình duyệt có sẵn trực tiếp từ AWS Management Console. CloudShell đã được cài đặt sẵn AWS CLI và các công cụ phổ biến khác, giúp bạn quản lý tài nguyên AWS mà không cần cài đặt bất kỳ phần mềm nào trên máy tính của mình.
– AWS SDK (Software Development Kit): Nếu bạn là nhà phát triển và muốn tích hợp AWS vào ứng dụng của mình, AWS cung cấp SDK cho nhiều ngôn ngữ lập trình như Python (boto3), JavaScript, Java, .NET, và nhiều ngôn ngữ khác.
– AWS CloudFormation: Công cụ này cho phép bạn mô tả và cung cấp tài nguyên AWS bằng cách sử dụng các tệp template. Điều này giúp tự động hóa việc triển khai cơ sở hạ tầng và là nền tảng cho phương pháp “Infrastructure as Code”.
Đối với người mới bắt đầu, việc làm quen với AWS Management Console là đủ trong giai đoạn đầu. Khi bạn trở nên thoải mái hơn với AWS, AWS CLI sẽ là công cụ tiếp theo đáng để học vì nó cho phép tự động hóa nhiều tác vụ quản lý thông thường.
2. Khởi tạo instance EC2 đầu tiên
a. Chọn Region và AMI phù hợp
Việc chọn Region phù hợp là quyết định quan trọng đầu tiên khi tạo một Amazon VPS. Region lý tưởng thường là region gần nhất với người dùng cuối của bạn, giúp giảm độ trễ và cải thiện trải nghiệm người dùng. Ví dụ, nếu đối tượng khách hàng của bạn chủ yếu ở Việt Nam, bạn có thể chọn Asia Pacific (Singapore) hoặc Asia Pacific (Tokyo) làm region.
Tuy nhiên, ngoài vị trí địa lý, còn có một số yếu tố khác cần xem xét:
– Chi phí: Giá cả của cùng một dịch vụ có thể khác nhau giữa các Region. Ví dụ, các Region ở Mỹ thường có chi phí thấp hơn so với các Region ở Châu Á hay Châu Âu.
– Tuân thủ quy định: Một số quốc gia có luật pháp yêu cầu dữ liệu người dùng phải được lưu trữ trong nước. Nếu ứng dụng của bạn phải tuân thủ các quy định như GDPR ở Châu Âu, bạn nên chọn Region tương ứng.
– Tính sẵn có của dịch vụ: Không phải tất cả các dịch vụ AWS đều có sẵn ở mọi Region. Các Region mới thường có ít dịch vụ hơn so với các Region đã được thiết lập lâu đời như US East (N. Virginia).
Sau khi chọn Region, bước tiếp theo là lựa chọn AMI (Amazon Machine Image) phù hợp. AWS cung cấp hàng nghìn AMI, được phân loại như sau:
– Quick Start AMIs: Đây là các AMI do AWS cung cấp, bao gồm các hệ điều hành phổ biến như Amazon Linux 2, Ubuntu, Windows Server, etc. Amazon Linux 2 là lựa chọn tốt cho người mới bắt đầu vì nó được tối ưu hóa cho AWS và bao gồm nhiều công cụ AWS được cài đặt sẵn.
– AWS Marketplace AMIs: Đây là các AMI do bên thứ ba cung cấp, thường đã được cài đặt và cấu hình sẵn với các phần mềm cụ thể như WordPress, LAMP stack, hoặc các ứng dụng doanh nghiệp. Một số AMI trong Marketplace có thể tính phí bổ sung.
– Community AMIs: Đây là các AMI do cộng đồng người dùng AWS tạo ra và chia sẻ. Mặc dù có nhiều lựa chọn đa dạng, nhưng hãy cẩn thận khi sử dụng Community AMIs vì chúng có thể không được AWS xác minh về bảo mật.
– Your AMIs: Khi bạn đã tạo AMI của riêng mình từ các instance hiện có, chúng sẽ xuất hiện trong mục này.
Đối với người mới bắt đầu, Amazon Linux 2 hoặc Ubuntu Server thường là những lựa chọn tốt vì độ phổ biến và số lượng tài liệu hướng dẫn có sẵn.
b. Lựa chọn instance type và cấu hình lưu trữ
Amazon EC2 cung cấp nhiều loại instance khác nhau, mỗi loại được tối ưu hóa cho các trường hợp sử dụng cụ thể. Đối với người mới bắt đầu, các instance thuộc gia đình t2 hoặc t3 là lựa chọn phù hợp vì chúng cung cấp hiệu năng cơ bản với chi phí thấp.
– t2.micro/t3.micro: 1 vCPU, 1GB RAM – phù hợp cho các website nhỏ, blog cá nhân, hay môi trường phát triển. Instance này nằm trong Free Tier của AWS.
– t2.small/t3.small: 1 vCPU, 2GB RAM – phù hợp cho các ứng dụng web nhỏ và trung bình, cơ sở dữ liệu nhỏ.
– t2.medium/t3.medium: 2 vCPU, 4GB RAM – phù hợp cho các ứng dụng web trung bình, cơ sở dữ liệu nhỏ đến trung bình.
Các instance loại t2/t3 là “burstable”, nghĩa là chúng có thể tạm thời vượt quá hiệu năng cơ bản trong thời gian ngắn khi cần. Điều này làm cho chúng trở nên lý tưởng cho các workload có mức sử dụng CPU không đều.
Sau khi chọn loại instance, bạn cần cấu hình lưu trữ cho VPS của mình. Amazon EBS (Elastic Block Store) là dịch vụ lưu trữ khối được sử dụng chủ yếu với EC2. Có nhiều loại volume EBS khác nhau:
– General Purpose SSD (gp2/gp3): Cân bằng giữa giá và hiệu năng, phù hợp cho hầu hết các workload. gp3 là thế hệ mới hơn với hiệu năng cơ sở tốt hơn và giá rẻ hơn.
– Provisioned IOPS SSD (io1/io2): Cung cấp hiệu năng I/O cao và nhất quán, phù hợp cho các ứng dụng quan trọng như cơ sở dữ liệu. Đắt hơn so với gp2/gp3.
– Throughput Optimized HDD (st1): Lưu trữ HDD giá rẻ tối ưu cho throughput, phù hợp cho big data, data warehousing.
– Cold HDD (sc1): Lưu trữ HDD giá rẻ nhất, phù hợp cho dữ liệu truy cập không thường xuyên.
Đối với hầu hết người dùng mới, một volume gp3 với kích thước 8GB – 30GB là đủ cho hệ điều hành và các ứng dụng cơ bản. Nếu bạn dự định lưu trữ nhiều dữ liệu, bạn có thể cân nhắc tăng kích thước volume hoặc thêm các volume bổ sung sau khi instance đã được tạo.
c. Cấu hình mạng và bảo mật
Cấu hình mạng và bảo mật đúng cách là yếu tố quan trọng để bảo vệ Amazon VPS của bạn khỏi các mối đe dọa bảo mật. Trong quá trình tạo instance EC2, bạn sẽ cần cấu hình các thành phần sau:
– Virtual Private Cloud (VPC): Đây là mạng ảo riêng biệt trong AWS. Mỗi tài khoản AWS đều có một VPC mặc định trong mỗi Region. Đối với người mới bắt đầu, sử dụng VPC mặc định là đủ. Khi bạn trở nên thành thạo hơn, bạn có thể tạo VPC tùy chỉnh với cấu trúc mạng phức tạp hơn.
– Subnet: Đây là một dải địa chỉ IP trong VPC của bạn. Khi chọn subnet, bạn cũng đang chọn Availability Zone cho instance của mình. Nếu bạn không có yêu cầu cụ thể, có thể chọn bất kỳ subnet nào trong VPC mặc định.
– Auto-assign Public IP: Tùy chọn này xác định liệu instance của bạn có nhận địa chỉ IP công khai hay không. Bạn thường muốn bật tùy chọn này nếu instance cần có thể truy cập từ internet.
– Security Group: Đây là tường lửa ảo cho instance của bạn, kiểm soát lưu lượng vào và ra. Khi tạo một instance mới, bạn nên cấu hình security group để chỉ cho phép lưu lượng cần thiết. Ví dụ:
– Cho phép SSH (cổng 22) từ địa chỉ IP của bạn nếu bạn cần truy cập qua SSH
– Cho phép HTTP (cổng 80) và HTTPS (cổng 443) từ bất kỳ đâu nếu bạn đang chạy một web server
– Chặn tất cả các cổng khác theo mặc định
– Key Pair: Đây là phương thức xác thực chính để truy cập instance EC2 của bạn. Khi tạo instance, bạn sẽ được yêu cầu chọn hoặc tạo một key pair mới. AWS sẽ lưu trữ khóa công khai và cung cấp cho bạn khóa riêng tư để tải xuống. Khóa riêng tư này cực kỳ quan trọng – nếu mất, bạn sẽ không thể truy cập instance của mình. Lưu trữ tệp khóa (.pem hoặc .ppk) ở một vị trí an toàn và đặt quyền truy cập hạn chế cho nó.
Một số nguyên tắc bảo mật quan trọng khi cấu hình Amazon VPS:
– Nguyên tắc đặc quyền tối thiểu: Chỉ mở các cổng cần thiết trong security group.
– Sử dụng Bastion Host: Nếu có nhiều instance, cân nhắc sử dụng một bastion host (jump box) làm điểm vào duy nhất cho SSH.
– Cập nhật thường xuyên: Đảm bảo instance của bạn luôn được cập nhật với các bản vá bảo mật mới nhất.
– Giám sát: Bật AWS CloudTrail và cân nhắc sử dụng các dịch vụ giám sát bảo mật như Amazon GuardDuty.
3. Kết nối và quản lý instance EC2 cơ bản
a. Phương thức kết nối đến instance
Sau khi khởi tạo thành công instance EC2, bước tiếp theo là kết nối vào máy chủ để bắt đầu cấu hình và sử dụng. Phương thức kết nối phụ thuộc vào hệ điều hành của instance và thiết bị bạn đang sử dụng.
Đối với Linux instances:
– SSH (Secure Shell) là phương thức phổ biến nhất để kết nối đến Linux instances. Trên macOS và Linux, bạn có thể sử dụng terminal có sẵn. Trên Windows, bạn có thể sử dụng các công cụ như PuTTY, Windows Subsystem for Linux (WSL), hoặc PowerShell.
Kết nối bằng SSH trên macOS/Linux:
“`bash
chmod 400 your-key-pair.pem
ssh -i your-key-pair.pem ec2-user@your-instance-public-ip
“`
Lưu ý rằng tên người dùng mặc định khác nhau tùy thuộc vào AMI:
– Amazon Linux: ec2-user
– Ubuntu: ubuntu
– Debian: admin hoặc root
– CentOS: centos
– RHEL: ec2-user hoặc root
– EC2 Instance Connect: Đây là một phương thức kết nối dựa trên trình duyệt do AWS cung cấp, không yêu cầu cài đặt phần mềm SSH hay quản lý khóa SSH trên máy tính của bạn. Bạn chỉ cần nhấp vào instance trong AWS Management Console và chọn “Connect” -> “EC2 Instance Connect”.
– AWS Systems Manager Session Manager: Phương thức này cho phép quản lý instance mà không cần mở cổng SSH, cung cấp kết nối an toàn thông qua AWS Management Console hoặc AWS CLI.
Đối với Windows instances:
– Remote Desktop Protocol (RDP): Đây là phương thức chính để kết nối đến Windows instances. Để sử dụng RDP, bạn cần:
1. Lấy mật khẩu Windows từ AWS Management Console bằng cách nhấp chuột phải vào instance và chọn “Get Windows password”, cung cấp tệp khóa riêng tư (.pem) của bạn.
2. Sử dụng Remote Desktop Client (có sẵn trên Windows, hoặc Microsoft Remote Desktop cho macOS) để kết nối đến địa chỉ IP công khai của instance.
b. Cập nhật hệ thống và cài đặt phần mềm cơ bản
Sau khi kết nối thành công đến instance EC2, việc đầu tiên bạn nên làm là cập nhật hệ thống để đảm bảo bạn có các bản vá bảo mật và gói phần mềm mới nhất.
Trên Amazon Linux 2:
“`bash
sudo yum update -y
“`
Trên Ubuntu/Debian:
“`bash
sudo apt update
sudo apt upgrade -y
“`
Trên CentOS/RHEL:
“`bash
sudo yum update -y
“`
Sau khi cập nhật hệ thống, bạn có thể bắt đầu cài đặt các phần mềm cơ bản tùy thuộc vào mục đích sử dụng của server. Dưới đây là một số ví dụ phổ biến:
1. Cài đặt web server (Apache):
Trên Amazon Linux 2/CentOS/RHEL:
“`bash
sudo yum install httpd -y
sudo systemctl start httpd
sudo systemctl enable httpd
“`
Trên Ubuntu/Debian:
“`bash
sudo apt install apache2 -y
sudo systemctl start apache2
sudo systemctl enable apache2
“`
2. Cài đặt NGINX:
Trên Amazon Linux 2:
“`bash
sudo amazon-linux-extras install nginx1 -y
sudo systemctl start nginx
sudo systemctl enable nginx
“`
Trên Ubuntu/Debian:
“`bash
sudo apt install nginx -y
sudo systemctl start nginx
sudo systemctl enable nginx
“`
3. Cài đặt PHP:
Trên Amazon Linux 2:
“`bash
sudo amazon-linux-extras install php7.4 -y
sudo yum install php-cli php-fpm php-mysqlnd php-bcmath php-ctype php-fileinfo php-json php-mbstring php-openssl php-pdo php-gd -y
sudo systemctl start php-fpm
sudo systemctl enable php-fpm
“`
Trên Ubuntu/Debian:
“`bash
sudo apt install php php-cli php-fpm php-mysql php-json php-common php-mbstring php-zip php-gd php-xml -y
sudo systemctl start php7.4-fpm # version may vary
sudo systemctl enable php7.4-fpm
“`
4. Cài đặt MySQL/MariaDB:
Trên Amazon Linux 2:
“`bash
sudo yum install mariadb-server -y
sudo systemctl start mariadb
sudo systemctl enable mariadb
sudo mysql_secure_installation # set root password and secure the installation
“`
Trên Ubuntu/Debian:
“`bash
sudo apt install mysql-server -y
sudo systemctl start mysql
sudo systemctl enable mysql
sudo mysql_secure_installation
“`
c. Quản lý instance: khởi động, dừng, và khởi động lại
Quản lý trạng thái hoạt động của Amazon VPS là một kỹ năng cơ bản mà mọi người dùng cần nắm vững. Có nhiều cách để thực hiện các thao tác này, bao gồm sử dụng AWS Management Console, AWS CLI, hoặc các API calls.
Sử dụng AWS Management Console:
1. Đăng nhập vào AWS Management Console và điều hướng đến dịch vụ EC2.
2. Trong phần “Instances”, chọn instance bạn muốn quản lý.
3. Nhấp vào nút “Instance state” và chọn hành động phù hợp:
– Start: Khởi động instance đang dừng
– Stop: Dừng instance đang chạy (lưu ý rằng bạn sẽ không bị tính phí cho thời gian CPU khi instance dừng, nhưng vẫn bị tính phí cho lưu trữ EBS)
– Reboot: Khởi động lại instance
– Terminate: Xóa vĩnh viễn instance (thao tác này không thể hoàn tác và bạn sẽ mất mọi dữ liệu trên instance store volumes)
Sử dụng AWS CLI:
Để khởi động instance:
“`bash
aws ec2 start-instances –instance-ids i-1234567890abcdef0
“`
Để dừng instance:
“`bash
aws ec2 stop-instances –instance-ids i-1234567890abcdef0
“`
Để khởi động lại instance:
“`bash
aws ec2 reboot-instances –instance-ids i-1234567890abcdef0
“`
Để terminate (xóa) instance:
“`bash
aws ec2 terminate-instances –instance-ids i-1234567890abcdef0
“`
Quản lý instance từ trong instance (self-management):
Từ bên trong Linux instance, bạn có thể sử dụng AWS CLI (nếu đã cài đặt và cấu hình) hoặc các lệnh hệ thống:
Để khởi động lại instance từ bên trong:
“`bash
sudo reboot
“`
Để dừng instance từ bên trong:
“`bash
sudo shutdown -h now
“`
Các lưu ý quan trọng về quản lý trạng thái instance:
– Khi bạn dừng và khởi động lại một instance, địa chỉ IP công khai có thể thay đổi trừ khi bạn sử dụng Elastic IP.
– Instance store volumes (nếu có) sẽ mất dữ liệu khi instance dừng hoặc terminate. EBS volumes vẫn giữ dữ liệu khi instance dừng nhưng có thể bị xóa khi instance terminate tùy thuộc vào cấu hình “Delete on Termination”.
– Bạn không bị tính phí cho thời gian CPU/RAM khi instance đang dừng, nhưng vẫn bị tính phí cho lưu trữ EBS và các tài nguyên khác như Elastic IP.
– Instance trong trạng thái dừng vẫn có thể được sửa đổi, ví dụ: thay đổi loại instance, thêm/xóa EBS volumes, hoặc sửa đổi IAM role.
III. Tối ưu hóa hiệu suất và bảo mật cho Amazon VPS
1. Tăng cường bảo mật cho instance EC2
a. Cấu hình Security Groups và Network ACLs
Security Groups và Network ACLs là hai lớp bảo mật quan trọng trong AWS, hoạt động như tường lửa ảo để kiểm soát lưu lượng mạng vào và ra khỏi Amazon VPS của bạn. Mặc dù có chức năng tương tự, nhưng chúng hoạt động ở các cấp độ khác nhau và có những khác biệt quan trọng.
Security Groups hoạt động ở cấp độ instance, hoạt động như tường lửa cho các instance EC2 riêng lẻ. Một số đặc điểm chính của Security Groups:
– Stateful: Nếu bạn cho phép lưu lượng đi vào, phản hồi tương ứng sẽ tự động được cho phép ra ngoài bất kể quy tắc đi ra.
– Chỉ cho phép (allow rules only): Bạn chỉ có thể đặt quy tắc cho phép, không thể tạo quy tắc từ chối.
– Được đánh giá tổng thể: Nếu có nhiều quy tắc áp dụng, quy tắc cho phép nhất sẽ được áp dụng.
Cấu hình Security Group hiệu quả yêu cầu tuân theo nguyên tắc đặc quyền tối thiểu. Ví dụ, một Security Group cơ bản cho một web server có thể bao gồm:
“`
Inbound Rules:
– Allow HTTP (port 80) from 0.0.0.0/0 (everywhere)
– Allow HTTPS (port 443) from 0.0.0.0/0 (everywhere)
– Allow SSH (port 22) only from your IP address (e.g., 203.0.113.1/32)
Outbound Rules:
– Allow all traffic (default)
“`
Để tăng cường bảo mật hơn nữa, bạn nên:
– Hạn chế truy cập SSH bằng cách chỉ cho phép từ địa chỉ IP cụ thể hoặc dải IP.
– Xem xét sử dụng cổng SSH không chuẩn hoặc thiết lập một bastion host.
– Xem xét hạn chế outbound rules chỉ cho các dịch vụ cần thiết thay vì cho phép tất cả.
Network ACLs (NACLs) hoạt động ở cấp độ subnet, kiểm soát lưu lượng vào và ra khỏi một hoặc nhiều subnet trong VPC của bạn. Các đặc điểm chính của NACLs:
– Stateless: Lưu lượng vào và ra được đánh giá riêng biệt, bạn cần tạo quy tắc riêng cho mỗi hướng.
– Cả quy tắc cho phép và từ chối: Bạn có thể tạo cả quy tắc cho phép và từ chối.
– Đánh giá theo thứ tự: Quy tắc được đánh giá theo thứ tự số (từ thấp đến cao), và quy tắc đầu tiên phù hợp sẽ được áp dụng.
Mặc dù Security Groups là đủ cho hầu hết các trường hợp, bạn có thể sử dụng NACLs như một lớp bảo mật bổ sung khi cần thiết. Ví dụ, bạn có thể sử dụng NACLs để chặn lưu lượng từ các địa chỉ IP đáng ngờ ở cấp độ subnet, trong khi vẫn cho phép lưu lượng hợp pháp thông qua Security Groups ở cấp độ instance.
b. Quản lý SSH Keys và mật khẩu một cách an toàn
Quản lý SSH Keys và mật khẩu đúng cách là yếu tố quan trọng để bảo vệ Amazon VPS của bạn khỏi truy cập trái phép. Dưới đây là các thực hành tốt nhất cho việc quản lý SSH Keys:
1. Bảo vệ tệp khóa riêng tư (.pem/.ppk):
– Đặt quyền truy cập hạn chế cho tệp khóa: `chmod 400 your-key.pem`
– Không bao giờ chia sẻ hoặc kiểm soát phiên bản khóa riêng tư của bạn
– Lưu trữ tệp khóa trong một vị trí an toàn, lý tưởng là trong một trình quản lý mật khẩu
– Cân nhắc mã hóa tệp khóa với mật khẩu
2. Sử dụng nhiều cặp khóa cho các mục đích khác nhau:
– Tạo các cặp khóa riêng biệt cho môi trường phát triển, kiểm thử và sản xuất
– Xoay khóa (tạo mới và vô hiệu hóa cũ) định kỳ, đặc biệt khi có thành viên rời khỏi nhóm
3. Thiết lập xác thực đa yếu tố (MFA) cho SSH:
“`bash
sudo apt install libpam-google-authenticator # Ubuntu/Debian
# hoặc
sudo yum install google-authenticator # Amazon Linux/CentOS
# Sau đó cấu hình PAM và sshd_config
“`
4. Giảm thiểu rủi ro mất khóa:
– Lưu trữ bản sao của cặp khóa trong một vị trí an toàn
– Chuẩn bị AMI với khóa công khai thay thế đã được cài đặt
– Sử dụng EC2 Instance Connect hoặc AWS Systems Manager Session Manager như giải pháp dự phòng
Đối với tài khoản người dùng hệ thống và mật khẩu:
1. Thiết lập chính sách mật khẩu mạnh:
“`bash
sudo vi /etc/security/pwquality.conf # Cấu hình yêu cầu mật khẩu
sudo vi /etc/login.defs # Thiết lập thời gian hết hạn mật khẩu
“`
2. Vô hiệu hóa đăng nhập bằng mật khẩu cho SSH khi có thể:
“`bash
sudo vi /etc/ssh/sshd_config
# Đặt PasswordAuthentication no
# Đặt PermitRootLogin no
sudo systemctl restart sshd
“`
3. Sử dụng quản lý mật khẩu tập trung:
– Xem xét giải pháp như AWS Secrets Manager hoặc HashiCorp Vault để quản lý bí mật
– Thiết lập quy trình tự động để xoay mật khẩu và bí mật định kỳ
4. Theo dõi và ghi nhật ký các nỗ lực đăng nhập:
“`bash
sudo apt install fail2ban # Ubuntu/Debian
# hoặc
sudo yum install fail2ban # Amazon Linux/CentOS
“`
c. Cập nhật bảo mật và quản lý bản vá
Duy trì Amazon VPS của bạn với các bản vá bảo mật mới nhất là một phần quan trọng trong chiến lược bảo mật tổng thể. Các lỗ hổng không được vá có thể dẫn đến xâm nhập hệ thống, mất dữ liệu, hoặc thậm chí các cuộc tấn công ransomware. Dưới đây là các phương pháp hiệu quả để quản lý cập nhật bảo mật:
1. Thiết lập cập nhật tự động cho hệ điều hành:
Trên Amazon Linux 2:
“`bash
sudo yum install -y yum-cron
sudo systemctl enable yum-cron
sudo systemctl start yum-cron
# Cấu hình để tự động cài đặt cập nhật bảo mật
sudo vi /etc/yum/yum-cron.conf
# Đặt apply_updates = yes
# Đặt update_cmd = security
“`
Trên Ubuntu:
“`bash
sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
# Hoặc cấu hình thủ công
sudo vi /etc/apt/apt.conf.d/50unattended-upgrades
“`
2. Sử dụng AWS Systems Manager Patch Manager:
AWS Systems Manager Patch Manager là một dịch vụ quản lý bản vá mạnh mẽ, cho phép bạn tự động hóa quy trình vá lỗi cho nhiều instance EC2:
– Thiết lập cơ sở tham chiếu vá lỗi (patch baseline) xác định các bản vá được phê duyệt
– Tạo cửa sổ bảo trì (maintenance windows) để lên lịch vá lỗi vào thời gian phù hợp
– Tự động quét các instance để tìm bản vá thiếu
– Tạo báo cáo về trạng thái tuân thủ vá lỗi
Để sử dụng Patch Manager, bạn cần cài đặt SSM Agent trên các instance EC2 của mình (đã được cài đặt sẵn trên hầu hết các AMI của AWS) và đảm bảo instance có IAM role phù hợp với quyền Systems Manager.
3. Thiết lập quy trình kiểm tra và vá lỗi:
Một quy trình quản lý bản vá hiệu quả bao gồm các bước sau:
– Thường xuyên theo dõi các thông báo bảo mật từ nhà cung cấp hệ điều hành và phần mềm
– Ưu tiên các bản vá dựa trên mức độ nghiêm trọng và tác động tiềm ẩn
– Kiểm tra các bản vá trong môi trường phát triển trước khi áp dụng cho môi trường sản xuất
– Tạo các bản sao lưu hoặc snapshot trước khi áp dụng các bản vá quan trọng
– Lên lịch vá lỗi vào thời điểm có ít tác động nhất đến người dùng
– Xác minh rằng ứng dụng vẫn hoạt động bình thường sau khi vá lỗi
4. Tự động hóa kiểm tra bảo mật:
Ngoài việc vá lỗi, tự động hóa kiểm tra bảo mật có thể giúp xác định các lỗ hổng tiềm ẩn:
“`bash
# Cài đặt công cụ kiểm tra bảo mật như Lynis
sudo apt install lynis # Ubuntu/Debian
# hoặc
cd /tmp && wget https://downloads.cisofy.com/lynis/lynis-3.0.8.tar.gz && tar xzf lynis-3.0.8.tar.gz # Các bản phân phối khác
# Chạy kiểm tra
cd lynis && sudo ./lynis audit system
“`
5. Theo dõi và ghi nhật ký cập nhật:
Việc theo dõi quá trình cập nhật giúp xác định các vấn đề tiềm ẩn và đảm bảo tính tuân thủ:
– Bật AWS CloudTrail để theo dõi các hoạt động API liên quan đến quản lý instance
– Sử dụng Amazon CloudWatch Logs để thu thập và phân tích nhật ký hệ thống
– Thiết lập cảnh báo cho các thay đổi hệ thống quan trọng
– Duy trì nhật ký cập nhật để đáp ứng các yêu cầu kiểm toán và tuân thủ
2. Tối ưu hiệu suất instance
a. Theo dõi và phân tích hiệu năng với CloudWatch
Amazon CloudWatch là dịch vụ giám sát và quan sát toàn diện của AWS, cung cấp dữ liệu và thông tin chi tiết có thể hành động cho các ứng dụng và tài nguyên đám mây của bạn. Đối với Amazon VPS, CloudWatch là công cụ quan trọng để theo dõi, phân tích và tối ưu hóa hiệu năng. Dưới đây là cách tận dụng CloudWatch hiệu quả:
1. Các chỉ số (metrics) cơ bản CloudWatch cho EC2:
CloudWatch tự động thu thập các chỉ số cơ bản cho mỗi instance EC2 với chu kỳ 5 phút (hoặc 1 phút với chi phí bổ sung khi bạn bật detailed monitoring):
– CPU Utilization: Phần trăm CPU được cấp phát đang được sử dụng
– Network In/Out: Lượng bytes được gửi đến/từ tất cả các giao diện mạng
– Disk Read/Write Operations: Số lượng thao tác đọc/ghi
– Disk Read/Write Bytes: Số bytes đọc/ghi
– Status Check: Kiểm tra hệ thống và instance để đảm bảo instance đang hoạt động bình thường
Để xem các chỉ số này trong AWS Management Console, điều hướng đến CloudWatch > Metrics > EC2 và chọn instance cụ thể của bạn.
2. Tạo bảng điều khiển CloudWatch tùy chỉnh:
Bảng điều khiển tùy chỉnh cho phép bạn tập hợp các chỉ số quan trọng nhất vào một nơi:
“`bash
# Sử dụng AWS CLI để tạo bảng điều khiển
aws cloudwatch put-dashboard –dashboard-name “MyServerDashboard” –dashboard-body “{\”widgets\”:[…]}”
“`
Một bảng điều khiển hiệu quả cho Amazon VPS thường bao gồm:
– Biểu đồ sử dụng CPU và bộ nhớ
– Hoạt động đĩa và mạng
– Các chỉ số ứng dụng cụ thể (thời gian phản hồi, số lượng yêu cầu, v.v.)
– Tình trạng hệ thống và kiểm tra tình trạng
3. Thiết lập CloudWatch Alarms:
CloudWatch Alarms cho phép bạn thiết lập ngưỡng cảnh báo để thông báo khi các chỉ số vượt quá giá trị xác định:
“`bash
# Ví dụ: Tạo cảnh báo khi CPU vượt quá 80% trong 5 phút
aws cloudwatch put-metric-alarm \
–alarm-name high-cpu-utilization \
–comparison-operator GreaterThanThreshold \
–evaluation-periods 5 \
–metric-name CPUUtilization \
–namespace AWS/EC2 \
–period 60 \
–threshold 80 \
–statistic Average \
–alarm-description “Alarm when CPU exceeds 80%” \
–dimensions Name=InstanceId,Value=i-12345678 \
–alarm-actions arn:aws:sns:us-east-1:123456789012:my-notification-topic
“`
Các cảnh báo quan trọng cần xem xét:
– Sử dụng CPU cao (>80-90% trong thời gian dài)
– Sử dụng bộ nhớ cao
– Không gian đĩa thấp
– Trạng thái không lành mạnh trong kiểm tra tình trạng
4. Triển khai CloudWatch Agent để thu thập chỉ số chi tiết hơn:
Mặc định, CloudWatch chỉ thu thập các chỉ số cấp hypervisor. Để thu thập thông tin chi tiết hơn từ bên trong instance (như sử dụng bộ nhớ, không gian đĩa, và các quy trình), bạn cần cài đặt CloudWatch Agent:
“`bash
# Cài đặt CloudWatch Agent trên Amazon Linux 2
sudo yum install amazon-cloudwatch-agent -y
# Cài đặt trên Ubuntu
wget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/amd64/latest/amazon-cloudwatch-agent.deb
sudo dpkg -i amazon-cloudwatch-agent.deb
# Tạo tệp cấu hình cho agent
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
# Bắt đầu agent
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json
“`
5. Phân tích hiệu năng dài hạn:
CloudWatch Metrics Insights cho phép bạn thực hiện các truy vấn dựa trên SQL đối với các chỉ số của mình để xác định xu hướng và mẫu. Các phân tích có thể giúp bạn:
– Xác định thời điểm trong ngày/tuần có tải cao
– Phát hiện tăng trưởng dần dần trong việc sử dụng tài nguyên
– So sánh hiệu năng trước và sau các thay đổi cấu hình
– Dự báo nhu cầu tài nguyên trong tương lai
b. Lựa chọn và thay đổi instance type phù hợp
Việc chọn instance type phù hợp là yếu tố quan trọng để tối ưu hiệu suất và chi phí cho Amazon VPS của bạn. AWS cung cấp hơn 400 loại instance khác nhau, mỗi loại được tối ưu hóa cho các trường hợp sử dụng cụ thể. Dưới đây là cách tiếp cận có hệ thống để chọn và thay đổi instance type:
1. Xác định yêu cầu workload:
Trước khi chọn instance type, hãy phân tích workload của bạn để xác định:
– Yêu cầu CPU: Số lượng cores và hiệu năng cho mỗi core
– Yêu cầu bộ nhớ: Lượng RAM cần thiết
– Yêu cầu lưu trữ: Dung lượng, IOPS, throughput
– Yêu cầu mạng: Băng thông, độ trễ
– Nhu cầu GPU hoặc tăng tốc đặc biệt
2. Hiểu các họ instance EC2 chính:
– **General Purpose (T3, T4g, M5, M6g)**: Cân bằng giữa tính toán, bộ nhớ và mạng, phù hợp cho hầu hết các ứng dụng như web servers, môi trường phát triển.
– **Compute Optimized (C5, C6g)**: Tỷ lệ CPU-trên-bộ nhớ cao, phù hợp cho các workload tính toán mạnh như máy chủ web có lưu lượng cao, xử lý batch, phân tích dữ liệu.
– **Memory Optimized (R5, R6g, X1, z1d)**: Tỷ lệ bộ nhớ-trên-CPU cao, lý tưởng cho cơ sở dữ liệu, bộ nhớ cache trong bộ nhớ, và phân tích dữ liệu thời gian thực.
– **Storage Optimized (I3, D2, H1)**: Tối ưu hóa cho các workload đọc/ghi dữ liệu lớn, như cơ sở dữ liệu NoSQL, Elasticsearch, data warehousing.
– **Accelerated Computing (P3, G4, F1)**: Tích hợp GPU hoặc FPGA, phù hợp cho machine learning, xử lý đồ họa, và tính toán đa phương tiện.
3. Đánh giá hiệu năng hiện tại và xác định nút thắt cổ chai:
Sử dụng CloudWatch và các công cụ giám sát bên trong instance để xác định tài nguyên nào đang bị giới hạn:
“`bash
# Giám sát sử dụng CPU, RAM và đĩa trong thời gian thực
sudo amazon-linux-extras install epel -y # Amazon Linux 2
sudo yum install htop iotop -y
# Hoặc trên Ubuntu
sudo apt install htop iotop -y
# Theo dõi hiệu năng với các công cụ này
htop # CPU và RAM
iotop # I/O đĩa
“`
Các dấu hiệu chỉ ra rằng bạn cần thay đổi instance type:
– CPU thường xuyên trên 80-90%
– Swapping do thiếu RAM
– Thời gian chờ I/O cao
– Thời gian phản hồi ứng dụng chậm
– Băng thông mạng đạt ngưỡng giới hạn
4. Quy trình thay đổi instance type:
Thay đổi instance type yêu cầu dừng instance trước. Lập kế hoạch thay đổi này trong thời gian ít tác động:
“`bash
# Sử dụng AWS CLI để thay đổi instance type
aws ec2 stop-instances –instance-ids i-1234567890abcdef0
aws ec2 modify-instance-attribute –instance-id i-1234567890abcdef0 –instance-type t3.medium
aws ec2 start-instances –instance-ids i-1234567890abcdef0
“`
Hoặc thông qua AWS Management Console:
1. Chọn instance > Instance state > Stop instance
2. Chọn instance > Actions > Instance settings > Change instance type
3. Chọn instance type mới > Apply
4. Chọn instance > Instance state > Start instance
5. Xem xét các lựa chọn instance tiên tiến:
– **Burstable Instances (T3, T4g)**: Cung cấp hiệu suất cơ sở với khả năng “burst” trên mức cơ sở khi cần. Phù hợp cho các workload không thường xuyên yêu cầu CPU cao.
– **AMD vs. Intel**: Các instance dựa trên AMD (như M5a, R5a) thường có giá thấp hơn so với các instance Intel tương đương.
– **Graviton Processors (M6g, C6g, R6g)**: Instance dựa trên ARM do AWS phát triển, cung cấp hiệu suất tốt hơn đến 40% và chi phí thấp hơn đến 20% so với các instance x86 tương đương.
– **Instance có bộ nhớ tốc độ cao (z1d, x1)**: Cung cấp bộ nhớ tần số cao cho các ứng dụng nhạy cảm với độ trễ.
6. Sử dụng AWS Compute Optimizer:
AWS Compute Optimizer phân tích mẫu sử dụng của các instance hiện có và đưa ra đề xuất về các loại instance tối ưu hơn:
1. Điều hướng đến AWS Compute Optimizer trong AWS Management Console
2. Opt-in để bắt đầu nhận đề xuất
3. Xem xét các đề xuất dựa trên dữ liệu hiệu suất thực tế
c. Tối ưu hóa cấu hình hệ thống và ứng dụng
Ngoài việc chọn instance type phù hợp, việc tối ưu hóa cấu hình hệ thống và ứng dụng là rất quan trọng để tận dụng tối đa hiệu suất của Amazon VPS. Dưới đây là các chiến lược tối ưu hóa cho các thành phần khác nhau:
1. Tối ưu hóa kernel và hệ điều hành:
“`bash
# Tối ưu hóa tham số kernel trong sysctl.conf
sudo vi /etc/sysctl.conf
# Tăng giới hạn file handles
fs.file-max = 65536
# Tối ưu hóa ngăn xếp mạng
net.core.somaxconn = 4096
net.core.netdev_max_backlog = 4096
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 15
# Áp dụng thay đổi
sudo sysctl -p
“`
Tối ưu hóa giới hạn tài nguyên:
“`bash
# Chỉnh sửa giới hạn tài nguyên hệ thống
sudo vi /etc/security/limits.conf
# Thêm các dòng sau:
* soft nofile 65536
* hard nofile 65536
“`
2. Tối ưu hóa lưu trữ:
– **Chọn loại volume EBS phù hợp**:
– General Purpose SSD (gp3): Cân bằng chi phí/hiệu năng cho hầu hết workload
– Provisioned IOPS SSD (io2): Cho cơ sở dữ liệu và ứng dụng quan trọng yêu cầu hiệu năng I/O cao
– Throughput Optimized HDD (st1): Cho big data, DWH, log processing
– **Tối ưu hóa gp3 EBS volumes**:
“`bash
# Tăng IOPS và throughput cho volume gp3 hiện có
aws ec2 modify-volume –volume-id vol-1234567890abcdef0 –iops 6000 –throughput 250
“`
– **Optimizing file systems**:
“`bash
# Tạo filesystem XFS với cấu hình tối ưu
sudo mkfs.xfs -d su=64k,sw=4 -l size=128m /dev/xvdf
# Tối ưu hóa các tùy chọn mount
sudo vi /etc/fstab
# Thêm options như noatime, nodiratime để giảm I/O
/dev/xvdf /data xfs defaults,noatime,nodiratime 0 0
“`
3. Tối ưu hóa web server:
– **Cấu hình NGINX**:
“`bash
# Điều chỉnh số lượng worker processes và connections
sudo vi /etc/nginx/nginx.conf
worker_processes auto;
worker_rlimit_nofile 65535;
events {
worker_connections 4096;
multi_accept on;
use epoll;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
keepalive_requests 100000;
# Cấu hình bộ nhớ cache
open_file_cache max=200000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
}
“`
– **Cấu hình Apache**:
“`bash
# Chuyển từ prefork sang event MPM
sudo vi /etc/apache2/mods-available/mpm_event.conf
ServerLimit 16
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
# Bật các modules hiệu quả
sudo a2enmod mpm_event
sudo a2dismod mpm_prefork
sudo systemctl restart apache2
“`
4. Tối ưu hóa cơ sở dữ liệu:
– **MySQL/MariaDB**:
“`bash
sudo vi /etc/mysql/my.cnf
# Cấu hình bộ nhớ đệm InnoDB
innodb_buffer_pool_size = 4G # 70-80% bộ nhớ hệ thống
innodb_buffer_pool_instances = 4
innodb_read_io_threads = 8
innodb_write_io_threads = 8
innodb_flush_log_at_trx_commit = 2 # Ít rủi ro hơn đối với dữ liệu, hiệu suất tốt hơn
# Cấu hình query cache (cân nhắc vô hiệu hóa trên MySQL 5.7+)
query_cache_type = 0
query_cache_size = 0
# Tối ưu hóa bảng tạm thời
tmp_table_size = 64M
max_heap_table_size = 64M
“`
– **PostgreSQL**:
“`bash
sudo vi /etc/postgresql/12/main/postgresql.conf
# Tối ưu hóa bộ nhớ
shared_buffers = 2GB # 25% bộ nhớ hệ thống
effective_cache_size = 6GB # 75% bộ nhớ hệ thống
work_mem = 20MB # Phụ thuộc vào các truy vấn phức tạp và số lượng kết nối
maintenance_work_mem = 512MB
# Tối ưu hóa checkpoints
checkpoint_timeout = 15min
checkpoint_completion_target = 0.9
“`
5. Tối ưu hóa ứng dụng:
– **Cấu hình PHP-FPM**:
“`bash
sudo vi /etc/php/7.4/fpm/pool.d/www.conf
; Điều chỉnh số lượng processes
pm = dynamic
pm.max_children = 100
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 30
pm.max_requests = 1000
; Thêm opcache vào php.ini
sudo vi /etc/php/7.4/fpm/php.ini
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60
opcache.save_comments=1
“`
– **Node.js**:
“`javascript
// Sử dụng cluster module để tận dụng nhiều CPU cores
const cluster = require(‘cluster’);
const numCPUs = require(‘os’).cpus().length;
if (cluster.isMaster) {
// Fork workers
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
} else {
// Worker process
require(‘./app.js’);
}
“`
6. Tối ưu hóa mạng:
– **Bật Enhanced Networking**:
“`bash
# Kiểm tra xem enhanced networking có được bật không
aws ec2 describe-instances –instance-ids i-1234567890abcdef0 –query “Reservations[].Instances[].EnaSupport”
# Nếu không, bạn cần dừng instance, bật tính năng, và khởi động lại
aws ec2 stop-instances –instance-ids i-1234567890abcdef0
aws ec2 modify-instance-attribute –instance-id i-1234567890abcdef0 –ena-support
aws ec2 start-instances –instance-ids i-1234567890abcdef0
“`
– **Tối ưu hóa MTU**:
“`bash
# Kiểm tra MTU hiện tại
ip link show eth0
# Điều chỉnh MTU (9001 cho jumbo frames nếu mạng hỗ trợ)
sudo ip link set dev eth0 mtu 9001
# Để tùy chỉnh trở nên vĩnh viễn
sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0 # RHEL/CentOS
# Thêm: MTU=9001
# Hoặc trên Ubuntu
sudo vi /etc/netplan/01-netcfg.yaml
# Thêm cấu hình MTU
“`
3. Chiến lược backup và khôi phục dữ liệu
a. Sử dụng EBS Snapshots và AMIs
Amazon Elastic Block Store (EBS) Snapshots và Amazon Machine Images (AMIs) là các công cụ cơ bản để sao lưu và khôi phục dữ liệu trên Amazon VPS. Chúng cung cấp cơ chế đơn giản nhưng mạnh mẽ để bảo vệ dữ liệu và cấu hình của bạn.
1. EBS Snapshots là bản sao lưu point-in-time của EBS volumes:
– **Tạo snapshot thủ công**:
“`bash
# Sử dụng AWS CLI để tạo snapshot
aws ec2 create-snapshot –volume-id vol-1234567890abcdef0 –description “Daily backup of my database volume”
“`
Hoặc thông qua AWS Management Console:
1. Điều hướng đến EC2 > Volumes
2. Chọn volume > Actions > Create snapshot
3. Thêm description và tags, rồi nhấp vào Create snapshot
– **Tự động hóa snapshots với Amazon Data Lifecycle Manager (DLM)**:
“`bash
# Tạo policy DLM thông qua AWS CLI
aws dlm create-lifecycle-policy \
–description “Daily backup policy” \
–state ENABLED \
–execution-role-arn arn:aws:iam::123456789012:role/DLMRole \
–policy-details file://policy-details.json
“`
Trong đó policy-details.json có thể như sau:
“`json
{
“ResourceTypes”: [“VOLUME”],
“TargetTags”: [{
“Key”: “backup”,
“Value”: “true”
}],
“Schedules”: [{
“Name”: “Daily Snapshots”,
“CopyTags”: true,
“CreateRule”: {
“Interval”: 24,
“IntervalUnit”: “HOURS”,
“Times”: [“03:00”]
},
“RetainRule”: {
“Count”: 14
}
}]
}
“`
– **Các thực hành tốt nhất cho EBS Snapshots**:
– Tạo snapshots trong thời gian thấp điểm để giảm thiểu tác động hiệu suất
– Tạm dừng I/O hoặc flush buffer trước khi snapshot để đảm bảo tính nhất quán
– Sử dụng AWS Backup để tập trung quản lý snapshots cùng với các loại sao lưu khác
– Luân chuyển snapshots (giữ lại recent daily backups, weekly backups cho lưu trữ dài hạn)
– Sao chép snapshots sang region khác để bảo vệ chống lại thảm họa khu vực
2. Amazon Machine Images (AMIs) là templates chứa cấu hình hoàn chỉnh của một EC2 instance:
– **Tạo AMI từ instance đang chạy**:
“`bash
# Sử dụng AWS CLI để tạo AMI
aws ec2 create-image –instance-id i-1234567890abcdef0 –name “MyServerBackup-$(date +%Y%m%d)” –description “Backup of my server configuration” –no-reboot
“`
Hoặc thông qua AWS Management Console:
1. Chọn instance > Actions > Image and templates > Create image
2. Đặt tên và mô tả
3. Tùy chọn “No reboot” nếu bạn không muốn instance khởi động lại
4. Nhấp vào Create image
– **Tự động hóa việc tạo AMI**:
Bạn có thể tự động hóa việc tạo AMI sử dụng AWS Lambda và CloudWatch Events:
“`python
import boto3
import datetime
def lambda_handler(event, context):
ec2 = boto3.client(‘ec2’)
# Lấy tất cả instances với tag ‘Backup’: ‘true’
instances = ec2.describe_instances(
Filters=[
{‘Name’: ‘tag:Backup’, ‘Values’: [‘true’]}
]
)
# Lấy ngày dưới định dạng YYYY-MM-DD
today = datetime.datetime.now().strftime(‘%Y-%m-%d’)
# Tạo AMI cho mỗi instance
for reservation in instances[‘Reservations’]:
for instance in reservation[‘Instances’]:
instance_id = instance[‘InstanceId’]
# Tạo tên AMI với timestamp
ami_name = f”Backup-{instance_id}-{today}”
# Tạo AMI
image = ec2.create_image(
InstanceId=instance_id,
Name=ami_name,
Description=f”Automated backup of {instance_id}”,
NoReboot=True
)
print(f”Created AMI {image[‘ImageId’]} from instance {instance_id}”)
# Thêm tag Deletion date
ec2.create_tags(
Resources=[image[‘ImageId’]],
Tags=[
{‘Key’: ‘DeleteOn’, ‘Value’: (datetime.datetime.now() + datetime.timedelta(days=30)).strftime(‘%Y-%m-%d’)}
]
)
return “AMI creation completed”
“`
– **Các thực hành tốt nhất cho AMIs**:
– Sử dụng AMIs cho sao lưu toàn hệ thống, bao gồm hệ điều hành, ứng dụng và cấu hình
– Tạo AMIs định kỳ sau các thay đổi cấu hình quan trọng
– Duy trì AMIs ở nhiều region cho khả năng phục hồi sau thảm họa
– Xóa AMIs cũ không sử dụng để giảm chi phí
– Quản lý các phụ thuộc snapshot – khi bạn xóa một AMI, làm rõ liệu có nên xóa các snapshots liên quan
3. Khôi phục từ Snapshots và AMIs:
– **Khôi phục từ snapshot**:
“`bash
# Tạo volume mới từ snapshot
aws ec2 create-volume –availability-zone us-east-1a –snapshot-id snap-1234567890abcdef0
“`
Sau đó gắn volume mới vào instance:
“`bash
aws ec2 attach-volume –volume-id vol-abcdef01234567890 –instance-id i-1234567890abcdef0 –device /dev/sdf
“`
– **Khởi động instance mới từ AMI**:
“`bash
# Khởi chạy instance mới từ AMI
aws ec2 run-instances –image-id ami-1234567890abcdef0 –instance-type t3.medium –key-name MyKeyPair –security-group-ids sg-1234567890abcdef0 –subnet-id subnet-1234567890abcdef0
“`
– **Thực hiện disaster recovery test định kỳ**:
– Kiểm tra quy trình khôi phục từ snapshot và AMI ít nhất mỗi quý
– Đo thời gian cần thiết để khôi phục hoàn toàn
– Thiết lập các tiêu chí thành công rõ ràng cho tests
– Cải thiện quy trình dựa trên kết quả tests
b. Các giải pháp backup tự động và bên thứ ba
Ngoài EBS Snapshots và AMIs, AWS cung cấp các giải pháp sao lưu nâng cao hơn, và bạn cũng có thể tích hợp các công cụ bên thứ ba để tạo chiến lược sao lưu toàn diện cho Amazon VPS của mình.
1. AWS Backup – giải pháp sao lưu tập trung của AWS:
AWS Backup là dịch vụ quản lý sao lưu tập trung, cho phép bạn tự động hóa và quản lý sao lưu trên nhiều dịch vụ AWS bao gồm EC2, EBS, RDS, DynamoDB, và nhiều dịch vụ khác.
– **Thiết lập kế hoạch sao lưu với AWS Backup**:
“`bash
# Tạo backup vault
aws backup create-backup-vault –backup-vault-name “MyBackupVault”
# Tạo backup plan
aws backup create-backup-plan –backup-plan ‘{
“BackupPlanName”: “DailyBackupPlan”,
“Rules”: [
{
“RuleName”: “DailyBackups”,
“TargetBackupVaultName”: “MyBackupVault”,
“ScheduleExpression”: “cron(0 5 ? * * *)”,
“StartWindowMinutes”: 60,
“CompletionWindowMinutes”: 180,
“Lifecycle”: {
“DeleteAfterDays”: 30
}
}
]
}’
“`
Sau đó, gán các tài nguyên cho backup plan:
“`bash
aws backup create-backup-selection –backup-plan-id BACKUP_PLAN_ID –backup-selection ‘{
“SelectionName”: “EC2Selection”,
“IamRoleArn”: “arn:aws:iam::ACCOUNT_ID:role/BackupRole”,
“Resources”: [
“arn:aws:ec2:REGION:ACCOUNT_ID:instance/INSTANCE_ID”
],
“ListOfTags”: [
{
“ConditionType”: “STRINGEQUALS”,
“ConditionKey”: “backup”,
“ConditionValue”: “true”
}
]
}’
“`
Các ưu điểm của AWS Backup:
– Quản lý tập trung tất cả các loại sao lưu
– Giám sát tập trung và báo cáo tuân thủ
– Kiểm soát chính sách RBAC (Role-Based Access Control)
– Mã hóa sao lưu với AWS KMS
– Sao chép sao lưu giữa các vùng
– Khôi phục theo mức point-in-time
2. Các giải pháp cụ thể cho ứng dụng:
– **Sao lưu cơ sở dữ liệu MySQL/MariaDB**:
“`bash
# Tạo script sao lưu
cat > /usr/local/bin/backup_mysql.sh << ‘EOF’ #!/bin/bash TIMESTAMP=$(date +”%Y-%m-%d_%H-%M-%S”) BACKUP_DIR=”/backup/mysql” MYSQL_USER=”backup_user” MYSQL_PASSWORD=”your_secure_password” MYSQL_HOST=”localhost” # Tạo thư mục sao lưu nếu không tồn tại mkdir -p $BACKUP_DIR # Sao lưu từng cơ sở dữ liệu for DB in $(mysql -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e “SHOW DATABASES;” | grep -Ev “(Database|information_schema|performance_schema)”) do mysqldump -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD –single-transaction –routines –triggers –events $DB | gzip > “$BACKUP_DIR/$DB-$TIMESTAMP.sql.gz”
done
# Giữ lại sao lưu trong 30 ngày
find $BACKUP_DIR -type f -name “*.sql.gz” -mtime +30 -delete
EOF
# Cấp quyền thực thi
chmod +x /usr/local/bin/backup_mysql.sh
# Thêm vào crontab
(crontab -l 2>/dev/null; echo “0 2 * * * /usr/local/bin/backup_mysql.sh”) | crontab –
“`
– **Sao lưu cơ sở dữ liệu PostgreSQL**:
“`bash
# Tạo script sao lưu
cat > /usr/local/bin/backup_postgres.sh << ‘EOF’ #!/bin/bash TIMESTAMP=$(date +”%Y-%m-%d_%H-%M-%S”) BACKUP_DIR=”/backup/postgres” POSTGRES_USER=”postgres” POSTGRES_HOST=”localhost” # Tạo thư mục sao lưu nếu không tồn tại mkdir -p $BACKUP_DIR # Sao lưu toàn bộ cơ sở dữ liệu pg_dumpall -h $POSTGRES_HOST -U $POSTGRES_USER | gzip > “$BACKUP_DIR/full-$TIMESTAMP.sql.gz”
# Giữ lại sao lưu trong 30 ngày
find $BACKUP_DIR -type f -name “*.sql.gz” -mtime +30 -delete
EOF
# Cấp quyền thực thi
chmod +x /usr/local/bin/backup_postgres.sh
# Thêm vào crontab
(crontab -l 2>/dev/null; echo “0 2 * * * /usr/local/bin/backup_postgres.sh”) | crontab –
“`
3. Giải pháp sao lưu bên thứ ba:
– **Veeam Backup for AWS**:
– Giải pháp sao lưu toàn diện dành riêng cho AWS
– Hỗ trợ sao lưu EC2, RDS, và VPC
– Cung cấp khôi phục chi tiết và kiểm tra khôi phục
– **N2WS Backup & Recovery (CPM)**:
– Giải pháp tập trung vào sao lưu dựa trên snapshot
– Hỗ trợ sao lưu và khôi phục EC2, RDS, Redshift, Aurora
– Tích hợp sâu với AWS và cung cấp quản lý DR (Disaster Recovery)
– **Commvault**:
– Giải pháp doanh nghiệp đa đám mây, có thể sao lưu AWS, Azure, Google Cloud
– Quản lý dữ liệu tích hợp và bảo vệ
– Cung cấp các tính năng nâng cao như nén, khử trùng, và mã hóa
Cài đặt các giải pháp bên thứ ba thường liên quan đến việc triển khai qua AWS Marketplace:
1. Truy cập AWS Marketplace
2. Tìm kiếm giải pháp sao lưu phù hợp
3. Đăng ký và khởi chạy instance hoặc ứng dụng
4. Cấu hình theo tài liệu nhà cung cấp
4. Kết hợp các giải pháp để hệ thống sao lưu toàn diện:
Một chiến lược sao lưu mạnh mẽ thường kết hợp nhiều phương pháp:
– **3-2-1 Backup Rule**:
– Giữ ít nhất 3 bản sao lưu dữ liệu
– Lưu trữ trên 2 loại phương tiện khác nhau
– Giữ 1 bản sao lưu ngoại tuyến hoặc ở vị trí khác
– **Chiến lược ví dụ**:
1. Daily database dumps stored on EBS volume
2. EBS snapshots made daily and retained for 2 weeks
3. Weekly AMIs for system-level backup, retained for 1 month
4. Database dumps and critical files exported to S3 with lifecycle policies
5. Critical backups copied to a different AWS region
6. Monthly exports to on-premises storage for regulatory compliance
c. Kiểm tra và xác minh backup
Việc tạo bản sao lưu chỉ là một nửa của chiến lược bảo vệ dữ liệu hiệu quả. Các bản sao lưu không được kiểm tra thường xuyên có thể tạo ra cảm giác an toàn sai lầm. Dưới đây là các phương pháp toàn diện để kiểm tra và xác minh bản sao lưu Amazon VPS của bạn:
1. Thiết lập quy trình kiểm tra bản sao lưu định kỳ:
– **Lên lịch kiểm tra thường xuyên**:
– Kiểm tra sao lưu hàng tuần cho hệ thống quan trọng
– Kiểm tra sao lưu hàng tháng cho hệ thống ít quan trọng hơn
– Kiểm tra đầy đủ theo quý, bao gồm mô phỏng khôi phục hoàn toàn
– **Xác định các mục tiêu kiểm tra**:
– Xác minh tính toàn vẹn của sao lưu
– Đo thời gian khôi phục
– Kiểm tra tính chính xác của dữ liệu khôi phục
– Xác nhận rằng tất cả các thành phần quan trọng đều có trong sao lưu
– **Tạo danh sách kiểm tra kiểm tra sao lưu**:
“`plaintext
□ Xác minh sao lưu hình ảnh đĩa đã hoàn thành
□ Kiểm tra sao lưu cơ sở dữ liệu không bị hỏng
□ Xác minh tệp cấu hình đã được bao gồm
□ Kiểm tra tính chính xác của dữ liệu người dùng được khôi phục
□ Đo và ghi lại thời gian khôi phục
□ Xác minh quyền tệp và quyền sở hữu đã được bảo toàn
□ Kiểm tra ứng dụng khởi động với dữ liệu khôi phục
□ Xác nhận các dịch vụ phụ thuộc hoạt động
“`
2. Kiểm tra tính toàn vẹn sao lưu:
– **Xác minh EBS Snapshots**:
“`bash
# Tạo volume mới từ snapshot
aws ec2 create-volume –availability-zone us-east-1a –snapshot-id snap-1234567890abcdef0
# Lấy ID của volume mới tạo
VOLUME_ID=$(aws ec2 describe-volumes –filters “Name=snapshot-id,Values=snap-1234567890abcdef0” –query “Volumes[0].VolumeId” –output text)
# Đính kèm volume vào instance kiểm tra
aws ec2 attach-volume –volume-id $VOLUME_ID –instance-id i-1234567890abcdef0 –device /dev/xvdf
# SSH vào instance và mount volume để kiểm tra
sudo mkdir -p /mnt/verify
sudo mount /dev/xvdf /mnt/verify
sudo ls -la /mnt/verify
sudo umount /mnt/verify
# Xóa volume kiểm tra sau khi hoàn tất
aws ec2 detach-volume –volume-id $VOLUME_ID
aws ec2 delete-volume –volume-id $VOLUME_ID
“`
– **Xác minh AMIs**:
“`bash
# Khởi chạy instance tạm thời từ AMI trong subnet riêng biệt
aws ec2 run-instances –image-id ami-1234567890abcdef0 –instance-type t3.micro –subnet-id subnet-verification –security-group-ids sg-verification –key-name TestKey
# Sau khi kiểm tra, terminate instance kiểm tra
aws ec2 terminate-instances –instance-ids i-verificationinstance
“`
– **Xác minh sao lưu cơ sở dữ liệu**:
“`bash
# Tạo script kiểm tra tính toàn vẹn của sao lưu MySQL
cat > verify_mysql_backup.sh << ‘EOF’
#!/bin/bash
BACKUP_FILE=$1
TEMP_DB=”verification_db”
if [ ! -f “$BACKUP_FILE” ]; then
echo “Backup file not found: $BACKUP_FILE”
exit 1
fi
# Tạo cơ sở dữ liệu tạm thời
mysql -e “CREATE DATABASE IF NOT EXISTS $TEMP_DB;”
# Khôi phục sao lưu vào cơ sở dữ liệu tạm thời
if [[ $BACKUP_FILE == *.gz ]]; then
gunzip < $BACKUP_FILE | mysql $TEMP_DB
else
mysql $TEMP_DB < $BACKUP_FILE fi if [ $? -ne 0 ]; then echo “Backup restore failed!” mysql -e “DROP DATABASE $TEMP_DB;” exit 1 fi # Kiểm tra tính toàn vẹn dữ liệu – thêm kiểm tra cụ thể ở đây # Ví dụ: đếm số hàng trong bảng chính ROWS=$(mysql -N -e “SELECT COUNT(*) FROM $TEMP_DB.users;”) echo “Verified $ROWS rows in users table” # Xóa cơ sở dữ liệu tạm thời mysql -e “DROP DATABASE $TEMP_DB;” echo “Backup verification completed successfully” EOF chmod +x verify_mysql_backup.sh “` 3. Mô phỏng kịch bản khôi phục thảm họa: – **Tạo runbook khôi phục thảm họa**: “`plaintext # Amazon VPS Disaster Recovery Runbook ## Khôi phục từ AMI 1. Điều hướng đến EC2 > AMIs trong AWS Console
2. Chọn AMI gần đây nhất với tag “ProductionBackup”
3. Click “Launch instance from AMI”
4. Chọn instance type phù hợp, tối thiểu t3.medium
5. Chọn subnet trong AZ ưa thích
6. Chọn security group phù hợp
7. Khởi chạy instance và ghi lại ID mới
8. Gán Elastic IP vào instance mới
9. Tiến hành kiểm tra ứng dụng
## Khôi phục cơ sở dữ liệu
1. Tạo volume mới từ snapshot gần đây nhất của cơ sở dữ liệu
2. Đính kèm volume vào instance đã khôi phục
3. Mount volume và sao chép các tệp sao lưu cơ sở dữ liệu
4. Khôi phục cơ sở dữ liệu từ sao lưu
5. Xác minh cơ sở dữ liệu với truy vấn kiểm tra: SELECT COUNT(*) FROM critical_table;
## Kiểm tra ứng dụng
1. Kiểm tra dịch vụ web: systemctl status nginx
2. Xác minh kết nối cơ sở dữ liệu từ ứng dụng
3. Thực hiện kiểm tra đăng nhập
4. Thực hiện giao dịch mẫu
5. Xác minh rằng dữ liệu hiển thị chính xác
“`
– **Thực hiện diễn tập DR (Disaster Recovery) đầy đủ**:
– Lên lịch diễn tập DR mỗi quý trong môi trường kiểm tra
– Đo thời gian khôi phục thực tế (RTO) và điểm khôi phục (RPO)
– So sánh với mục tiêu của tổ chức
– Cải thiện quy trình dựa trên phản hồi từ diễn tập
4. Thiết lập giám sát sao lưu:
– **Sử dụng CloudWatch để giám sát sao lưu**:
“`bash
# Tạo cảnh báo CloudWatch cho sao lưu thất bại
aws cloudwatch put-metric-alarm \
–alarm-name BackupFailureAlarm \
–metric-name RecoveryPointsCompletedCount \
–namespace AWS/Backup \
–statistic Sum \
–period 86400 \
–evaluation-periods 1 \
–threshold 0 \
–comparison-operator LessThanOrEqualToThreshold \
–alarm-actions arn:aws:sns:region:account-id:backup-notifications \
–dimensions Name=BackupVaultName,Value=MyBackupVault
“`
– **Tạo dashboard sao lưu tùy chỉnh**:
– Tạo dashboard CloudWatch với số lượng sao lưu thành công/thất bại
– Hiển thị thời gian sao lưu trung bình
– Theo dõi kích thước sao lưu theo thời gian
– Hiển thị lỗi gần đây
5. Tài liệu về kết quả kiểm tra:
– **Tạo mẫu báo cáo kiểm tra sao lưu**:
“`plaintext
# Báo cáo Kiểm tra Sao lưu
Ngày kiểm tra: [DATE]
Người kiểm tra: [NAME]
Hệ thống: Amazon VPS (i-1234567890abcdef0)
## Sao lưu đã kiểm tra
– AMI: ami-0abc123456
– EBS Snapshot: snap-0abc123456
– Database backup: mysql-backup-2023-08-15.sql.gz
## Kết quả kiểm tra
– Thời gian bắt đầu khôi phục: 14:25 UTC
– Thời gian hoàn thành khôi phục: 14:52 UTC
– Tổng thời gian khôi phục: 27 phút
– Mục tiêu RTO: 30 phút (Đáp ứng: ✓)
– Tổng thời gian sao lưu mất: 6 giờ
– Mục tiêu RPO: 24 giờ (Đáp ứng: ✓)
## Kiểm tra ứng dụng
– Ứng dụng khởi động thành công: ✓
– Đăng nhập người dùng thành công: ✓
– Giao dịch mẫu hoàn thành: ✓
– Tính nhất quán của dữ liệu được xác minh: ✓
## Vấn đề phát hiện
– Thiếu tệp cấu hình nginx trong sao lưu (được giải quyết thông qua cập nhật quy trình sao lưu)
– Khôi phục cơ sở dữ liệu chậm hơn dự kiến (đề xuất: tối ưu hóa quy trình khôi phục)
## Hành động theo dõi
– Cập nhật script sao lưu để bao gồm tệp cấu hình nginx
– Nghiên cứu các tùy chọn khôi phục cơ sở dữ liệu nhanh hơn
– Lên lịch kiểm tra tiếp theo vào [DATE]
“`
IV. Tối ưu chi phí và quản lý tài nguyên
1. Hiểu và quản lý chi phí AWS
a. Cơ cấu định giá của Amazon EC2
Hiểu rõ cơ cấu định giá của Amazon EC2 là bước đầu tiên để quản lý chi phí một cách hiệu quả. Amazon EC2 sử dụng một mô hình định giá linh hoạt với nhiều tùy chọn khác nhau để phù hợp với nhu cầu và ngân sách của từng khách hàng.
1. Các mô hình định giá chính của EC2:
– **On-Demand Instances**: Mô hình trả tiền theo giờ/giây mà không cần cam kết trước. Đây là mô hình đơn giản nhất nhưng cũng đắt nhất trong dài hạn.
– Tính theo giờ hoặc giây (tối thiểu 60 giây)
– Không có phí cam kết hoặc trả trước
– Phù hợp cho workload không thể đoán trước, ứng dụng ngắn hạn, và giai đoạn phát triển/kiểm thử
– **Reserved Instances (RI)**: Cam kết sử dụng trong một năm hoặc ba năm để đổi lấy mức giảm giá đáng kể (lên đến 72% so với On-Demand).
– Standard RI: Giảm giá lớn nhất nhưng ít linh hoạt nhất
– Convertible RI: Linh hoạt hơn, cho phép thay đổi thuộc tính instance, nhưng giảm giá ít hơn
– Scheduled RI: Dành cho workload định kỳ, chạy theo lịch cố định
– Tùy chọn thanh toán: All Upfront, Partial Upfront, hoặc No Upfront
– **Spot Instances**: Sử dụng công suất EC2 dư thừa với mức giảm giá lên đến 90% so với On-Demand, nhưng có thể bị gián đoạn khi AWS cần lấy lại công suất.
– Phù hợp cho workload chịu được gián đoạn: xử lý dữ liệu, mã hóa video, máy học
– Giá thay đổi theo cung và cầu
– AWS có thể thu hồi với thông báo trước 2 phút
– **Savings Plans**: Cam kết sử dụng một lượng chi tiêu USD/giờ cố định trong một hoặc ba năm để đổi lấy mức giảm giá, cung cấp sự linh hoạt hơn so với RI.
– Compute Savings Plans: Áp dụng cho EC2, Fargate, và Lambda
– EC2 Instance Savings Plans: Chỉ áp dụng cho EC2, nhưng giảm giá cao hơn
2. Các chi phí bổ sung cần xem xét:
– **Chi phí lưu trữ**: EBS volumes được tính phí riêng dựa trên:
– Loại volume (gp2/gp3, io1/io2, st1, sc1)
– Dung lượng được cung cấp
– IOPS và throughput (cho io1/io2 và gp3)
– Snapshots EBS cũng được tính phí dựa trên dung lượng lưu trữ
– **Chi phí truyền dữ liệu**:
– Dữ liệu vào EC2 (inbound) thường miễn phí
– Dữ liệu ra EC2 (outbound) được tính phí theo GB:
– Giữa AZs trong cùng region
– Giữa regions
– Đến internet
– Dữ liệu giữa các instances trong cùng AZ qua private IP thường miễn phí
– **Elastic IP (EIP)**: Miễn phí khi đang được sử dụng và gắn với một instance đang chạy, nhưng bị tính phí khi:
– EIP không được gắn với instance nào
– EIP được gắn với instance đang dừng
– Có nhiều hơn một EIP gắn với cùng một instance
– **Chi phí khác**:
– Load Balancers: Tính phí theo giờ + dữ liệu xử lý
– NAT Gateways: Tính phí theo giờ + dữ liệu xử lý
– AMIs tùy chỉnh: Lưu trữ được tính phí như EBS snapshots
3. Cách ước tính chi phí:
– **AWS Pricing Calculator**:
1. Truy cập https://calculator.aws/
2. Thêm các dịch vụ EC2, EBS, và các dịch vụ liên quan khác
3. Cấu hình các tham số như loại instance, region, thời gian sử dụng
4. Xem chi phí ước tính theo tháng/năm
– **Ví dụ ước tính chi phí cho website vừa và nhỏ**:
– 1 EC2 t3.medium instance (2 vCPU, 4GB RAM): ~$30/tháng (On-Demand)
– 1 EBS gp3 volume 50GB: ~$5/tháng
– Truyền dữ liệu ra 500GB/tháng: ~$45/tháng
– Elastic IP: $0 (khi được sử dụng)
– Tổng cộng: ~$80/tháng
Lưu ý rằng mức giá thực tế có thể thay đổi theo region và thời gian, do đó luôn kiểm tra AWS Pricing Calculator để có ước tính chính xác nhất.
b. Sử dụng AWS Cost Explorer và AWS Budgets
Để quản lý chi phí AWS hiệu quả, việc giám sát và phân tích chi tiêu thường xuyên là rất quan trọng. AWS cung cấp các công cụ mạnh mẽ như Cost Explorer và AWS Budgets để giúp bạn hiểu rõ và kiểm soát chi phí của mình.
1. AWS Cost Explorer – Phân tích và trực quan hóa chi phí:
Cost Explorer là công cụ cho phép bạn trực quan hóa, hiểu và quản lý chi phí AWS theo thời gian. Dưới đây là cách sử dụng hiệu quả:
– **Truy cập và thiết lập cơ bản**:
1. Đăng nhập vào AWS Management Console
2. Điều hướng đến “Billing Dashboard” > “Cost Explorer”
3. Kích hoạt Cost Explorer nếu chưa được kích hoạt (có thể mất 24 giờ để dữ liệu khả dụng)
– **Phân tích chi phí theo dịch vụ**:
1. Từ giao diện Cost Explorer, chọn “Group by” > “Service”
2. Thiết lập phạm vi thời gian (ví dụ: 3 tháng trước)
3. Xem biểu đồ phân tích chi phí theo dịch vụ để xác định dịch vụ nào tiêu tốn nhiều nhất
– **Phân tích chi phí EC2 chi tiết**:
1. Lọc chi phí chỉ cho “EC2-Instances” và “EC2-Other”
2. Nhóm theo “Instance Type” để xem loại instance nào tiêu tốn nhiều nhất
3. Nhóm theo “Purchase Option” để phân tích chi phí giữa On-Demand, Reserved, và Spot instances
4. Nhóm theo “Region” để xác định region nào đắt nhất
– **Phân tích xu hướng**:
1. Thiết lập phạm vi thời gian dài hơn (6-12 tháng)
2. Quan sát xu hướng tăng/giảm chi phí
3. Xác định các điểm bất thường trong chi phí
– **Tạo và lưu báo cáo tùy chỉnh**:
“`bash
# Sử dụng AWS CLI để tạo báo cáo Cost Explorer
aws ce get-cost-and-usage \
–time-period Start=2023-01-01,End=2023-07-31 \
–granularity MONTHLY \
–metrics “BlendedCost” “UnblendedCost” “UsageQuantity” \
–group-by Type=DIMENSION,Key=SERVICE Type=DIMENSION,Key=INSTANCE_TYPE
“`
2. AWS Budgets – Thiết lập cảnh báo và kiểm soát chi phí:
AWS Budgets cho phép bạn thiết lập ngân sách và nhận thông báo khi chi phí vượt quá ngưỡng xác định. Đây là cách thiết lập và sử dụng hiệu quả:
– **Tạo ngân sách chi phí cơ bản**:
1. Trong AWS Management Console, điều hướng đến “Billing Dashboard” > “Budgets”
2. Chọn “Create budget” > “Cost budget”
3. Đặt tên (ví dụ: “Monthly EC2 Budget”)
4. Chọn thời hạn (hàng tháng) và thời gian làm mới (hàng ngày)
5. Đặt số tiền ngân sách (ví dụ: $100)
– **Tạo ngân sách có lọc**:
1. Chọn “Create budget”
2. Trong mục “Filters”, thêm bộ lọc:
– Service: EC2
– Region: us-east-1 (hoặc region của bạn)
– Tag: Environment: Production
3. Đặt số tiền ngân sách dựa trên chi phí lịch sử
– **Thiết lập cảnh báo ngân sách**:
1. Trong quá trình tạo ngân sách, thêm thông báo
2. Thiết lập ngưỡng cảnh báo (ví dụ: 80% ngân sách)
3. Thêm địa chỉ email để nhận thông báo
4. Tùy chọn: Thêm chủ đề SNS để tích hợp với các hệ thống khác
“`bash
# Sử dụng AWS CLI để tạo ngân sách và cảnh báo
aws budgets create-budget \
–account-id 123456789012 \
–budget file://budget.json \
–notifications-with-subscribers file://notifications.json
“`
Trong đó budget.json có thể như:
“`json
{
“BudgetName”: “EC2 Monthly Budget”,
“BudgetLimit”: {
“Amount”: “100”,
“Unit”: “USD”
},
“CostFilters”: {
“Service”: [“Amazon Elastic Compute Cloud – Compute”]
},
“CostTypes”: {
“IncludeTax”: true,
“IncludeSubscription”: true,
“UseBlended”: false,
“IncludeRefund”: false,
“IncludeCredit”: false,
“IncludeUpfront”: true,
“IncludeRecurring”: true,
“IncludeOtherSubscription”: true,
“IncludeSupport”: true,
“IncludeDiscount”: true,
“UseAmortized”: false
},
“TimeUnit”: “MONTHLY”,
“TimePeriod”: {
“Start”: 1627776000,
“End”: 3706473600
},
“BudgetType”: “COST”
}
“`
3. Thực hành tốt nhất cho giám sát và quản lý chi phí:
– **Thiết lập cấu trúc tài khoản và gắn thẻ hiệu quả**:
– Thiết lập chiến lược gắn thẻ nhất quán (ví dụ: Environment, Project, Department)
– Áp dụng chính sách gắn thẻ bắt buộc thông qua AWS Organizations
– Sử dụng Cost Allocation Tags để phân bổ chi phí
– **Tạo bảng điều khiển chi phí tùy chỉnh**:
– Tạo bảng điều khiển CloudWatch với các chỉ số chi phí
– Tích hợp dữ liệu chi phí với các hệ thống BI như Amazon QuickSight
– **Thiết lập quy trình đánh giá chi phí định kỳ**:
– Lên lịch đánh giá chi phí hàng tuần/hàng tháng
– Thiết lập KPIs chi phí (ví dụ: chi phí/người dùng, chi phí/giao dịch)
– Xác định các cơ hội tối ưu hóa chi phí dựa trên dữ liệu
– **Tự động hóa hành động dựa trên cảnh báo ngân sách**:
– Sử dụng AWS Lambda để tự động phản hồi khi chi phí vượt ngưỡng
– Tích hợp với các công cụ chat như Slack để thông báo về cảnh báo chi phí
c. Chiến lược giảm chi phí
Tối ưu hóa chi phí AWS là một quá trình liên tục đòi hỏi sự kết hợp giữa chiến lược, công cụ và thực hành tốt nhất. Dưới đây là các chiến lược giảm chi phí hiệu quả cho Amazon VPS:
1. Tối ưu hóa lựa chọn instance:
– **Right-sizing instances**: Chọn kích thước instance phù hợp nhất với nhu cầu thực tế:
“`bash
# Sử dụng CloudWatch để thu thập số liệu sử dụng
aws cloudwatch get-metric-statistics \
–namespace AWS/EC2 \
–metric-name CPUUtilization \
–dimensions Name=InstanceId,Value=i-1234567890abcdef0 \
–statistics Maximum Average \
–start-time 2023-07-01T00:00:00Z \
–end-time 2023-07-31T23:59:59Z \
–period 86400
“`
– Nếu CPU thường xuyên dưới 20%, xem xét giảm cỡ instance
– Nếu CPU thường xuyên trên 80%, xem xét tăng cỡ instance hoặc thêm instance
– Sử dụng AWS Compute Optimizer để có đề xuất tự động về right-sizing
– **Chuyển sang instance thế hệ mới**: Instance thế hệ mới thường cung cấp hiệu suất tốt hơn với giá tương tự hoặc thấp hơn
– Ví dụ: chuyển từ t2.medium sang t3.medium có thể tăng hiệu suất lên đến 30%
– Xem xét các instance dựa trên Graviton (ARM) như t4g, c6g, r6g có thể tiết kiệm 20% với hiệu suất tương đương
– **Sử dụng máy chủ chuyên dụng khi cần thiết**: Các trường hợp tuân thủ đặc biệt có thể yêu cầu máy chủ vật lý chuyên dụng
– Dedicated Instances: trả phí bổ sung cho phần cứng chuyên dụng
– Dedicated Hosts: cho phép kiểm soát chính xác việc đặt instance và tối ưu hóa giấy phép phần mềm
2. Tận dụng các tùy chọn mua hàng tiết kiệm chi phí:
– **Reserved Instances (RI)**: Cho workload ổn định và có thể dự đoán:
“`bash
# Xem đề xuất RI bằng AWS CLI
aws ce get-reservation-purchase-recommendation \
–service “Amazon Elastic Compute Cloud – Compute” \
–lookback-period SIXTY_DAYS
“`
– Tiêu chuẩn 1 năm: tiết kiệm ~40% so với On-Demand
– Tiêu chuẩn 3 năm: tiết kiệm ~60% so với On-Demand
– Chiến lược thanh toán: All Upfront cung cấp mức giảm giá cao nhất
– **Savings Plans**: Cho sự linh hoạt lớn hơn với mức tiết kiệm tương tự như RI:
“`bash
# Xem đề xuất Savings Plans
aws ce get-savings-plans-purchase-recommendation \
–lookback-period SIXTY_DAYS \
–term THREE_YEARS \
–payment-option ALL_UPFRONT
“`
– Compute Savings Plans: linh hoạt nhất, áp dụng trên mọi region, family, kích thước
– EC2 Instance Savings Plans: mức tiết kiệm cao hơn, nhưng chỉ cho family cụ thể trong region cụ thể
– Xem xét kết hợp 70% cam kết qua Savings Plans và giữ 30% linh hoạt
– **Spot Instances**: Cho workload chịu được gián đoạn:
“`bash
# Kiểm tra lịch sử giá spot cho một loại instance
aws ec2 describe-spot-price-history \
–instance-types t3.medium \
–start-time 2023-07-01T00:00:00Z \
–end-time 2023-07-31T23:59:59Z \
–product-description “Linux/UNIX”
“`
– Sử dụng nhóm máy chủ spot với nhiều loại instance để tăng tính sẵn có
– Triển khai các chiến lược xử lý gián đoạn: checkpointing, đồng bộ hóa dữ liệu
– Sử dụng cho workload phi quan trọng, xử lý hàng loạt, hoặc môi trường phát triển/kiểm thử
3. Tối ưu hóa vòng đời instance:
– **Tự động hóa lịch trình start/stop instance**:
“`bash
# Tạo một hàm Lambda để dừng các instance không sản xuất sau giờ làm việc
cat << ‘EOF’ > stop_instances.py
import boto3
def lambda_handler(event, context):
ec2 = boto3.client(‘ec2’)
# Lấy tất cả các instance có tag Environment=Development
response = ec2.describe_instances(
Filters=[
{‘Name’: ‘tag:Environment’, ‘Values’: [‘Development’]},
{‘Name’: ‘instance-state-name’, ‘Values’: [‘running’]}
]
)
instance_ids = []
for reservation in response[‘Reservations’]:
for instance in reservation[‘Instances’]:
instance_ids.append(instance[‘InstanceId’])
if instance_ids:
print(f”Stopping instances: {instance_ids}”)
ec2.stop_instances(InstanceIds=instance_ids)
return {
‘stopped_instances’: instance_ids
}
EOF
# Sau đó tạo và cấu hình hàm Lambda để chạy vào cuối ngày làm việc
“`
– **Sử dụng Auto Scaling dựa trên lịch trình**:
“`bash
# Tạo lịch trình Auto Scaling cho giờ làm việc
aws autoscaling put-scheduled-update-group-action \
–auto-scaling-group-name my-asg \
–scheduled-action-name scale-up \
–recurrence “0 8 * * MON-FRI” \
–min-size 2 \
–max-size 10 \
–desired-capacity 2
# Tạo lịch trình Auto Scaling cho giờ không làm việc
aws autoscaling put-scheduled-update-group-action \
–auto-scaling-group-name my-asg \
–scheduled-action-name scale-down \
–recurrence “0 18 * * MON-FRI” \
–min-size 0 \
–max-size 0 \
–desired-capacity 0
“`
– **Theo dõi và xóa tài nguyên không sử dụng**:
– EBS volumes không được đính kèm
– Elastic IPs không được sử dụng
– Snapshots cũ không cần thiết
– AMIs lỗi thời
4. Tối ưu hóa lưu trữ và truyền dữ liệu:
– **Lựa chọn loại volume EBS tối ưu**:
– Chuyển sang gp3 từ gp2 để tiết kiệm ~20% với cùng hiệu năng
– Sử dụng st1 hoặc sc1 cho dữ liệu truy cập không thường xuyên
– Thiết lập IOPS và throughput phù hợp với nhu cầu thực tế thay vì quá mức cần thiết
– **Tối ưu hóa truyền dữ liệu**:
– Sử dụng CloudFront để giảm chi phí truyền dữ liệu ra internet
– Tận dụng VPC Endpoints cho các dịch vụ AWS (S3, DynamoDB) để tránh phí NAT Gateway
– Tổng hợp dữ liệu trước khi chuyển ra khỏi AWS
– Ưu tiên giao tiếp trong cùng AZ khi có thể
5. Các chiến lược tiên tiến:
– **Serverless khi có thể**: Chuyển các workload phù hợp sang Lambda hoặc Fargate để chỉ trả tiền cho thời gian thực thi
– Các API có tải không đều
– Xử lý batch định kỳ
– Quá trình ETL
– **Tận dụng các dịch vụ AWS hiệu quả về chi phí**:
– Amazon RDS thay vì tự quản lý cơ sở dữ liệu trên EC2
– Amazon Aurora Serverless cho các cơ sở dữ liệu biến động cao
– Amazon S3 Intelligent-Tiering cho lưu trữ dữ liệu tối ưu tự động
– **Phát triển văn hóa FinOps**: Tạo trách nhiệm chi phí trong nhóm kỹ thuật:
– Gán ngân sách cho từng nhóm/dự án
– Giáo dục các nhà phát triển về tác động chi phí của quyết định kiến trúc
– Thưởng cho các sáng kiến tối ưu hóa chi phí
2. Tự động hóa quản lý Amazon VPS
a. Auto Scaling và Elastic Load Balancing
Auto Scaling và Elastic Load Balancing là hai dịch vụ mạnh mẽ của AWS giúp tự động hóa việc quản lý và mở rộng Amazon VPS của bạn, đảm bảo khả năng phục vụ cao và tối ưu hóa chi phí. Chúng hoạt động cùng nhau để tạo ra một hệ thống linh hoạt, tự điều chỉnh theo nhu cầu thực tế.
1. Auto Scaling – Tự động điều chỉnh số lượng instance:
Auto Scaling giúp đảm bảo bạn có đúng số lượng Amazon VPS cần thiết để xử lý tải ứng dụng. Nó tự động tăng số lượng instance trong thời kỳ cao điểm để duy trì hiệu suất, và giảm số lượng trong thời kỳ thấp điểm để tối ưu hóa chi phí.
– **Thiết lập Auto Scaling Group cơ bản**:
“`bash
# Tạo launch template
aws ec2 create-launch-template \
–launch-template-name “my-template” \
–version-description “Initial version” \
–launch-template-data ‘{
“ImageId”: “ami-0abcdef1234567890”,
“InstanceType”: “t3.micro”,
“KeyName”: “my-key-pair”,
“SecurityGroupIds”: [“sg-0abcdef1234567890”],
“UserData”: “IyEvYmluL2Jhc2gKZWNobyAiSGVsbG8gV29ybGQiID4gL3RtcC9oZWxsby50eHQ=”
}’
# Tạo Auto Scaling Group
aws autoscaling create-auto-scaling-group \
–auto-scaling-group-name “my-asg” \
–launch-template LaunchTemplateName=my-template,Version=’$Latest’ \
–min-size 1 \
–max-size 5 \
–desired-capacity 2 \
–vpc-zone-identifier “subnet-0abcdef1234567890,subnet-1abcdef1234567890” \
–health-check-type ELB \
–health-check-grace-period 300
“`
– **Cấu hình Auto Scaling dựa trên metrics**:
“`bash
# Tạo scaling policy dựa trên CPU
aws autoscaling put-scaling-policy \
–auto-scaling-group-name “my-asg” \
–policy-name “cpu-scale-out” \
–policy-type “TargetTrackingScaling” \
–target-tracking-configuration ‘{
“PredefinedMetricSpecification”: {
“PredefinedMetricType”: “ASGAverageCPUUtilization”
},
“TargetValue”: 70.0,
“DisableScaleIn”: false
}’
“`
– **Thiết lập chính sách mở rộng và thu hẹp tùy chỉnh**:
“`bash
# Tạo CloudWatch Alarm để theo dõi CPU cao
aws cloudwatch put-metric-alarm \
–alarm-name “high-cpu-alarm” \
–alarm-description “Alarm when CPU exceeds 80%” \
–metric-name “CPUUtilization” \
–namespace “AWS/EC2” \
–statistic “Average” \
–dimensions “Name=AutoScalingGroupName,Value=my-asg” \
–period 300 \
–evaluation-periods 2 \
–threshold 80 \
–comparison-operator “GreaterThanThreshold” \
–alarm-actions “arn:aws:autoscaling:region:account-id:scalingPolicy:policy-id:autoScalingGroupName/my-asg:policyName/scale-out-policy”
# Tạo chính sách mở rộng
aws autoscaling put-scaling-policy \
–auto-scaling-group-name “my-asg” \
–policy-name “scale-out-policy” \
–scaling-adjustment 1 \
–adjustment-type “ChangeInCapacity” \
–cooldown 300
“`
– **Lịch trình Auto Scaling cho các mẫu tải có thể dự đoán**:
“`bash
# Tăng công suất vào thời điểm cao điểm đã biết
aws autoscaling put-scheduled-update-group-action \
–auto-scaling-group-name “my-asg” \
–scheduled-action-name “increase-capacity-morning-peak” \
–recurrence “0 8 * * MON-FRI” \
–min-size 3 \
–max-size 10 \
–desired-capacity 4
“`
2. Elastic Load Balancing – Phân phối lưu lượng truy cập:
Elastic Load Balancing (ELB) tự động phân phối lưu lượng truy cập đến ứng dụng của bạn trên nhiều instance EC2, cải thiện khả năng chịu lỗi và khả năng mở rộng của ứng dụng. AWS cung cấp ba loại load balancer:
– **Application Load Balancer (ALB)**: Tốt nhất cho HTTP/HTTPS, cung cấp định tuyến dựa trên nội dung và hỗ trợ WebSocket
– **Network Load Balancer (NLB)**: Hiệu suất cực cao, độ trễ thấp, dành cho TCP/UDP
– **Classic Load Balancer**: Thế hệ cũ, chỉ nên sử dụng cho ứng dụng đã xây dựng trên EC2-Classic
– **Thiết lập Application Load Balancer**:
“`bash
# Tạo ALB
aws elbv2 create-load-balancer \
–name “my-alb” \
–subnets “subnet-0abcdef1234567890” “subnet-1abcdef1234567890” \
–security-groups “sg-0abcdef1234567890” \
–scheme “internet-facing”
# Tạo target group
aws elbv2 create-target-group \
–name “my-targets” \
–protocol “HTTP” \
–port 80 \
–vpc-id “vpc-0abcdef1234567890” \
–health-check-protocol “HTTP” \
–health-check-path “/health” \
–health-check-interval-seconds 30 \
–health-check-timeout-seconds 5 \
–healthy-threshold-count 2 \
–unhealthy-threshold-count 2
# Tạo listener
aws elbv2 create-listener \
–load-balancer-arn “arn:aws:elasticloadbalancing:region:account-id:loadbalancer/app/my-alb/load-balancer-id” \
–protocol “HTTP” \
–port 80 \
–default-actions “Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:region:account-id:targetgroup/my-targets/target-group-id”
“`
– **Tích hợp ALB với Auto Scaling Group**:
“`bash
# Cập nhật Auto Scaling Group để sử dụng target group
aws autoscaling attach-load-balancer-target-groups \
–auto-scaling-group-name “my-asg” \
–target-group-arns “arn:aws:elasticloadbalancing:region:account-id:targetgroup/my-targets/target-group-id”
“`
– **Cấu hình SSL/TLS trên Load Balancer**:
“`bash
# Thêm chứng chỉ SSL vào AWS Certificate Manager
aws acm import-certificate \
–certificate file://certificate.pem \
–private-key file://private-key.pem \
–certificate-chain file://certificate-chain.pem
# Thêm HTTPS listener với chứng chỉ SSL
aws elbv2 create-listener \
–load-balancer-arn “arn:aws:elasticloadbalancing:region:account-id:loadbalancer/app/my-alb/load-balancer-id” \
–protocol “HTTPS” \
–port 443 \
–certificates “CertificateArn=arn:aws:acm:region:account-id:certificate/certificate-id” \
–ssl-policy “ELBSecurityPolicy-2016-08” \
–default-actions “Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:region:account-id:targetgroup/my-targets/target-group-id”
“`
3. Các trường hợp sử dụng và cấu hình nâng cao:
– **Triển khai Blue/Green với ALB và Auto Scaling**:
“`bash
# Tạo target group mới cho phiên bản “green”
aws elbv2 create-target-group \
–name “green-targets” \
–protocol “HTTP” \
–port 80 \
–vpc-id “vpc-0abcdef1234567890”
# Tạo Auto Scaling Group mới với phiên bản cập nhật
aws autoscaling create-auto-scaling-group \
–auto-scaling-group-name “green-asg” \
–launch-template LaunchTemplateName=green-template,Version=’$Latest’ \
–min-size 1 \
–max-size 5 \
–desired-capacity 2 \
–target-group-arns “arn:aws:elasticloadbalancing:region:account-id:targetgroup/green-targets/target-group-id” \
–vpc-zone-identifier “subnet-0abcdef1234567890,subnet-1abcdef1234567890”
# Sau khi kiểm tra, chuyển sang phiên bản mới
aws elbv2 modify-listener \
–listener-arn “arn:aws:elasticloadbalancing:region:account-id:listener/app/my-alb/load-balancer-id/listener-id” \
–default-actions “Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:region:account-id:targetgroup/green-targets/target-group-id”
“`
– **Auto Scaling với nhiều metric tùy chỉnh**:
“`bash
# Tạo metric tùy chỉnh trong CloudWatch
aws cloudwatch put-metric-data \
–namespace “MyApplication” \
–metric-name “RequestsPerInstance” \
–dimensions “AutoScalingGroupName=my-asg” \
–value 42
# Tạo cảnh báo dựa trên metric tùy chỉnh
aws cloudwatch put-metric-alarm \
–alarm-name “high-requests-alarm” \
–namespace “MyApplication” \
–metric-name “RequestsPerInstance” \
–dimensions “Name=AutoScalingGroupName,Value=my-asg” \
–statistic “Average” \
–period 60 \
–threshold 100 \
–comparison-operator “GreaterThanThreshold” \
–evaluation-periods 3 \
–alarm-actions “arn:aws:autoscaling:region:account-id:scalingPolicy:policy-id:autoScalingGroupName/my-asg:policyName/scale-out-custom-policy”
“`
– **Predictive Scaling với Auto Scaling**:
“`bash
# Bật predictive scaling
aws autoscaling put-scaling-policy \
–auto-scaling-group-name “my-asg” \
–policy-name “predictive-scaling-policy” \
–policy-type “PredictiveScaling” \
–predictive-scaling-configuration ‘{
“MetricSpecifications”: [
{
“TargetValue”: 70,
“PredefinedMetricPairSpecification”: {
“PredefinedMetricType”: “ASGCPUUtilization”
}
}
],
“Mode”: “ForecastAndScale”,
“SchedulingBufferTime”: 300
}’
“`
b. Quản lý cấu hình với AWS Systems Manager
AWS Systems Manager là một dịch vụ quản lý giúp bạn tự động hóa các tác vụ quản lý và duy trì các tiêu chuẩn bảo mật trên cơ sở hạ tầng AWS của mình. Dịch vụ này cung cấp một bộ công cụ toàn diện để quản lý Amazon VPS một cách hiệu quả, từ thu thập thông tin chi tiết về inventory đến tự động hóa việc vá lỗi và cấu hình.
1. Thiết lập và cấu hình cơ bản:
– **Cài đặt SSM Agent**: SSM Agent đã được cài đặt sẵn trên hầu hết các AMI của AWS, nhưng bạn có thể cần cài đặt thủ công trên một số hệ thống:
“`bash
# Amazon Linux 2
sudo yum install -y amazon-ssm-agent
sudo systemctl enable amazon-ssm-agent
sudo systemctl start amazon-ssm-agent
# Ubuntu
sudo snap install amazon-ssm-agent –classic
sudo systemctl enable snap.amazon-ssm-agent.amazon-ssm-agent.service
sudo systemctl start snap.amazon-ssm-agent.amazon-ssm-agent.service
“`
– **Cấu hình IAM Role cho Systems Manager**: Instance cần có IAM role với quyền phù hợp:
“`json
{
“Version”: “2012-10-17”,
“Statement”: [
{
“Effect”: “Allow”,
“Action”: [
“ssm:UpdateInstanceInformation”,
“ssmmessages:CreateControlChannel”,
“ssmmessages:CreateDataChannel”,
“ssmmessages:OpenControlChannel”,
“ssmmessages:OpenDataChannel”
],
“Resource”: “*”
}
]
}
“`
2. Quản lý inventory và phát hiện cấu hình:
Systems Manager Inventory thu thập thông tin về ứng dụng, dịch vụ, cấu hình hệ thống, và hơn thế nữa từ các instance của bạn.
– **Thiết lập thu thập inventory**:
“`bash
# Bật thu thập inventory thông qua AWS CLI
aws ssm create-association \
–name “AWS-GatherSoftwareInventory” \
–targets “Key=instanceids,Values=i-1234567890abcdef0,i-0abcdef1234567890” \
–schedule-expression “rate(1 day)” \
–parameters “applications=Enabled,awsComponents=Enabled,networkConfig=Enabled,windowsUpdates=Enabled,instanceDetailedInformation=Enabled,services=Enabled”
“`
– **Truy vấn dữ liệu inventory**:
“`bash
# Tìm tất cả instance chạy Apache
aws ssm get-inventory \
–filters “Key=AWS:Application.Name,Values=httpd,Type=Equal”
# Xuất dữ liệu inventory cho phân tích
aws ssm get-inventory > inventory.json
“`
3. Tự động hóa các tác vụ quản lý với Run Command:
Run Command cho phép bạn thực thi lệnh hoặc script trên nhiều instance mà không cần SSH/RDP trực tiếp vào.
– **Thực thi lệnh đơn giản**:
“`bash
# Cập nhật tất cả instance Amazon Linux trong production environment
aws ssm send-command \
–document-name “AWS-RunShellScript” \
–targets “Key=tag:Environment,Values=Production” \
–parameters “commands=[‘yum update -y’]” \
–comment “Monthly security updates”
“`
– **Tạo và thực thi tài liệu tùy chỉnh**:
“`bash
# Tạo tài liệu SSM để cấu hình web server
cat > configure-webserver.json << ‘EOF’ { “schemaVersion”: “2.2”, “description”: “Configure Apache web server”, “parameters”: { “port”: { “type”: “String”, “default”: “80”, “description”: “Port for Apache to listen on” } }, “mainSteps”: [ { “action”: “aws:runShellScript”, “name”: “installAndConfigure”, “inputs”: { “runCommand”: [ “yum install -y httpd”, “sed -i ‘s/Listen 80/Listen {{port}}/g’ /etc/httpd/conf/httpd.conf”, “systemctl enable httpd”, “systemctl start httpd” ] } } ] } EOF # Tạo tài liệu trong Systems Manager aws ssm create-document \ –name “ConfigureWebServer” \ –content file://configure-webserver.json \ –document-type “Command” # Thực thi tài liệu aws ssm send-command \ –document-name “ConfigureWebServer” \ –targets “Key=tag:Role,Values=WebServer” \ –parameters “port=8080” “` 4. Quản lý vá lỗi tự động: Patch Manager tự động hóa quy trình vá lỗi cho các instance, giúp duy trì các tiêu chuẩn bảo mật và tuân thủ. – **Thiết lập baseline vá lỗi**: “`bash # Tạo baseline vá lỗi cho môi trường production aws ssm create-patch-baseline \ –name “ProductionServers-Critical” \ –operating-system “AMAZON_LINUX_2” \ –approval-rules “PatchRules=[{PatchFilterGroup={PatchFilters=[{Key=CLASSIFICATION,Values=Security},{Key=SEVERITY,Values=Critical}]},ApproveAfterDays=7}]” \ –description “Critical security patches for Production servers” \ –tags “Key=Environment,Value=Production” “` – **Tạo cửa sổ bảo trì cho vá lỗi**: “`bash # Tạo cửa sổ bảo trì hàng tuần aws ssm create-maintenance-window \ –name “Weekly-Patch-Window” \ –schedule “cron(0 2 ? * SUN *)” \ –duration 3 \ –cutoff 1 \ –allow-unassociated-targets \ –tags “Key=Purpose,Value=Patching” # Đăng ký targets cho cửa sổ bảo trì aws ssm register-target-with-maintenance-window \ –window-id “mw-0abcdef1234567890” \ –resource-type “INSTANCE” \ –targets “Key=tag:Environment,Values=Production” # Đăng ký task vá lỗi aws ssm register-task-with-maintenance-window \ –window-id “mw-0abcdef1234567890” \ –task-arn “AWS-RunPatchBaseline” \ –service-role-arn “arn:aws:iam::account-id:role/MaintenanceWindowRole” \ –task-type “RUN_COMMAND” \ –task-parameters “{\”Operation\”:{\”Values\”:[\”Install\”]},\”RebootOption\”:{\”Values\”:[\”RebootIfNeeded\”]}}” \ –priority 1 \ –max-concurrency “50%” \ –max-errors “25%” “` 5. Quản lý cấu hình với State Manager: State Manager đảm bảo rằng các instance duy trì trạng thái cấu hình mong muốn và tự động khắc phục mọi sai lệch. – **Tạo association để duy trì cấu hình**: “`bash # Đảm bảo dịch vụ web luôn được cài đặt và chạy aws ssm create-association \ –name “AWS-RunShellScript” \ –targets “Key=tag:Role,Values=WebServer” \ –parameters “commands=[‘if ! systemctl is-active –quiet httpd; then yum install -y httpd && systemctl start httpd && systemctl enable httpd; fi’]” \ –schedule-expression “rate(1 hour)” \ –association-name “EnsureWebServerRunning” “` – **Cấu hình tệp với State Manager**: “`bash # Tạo tài liệu quản lý tệp cấu hình cat > manage-config-file.json << ‘EOF’ { “schemaVersion”: “2.2”, “description”: “Manage configuration file”, “parameters”: { “configContent”: { “type”: “String”, “description”: “Content to place in config file” }, “configPath”: { “type”: “String”, “default”: “/etc/myapp/config.json”, “description”: “Path to config file” } }, “mainSteps”: [ { “action”: “aws:runShellScript”, “name”: “updateConfigFile”, “inputs”: { “runCommand”: [ “mkdir -p $(dirname {{configPath}})”, “echo ‘{{configContent}}’ > {{configPath}}”,
“chmod 644 {{configPath}}”
]
}
}
]
}
EOF
aws ssm create-document \
–name “ManageConfigFile” \
–content file://manage-config-file.json \
–document-type “Command”
aws ssm create-association \
–name “ManageConfigFile” \
–targets “Key=tag:Application,Values=MyApp” \
–parameters “configContent='{\”database\”:{\”host\”:\”db.example.com\”,\”port\”:3306}}’,configPath=/etc/myapp/config.json” \
–association-name “MyAppConfiguration”
“`
6. Tích hợp Parameter Store để quản lý cấu hình an toàn:
Parameter Store cung cấp lưu trữ an toàn và phân cấp cho dữ liệu cấu hình và bí mật.
– **Lưu trữ và truy xuất cấu hình**:
“`bash
# Lưu trữ thông tin cấu hình
aws ssm put-parameter \
–name “/myapp/database/endpoint” \
–type “String” \
–value “db.example.com” \
–description “Database endpoint for MyApp”
# Lưu trữ bí mật an toàn
aws ssm put-parameter \
–name “/myapp/database/password” \
–type “SecureString” \
–value “MySecurePassword123!” \
–key-id “alias/aws/ssm”
# Truy xuất thông tin cấu hình từ instance
CONFIG=$(aws ssm get-parameter –name “/myapp/database/endpoint” –query “Parameter.Value” –output text)
PASSWORD=$(aws ssm get-parameter –name “/myapp/database/password” –with-decryption –query “Parameter.Value” –output text)
“`
– **Sử dụng tham số trong State Manager**:
“`bash
aws ssm create-association \
–name “AWS-RunShellScript” \
–targets “Key=tag:Application,Values=MyApp” \
–parameters “commands=[‘DB_ENDPOINT=$(aws ssm get-parameter –name \”/myapp/database/endpoint\” –query \”Parameter.Value\” –output text)’, ‘DB_PASSWORD=$(aws ssm get-parameter –name \”/myapp/database/password\” –with-decryption –query \”Parameter.Value\” –output text)’, ‘echo \”DB_ENDPOINT=$DB_ENDPOINT\” > /etc/myapp/env.conf’, ‘echo \”DB_PASSWORD=$DB_PASSWORD\” >> /etc/myapp/env.conf’]” \
–association-name “ConfigureMyAppEnvironment”
“`
c. Infrastructure as Code với CloudFormation
AWS CloudFormation là dịch vụ cho phép bạn mô hình hóa và thiết lập tài nguyên AWS bằng cách sử dụng code. Thay vì quản lý tài nguyên thông qua giao diện đồ họa hoặc lệnh CLI riêng lẻ, CloudFormation cho phép bạn tạo template mô tả tất cả tài nguyên AWS cần thiết và mối quan hệ giữa chúng. Phương pháp này, được gọi là Infrastructure as Code (IaC), mang lại nhiều lợi ích như khả năng tái sử dụng, tính nhất quán và khả năng kiểm soát phiên bản.
1. Khái niệm cơ bản của CloudFormation:
– **Template**: Tệp YAML hoặc JSON mô tả tài nguyên AWS, thông số và quan hệ phụ thuộc
– **Stack**: Tập hợp các tài nguyên AWS được quản lý như một đơn vị duy nhất, được tạo từ template
– **Change Set**: Bản tóm tắt các thay đổi được đề xuất trước khi cập nhật stack
– **Resources**: Các thành phần AWS (như EC2, VPC, S3) được định nghĩa trong template
– **Parameters**: Giá trị đầu vào cho phép tùy chỉnh template khi tạo hoặc cập nhật stack
– **Outputs**: Giá trị được trả về sau khi stack được tạo, có thể được sử dụng bởi các stack khác
2. Tạo template CloudFormation cho Amazon VPS:
Dưới đây là một template CloudFormation hoàn chỉnh để thiết lập một Amazon VPS có thể mở rộng với Auto Scaling, Load Balancer, và các tài nguyên liên quan:
“`yaml
AWSTemplateFormatVersion: ‘2010-09-09’
Description: ‘Amazon VPS environment with Auto Scaling and Load Balancer’
Parameters:
EnvironmentName:
Description: Environment name (dev, staging, prod)
Type: String
Default: dev
InstanceType:
Description: EC2 instance type
Type: String
Default: t3.micro
AllowedValues:
– t3.micro
– t3.small
– t3.medium
KeyName:
Description: EC2 Key Pair for SSH access
Type: AWS::EC2::KeyPair::KeyName
VpcCIDR:
Description: CIDR block for the VPC
Type: String
Default: 10.0.0.0/16
PublicSubnet1CIDR:
Description: CIDR block for Public Subnet 1
Type: String
Default: 10.0.1.0/24
PublicSubnet2CIDR:
Description: CIDR block for Public Subnet 2
Type: String
Default: 10.0.2.0/24
SSHLocation:
Description: IP address range for SSH access
Type: String
Default: 0.0.0.0/0
LatestAmiId:
Type: ‘AWS::SSM::Parameter::Value’
Default: ‘/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2’
Resources:
# VPC and Network Configuration
VPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: !Ref VpcCIDR
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
– Key: Name
Value: !Sub ${EnvironmentName}-VPC
InternetGateway:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
– Key: Name
Value: !Sub ${EnvironmentName}-IGW
InternetGatewayAttachment:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
InternetGatewayId: !Ref InternetGateway
VpcId: !Ref VPC
PublicSubnet1:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
AvailabilityZone: !Select [ 0, !GetAZs ” ]
CidrBlock: !Ref PublicSubnet1CIDR
MapPublicIpOnLaunch: true
Tags:
– Key: Name
Value: !Sub ${EnvironmentName}-PublicSubnet1
PublicSubnet2:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
AvailabilityZone: !Select [ 1, !GetAZs ” ]
CidrBlock: !Ref PublicSubnet2CIDR
MapPublicIpOnLaunch: true
Tags:
– Key: Name
Value: !Sub ${EnvironmentName}-PublicSubnet2
PublicRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref VPC
Tags:
– Key: Name
Value: !Sub ${EnvironmentName}-PublicRouteTable
DefaultPublicRoute:
Type: AWS::EC2::Route
DependsOn: InternetGatewayAttachment
Properties:
RouteTableId: !Ref PublicRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref InternetGateway
PublicSubnet1RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId: !Ref PublicRouteTable
SubnetId: !Ref PublicSubnet1
PublicSubnet2RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId: !Ref PublicRouteTable
SubnetId: !Ref PublicSubnet2
# Security Groups
WebServerSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Security group for web servers
VpcId: !Ref VPC
SecurityGroupIngress:
– IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
– IpProtocol: tcp
FromPort: 443
ToPort: 443
CidrIp: 0.0.0.0/0
– IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: !Ref SSHLocation
Tags:
– Key: Name
Value: !Sub ${EnvironmentName}-WebServerSG
ALBSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Security group for ALB
VpcId: !Ref VPC
SecurityGroupIngress:
– IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
– IpProtocol: tcp
FromPort: 443
ToPort: 443
CidrIp: 0.0.0.0/0
Tags:
– Key: Name
Value: !Sub ${EnvironmentName}-ALBSG
# IAM Role for EC2
WebServerRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: ‘2012-10-17’
Statement:
– Effect: Allow
Principal:
Service: ec2.amazonaws.com
Action: sts:AssumeRole
ManagedPolicyArns:
– arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
– arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy
Tags:
– Key: Name
Value: !Sub ${EnvironmentName}-WebServerRole
WebServerInstanceProfile:
Type: AWS::IAM::InstanceProfile
Properties:
Roles:
– !Ref WebServerRole
# Application Load Balancer
ApplicationLoadBalancer:
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
Properties:
Subnets:
– !Ref PublicSubnet1
– !Ref PublicSubnet2
SecurityGroups:
– !Ref ALBSecurityGroup
Tags:
– Key: Name
Value: !Sub ${EnvironmentName}-ALB
ALBTargetGroup:
Type: AWS::ElasticLoadBalancingV2::TargetGroup
Properties:
HealthCheckIntervalSeconds: 30
HealthCheckPath: /
HealthCheckProtocol: HTTP
HealthCheckTimeoutSeconds: 5
HealthyThresholdCount: 2
Port: 80
Protocol: HTTP
UnhealthyThresholdCount: 5
VpcId: !Ref VPC
TargetType: instance
Tags:
– Key: Name
Value: !Sub ${EnvironmentName}-TargetGroup
ALBListener:
Type: AWS::ElasticLoadBalancingV2::Listener
Properties:
DefaultActions:
– Type: forward
TargetGroupArn: !Ref ALBTargetGroup
LoadBalancerArn: !Ref ApplicationLoadBalancer
Port: 80
Protocol: HTTP
# Launch Template
WebServerLaunchTemplate:
Type: AWS::EC2::LaunchTemplate
Properties:
LaunchTemplateName: !Sub ${EnvironmentName}-WebServerLaunchTemplate
VersionDescription: Initial version
LaunchTemplateData:
ImageId: !Ref LatestAmiId
InstanceType: !Ref InstanceType
KeyName: !Ref KeyName
SecurityGroupIds:
– !Ref WebServerSecurityGroup
IamInstanceProfile:
Name: !Ref WebServerInstanceProfile
UserData:
Fn::Base64: !Sub |
#!/bin/bash -xe
yum update -y
yum install -y httpd
systemctl start httpd
systemctl enable httpd
echo ‘
Hello from Amazon VPS in ${EnvironmentName} environment!
‘ > /var/www/html/index.html
# Install CloudWatch agent
yum install -y amazon-cloudwatch-agent
# Install CodeDeploy agent for future application deployments
yum install -y ruby
cd /home/ec2-user
curl -O https://aws-codedeploy-${AWS::Region}.s3.amazonaws.com/latest/install
chmod +x ./install
./install auto
# Tag the instance
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
REGION=$(curl -s http://169.254.169.254/latest/meta-data/placement/region)
aws ec2 create-tags –resources $INSTANCE_ID –tags Key=Name,Value=${EnvironmentName}-WebServer –region $REGION
# Auto Scaling Group
WebServerAutoScalingGroup:
Type: AWS::AutoScaling::AutoScalingGroup
Properties:
AutoScalingGroupName: !Sub ${EnvironmentName}-WebServerASG
MinSize: 2
MaxSize: 6
DesiredCapacity: 2
LaunchTemplate:
LaunchTemplateId: !Ref WebServerLaunchTemplate
Version: !GetAtt WebServerLaunchTemplate.LatestVersionNumber
VPCZoneIdentifier:
– !Ref PublicSubnet1
– !Ref PublicSubnet2
TargetGroupARNs:
– !Ref ALBTargetGroup
HealthCheckType: ELB
HealthCheckGracePeriod: 300
Tags:
– Key: Name
Value: !Sub ${EnvironmentName}-WebServer
PropagateAtLaunch: true
– Key: Environment
Value: !Ref EnvironmentName
PropagateAtLaunch: true
# Auto Scaling Policies
WebServerScaleUpPolicy:
Type: AWS::AutoScaling::ScalingPolicy
Properties:
AutoScalingGroupName: !Ref WebServerAutoScalingGroup
PolicyType: TargetTrackingScaling
TargetTrackingConfiguration:
PredefinedMetricSpecification:
PredefinedMetricType: ASGAverageCPUUtilization
TargetValue: 70.0
# CloudWatch Alarms
HighCPUAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmDescription: Alarm if CPU exceeds 80% for 5 minutes
Namespace: AWS/EC2
MetricName: CPUUtilization
Dimensions:
– Name: AutoScalingGroupName
Value: !Ref WebServerAutoScalingGroup
Statistic: Average
Period: 300
EvaluationPeriods: 2
Threshold: 80
ComparisonOperator: GreaterThanThreshold
AlarmActions:
– !Ref WebServerScaleUpPolicy
Outputs:
VPC:
Description: VPC ID
Value: !Ref VPC
Export:
Name: !Sub ${EnvironmentName}-VPCID
PublicSubnets:
Description: List of public subnet IDs
Value: !Join [ “,”, [ !Ref PublicSubnet1, !Ref PublicSubnet2 ] ]
Export:
Name: !Sub ${EnvironmentName}-PublicSubnets
WebServerSecurityGroup:
Description: Security group for web servers
Value: !Ref WebServerSecurityGroup
Export:
Name: !Sub ${EnvironmentName}-WebServerSG
ApplicationLoadBalancerDNS:
Description: DNS of Application Load Balancer
Value: !GetAtt ApplicationLoadBalancer.DNSName
Export:
Name: !Sub ${EnvironmentName}-ALBDNS
WebServerAutoScalingGroup:
Description: Auto Scaling Group for web servers
Value: !Ref WebServerAutoScalingGroup
Export:
Name: !Sub ${EnvironmentName}-WebServerASG
“`
3. Triển khai và quản lý stack:
– **Tạo stack từ template**:
“`bash
# Lưu template ở trên thành tệp có tên vpc-ec2-template.yaml
# Tạo stack bằng AWS CLI
aws cloudformation create-stack \
–stack-name my-vps-environment \
–template-body file://vpc-ec2-template.yaml \
–parameters ParameterKey=EnvironmentName,ParameterValue=staging \
ParameterKey=InstanceType,ParameterValue=t3.small \
ParameterKey=KeyName,ParameterValue=my-key-pair \
–capabilities CAPABILITY_IAM
“`
– **Cập nhật stack hiện có**:
“`bash
# Sau khi sửa đổi template, cập nhật stack hiện có
aws cloudformation update-stack \
–stack-name my-vps-environment \
–template-body file://vpc-ec2-template.yaml \
–parameters ParameterKey=EnvironmentName,ParameterValue=staging \
ParameterKey=InstanceType,ParameterValue=t3.medium \
ParameterKey=KeyName,ParameterValue=my-key-pair \
–capabilities CAPABILITY_IAM
“`
– **Kiểm tra trước thay đổi với Change Sets**:
“`bash
# Tạo change set để xem trước các thay đổi trước khi áp dụng
aws cloudformation create-change-set \
–stack-name my-vps-environment \
–change-set-name increase-capacity \
–template-body file://vpc-ec2-template.yaml \
–parameters ParameterKey=EnvironmentName,ParameterValue=staging \
ParameterKey=InstanceType,ParameterValue=t3.medium \
ParameterKey=KeyName,ParameterValue=my-key-pair \
–capabilities CAPABILITY_IAM
# Xem chi tiết change set
aws cloudformation describe-change-set \
–change-set-name increase-capacity \
–stack-name my-vps-environment
# Thực thi change set sau khi xem xét
aws cloudformation execute-change-set \
–change-set-name increase-capacity \
–stack-name my-vps-environment
“`
– **Xóa stack khi không còn cần thiết**:
“`bash
aws cloudformation delete-stack \
–stack-name my-vps-environment
“`
4. Các phương pháp tiên tiến trong CloudFormation:
– **Sử dụng AWS::CloudFormation::Init với cfn-init để cấu hình instance**:
Sửa đổi phần UserData trong LaunchTemplate để sử dụng cfn-init:
“`yaml
WebServerLaunchTemplate:
Type: AWS::EC2::LaunchTemplate
Metadata:
AWS::CloudFormation::Init:
configSets:
default: [install_cfn, install_apps, configure_apps]
install_cfn:
files:
/etc/cfn/cfn-hup.conf:
content: !Sub |
[main]
stack=${AWS::StackId}
region=${AWS::Region}
mode: ‘000400’
owner: root
group: root
/etc/cfn/hooks.d/cfn-auto-reloader.conf:
content: !Sub |
[cfn-auto-reloader-hook]
triggers=post.update
path=Resources.WebServerLaunchTemplate.Metadata.AWS::CloudFormation::Init
action=/opt/aws/bin/cfn-init -v –stack ${AWS::StackName} –resource WebServerLaunchTemplate –configsets default –region ${AWS::Region}
mode: ‘000400’
owner: root
group: root
services:
sysvinit:
cfn-hup:
enabled: true
ensureRunning: true
files:
– /etc/cfn/cfn-hup.conf
– /etc/cfn/hooks.d/cfn-auto-reloader.conf
install_apps:
packages:
yum:
httpd: []
amazon-cloudwatch-agent: []
ruby: []
configure_apps:
files:
/var/www/html/index.html:
content: !Sub |
Hello from Amazon VPS in ${EnvironmentName} environment!
Stack: ${AWS::StackName}
Region: ${AWS::Region}
mode: ‘000644’
owner: root
group: root
services:
sysvinit:
httpd:
enabled: true
ensureRunning: true
Properties:
# Previous properties here…
LaunchTemplateData:
# Previous data here…
UserData:
Fn::Base64: !Sub |
#!/bin/bash -xe
yum update -y aws-cfn-bootstrap
# Initialize the instance
/opt/aws/bin/cfn-init -v –stack ${AWS::StackName} –resource WebServerLaunchTemplate –configsets default –region ${AWS::Region}
# Signal the status from cfn-init
/opt/aws/bin/cfn-signal -e $? –stack ${AWS::StackName} –resource WebServerAutoScalingGroup –region ${AWS::Region}
“`
– **Sử dụng Nested Stacks cho kiến trúc mô-đun**:
“`yaml
Resources:
NetworkStack:
Type: AWS::CloudFormation::Stack
Properties:
TemplateURL: https://s3.amazonaws.com/my-templates/network.yaml
Parameters:
EnvironmentName: !Ref EnvironmentName
VpcCIDR: !Ref VpcCIDR
SecurityStack:
Type: AWS::CloudFormation::Stack
Properties:
TemplateURL: https://s3.amazonaws.com/my-templates/security.yaml
Parameters:
EnvironmentName: !Ref EnvironmentName
VpcId: !GetAtt NetworkStack.Outputs.VpcId
ApplicationStack:
Type: AWS::CloudFormation::Stack
DependsOn: [NetworkStack, SecurityStack]
Properties:
TemplateURL: https://s3.amazonaws.com/my-templates/application.yaml
Parameters:
EnvironmentName: !Ref EnvironmentName
VpcId: !GetAtt NetworkStack.Outputs.VpcId
PublicSubnets: !GetAtt NetworkStack.Outputs.PublicSubnets
WebServerSecurityGroup: !GetAtt SecurityStack.Outputs.WebServerSecurityGroup
KeyName: !Ref KeyName
InstanceType: !Ref InstanceType
“`
– **Cross-Stack References với Exports**:
“`yaml
# In stack-1.yaml
Outputs:
VPCId:
Description: The ID of the VPC
Value: !Ref VPC
Export:
Name: !Sub “${AWS::StackName}-VPCId”
# In stack-2.yaml
Resources:
Subnet:
Type: AWS::EC2::Subnet
Properties:
VpcId: !ImportValue “stack-1-VPCId”
CidrBlock: 10.0.0.0/24
“`
– **Sử dụng Custom Resources để mở rộng CloudFormation**:
“`yaml
Resources:
MyCustomResource:
Type: Custom::DNS
Properties:
ServiceToken: !GetAtt DNSFunction.Arn
DomainName: example.com
RecordName: www
RecordType: A
RecordValue: !GetAtt ApplicationLoadBalancer.DNSName
DNSFunction:
Type: AWS::Lambda::Function
Properties:
Handler: index.handler
Role: !GetAtt LambdaExecutionRole.Arn
Code:
ZipFile: |
const response = require(‘cfn-response’);
const AWS = require(‘aws-sdk’);
const route53 = new AWS.Route53();
exports.handler = (event, context) => {
console.log(‘Request:’, JSON.stringify(event));
if (event.RequestType === ‘Delete’) {
return response.send(event, context, response.SUCCESS);
}
const params = {
ChangeBatch: {
Changes: [
{
Action: ‘UPSERT’,
ResourceRecordSet: {
Name: `${event.ResourceProperties.RecordName}.${event.ResourceProperties.DomainName}`,
Type: event.ResourceProperties.RecordType,
TTL: 300,
ResourceRecords: [
{
Value: event.ResourceProperties.RecordValue
}
]
}
}
]
},
HostedZoneId: ‘Z1PA6795UKMFR9’ // Replace with your Zone ID
};
route53.changeResourceRecordSets(params, (err, data) => {
if (err) {
console.log(err);
return response.send(event, context, response.FAILED);
}
return response.send(event, context, response.SUCCESS);
});
};
Runtime: nodejs14.x
Timeout: 30
“`
3. Monitoring và logging hiệu quả
a. Thiết lập CloudWatch Logs và Alarms
Giám sát và ghi nhật ký hiệu quả là yếu tố quan trọng để duy trì tính khả dụng, hiệu suất và bảo mật cho Amazon VPS của bạn. AWS CloudWatch cung cấp một bộ công cụ toàn diện để thu thập và phân tích nhật ký, thiết lập cảnh báo, và tạo biểu đồ từ nhiều nguồn dữ liệu.
1. Thiết lập CloudWatch Logs Agent trên Amazon VPS:
CloudWatch Logs Agent cho phép thu thập tệp nhật ký hệ thống và ứng dụng từ instance EC2 của bạn và gửi chúng đến CloudWatch Logs.
– **Cài đặt CloudWatch Logs Agent**:
Trên Amazon Linux 2:
“`bash
sudo yum update -y
sudo yum install -y awslogs
“`
Trên Ubuntu:
“`bash
wget https://s3.amazonaws.com/aws-cloudwatch/downloads/latest/awslogs-agent-setup.py
sudo python awslogs-agent-setup.py –region us-east-1 # Thay thế bằng region của bạn
“`
– **Cấu hình CloudWatch Logs Agent**:
Chỉnh sửa tệp cấu hình CloudWatch Logs Agent để xác định tệp nhật ký cần giám sát:
Trên Amazon Linux 2:
“`bash
sudo vi /etc/awslogs/awslogs.conf
“`
Thêm cấu hình để theo dõi nhật ký hệ thống và ứng dụng:
“`ini
[general]
state_file = /var/lib/awslogs/agent-state
[/var/log/messages]
file = /var/log/messages
log_group_name = /var/log/messages
log_stream_name = {instance_id}
datetime_format = %b %d %H:%M:%S
[/var/log/httpd/access_log]
file = /var/log/httpd/access_log
log_group_name = /var/log/httpd/access_log
log_stream_name = {instance_id}
datetime_format = %d/%b/%Y:%H:%M:%S %z
[/var/log/httpd/error_log]
file = /var/log/httpd/error_log
log_group_name = /var/log/httpd/error_log
log_stream_name = {instance_id}
datetime_format = %d/%b/%Y:%H:%M:%S %z
[/var/log/mysql/error.log]
file = /var/log/mysql/error.log
log_group_name = /var/log/mysql/error.log
log_stream_name = {instance_id}
datetime_format = %Y-%m-%d %H:%M:%S
“`
– **Khởi động và bật CloudWatch Logs Agent**:
“`bash
sudo systemctl start awslogsd
sudo systemctl enable awslogsd
“`
2. Sử dụng CloudWatch Agent hiện đại:
CloudWatch Agent mới hơn hỗ trợ thu thập cả nhật ký và số liệu hệ thống chi tiết, đây là cách thiết lập nó:
– **Cài đặt CloudWatch Agent**:
“`bash
# Amazon Linux 2
sudo yum install -y amazon-cloudwatch-agent
# Ubuntu
wget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/amd64/latest/amazon-cloudwatch-agent.deb
sudo dpkg -i amazon-cloudwatch-agent.deb
“`
– **Tạo tệp cấu hình CloudWatch Agent**:
“`bash
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
“`
Hoặc tạo tệp cấu hình thủ công:
“`bash
sudo vi /opt/aws/amazon-cloudwatch-agent/bin/config.json
“`
“`json
{
“agent”: {
“metrics_collection_interval”: 60,
“run_as_user”: “cwagent”
},
“logs”: {
“logs_collected”: {
“files”: {
“collect_list”: [
{
“file_path”: “/var/log/httpd/access_log”,
“log_group_name”: “/var/log/httpd/access_log”,
“log_stream_name”: “{instance_id}”,
“timestamp_format”: “%d/%b/%Y:%H:%M:%S %z”
},
{
“file_path”: “/var/log/httpd/error_log”,
“log_group_name”: “/var/log/httpd/error_log”,
“log_stream_name”: “{instance_id}”,
“timestamp_format”: “%d/%b/%Y:%H:%M:%S %z”
},
{
“file_path”: “/var/log/mysql/error.log”,
“log_group_name”: “/var/log/mysql/error.log”,
“log_stream_name”: “{instance_id}”,
“timestamp_format”: “%Y-%m-%d %H:%M:%S”
},
{
“file_path”: “/var/log/nginx/access.log”,
“log_group_name”: “/var/log/nginx/access.log”,
“log_stream_name”: “{instance_id}”
},
{
“file_path”: “/var/log/nginx/error.log”,
“log_group_name”: “/var/log/nginx/error.log”,
“log_stream_name”: “{instance_id}”
}
]
}
}
},
“metrics”: {
“metrics_collected”: {
“cpu”: {
“measurement”: [
“cpu_usage_idle”,
“cpu_usage_iowait”,
“cpu_usage_user”,
“cpu_usage_system”
],
“metrics_collection_interval”: 60,
“totalcpu”: false
},
“disk”: {
“measurement”: [
“used_percent”,
“inodes_free”
],
“metrics_collection_interval”: 60,
“resources”: [
“/”
]
},
“diskio”: {
“measurement”: [
“io_time”
],
“metrics_collection_interval”: 60,
“resources”: [
“*”
]
},
“mem”: {
“measurement”: [
“mem_used_percent”
],
“metrics_collection_interval”: 60
},
“swap”: {
“measurement”: [
“swap_used_percent”
],
“metrics_collection_interval”: 60
}
},
“append_dimensions”: {
“AutoScalingGroupName”: “${aws:AutoScalingGroupName}”,
“ImageId”: “${aws:ImageId}”,
“InstanceId”: “${aws:InstanceId}”,
“InstanceType”: “${aws:InstanceType}”
}
}
}
“`
– **Khởi động CloudWatch Agent**:
“`bash
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json
“`
3. Thiết lập CloudWatch Alarms để nhận thông báo về sự cố:
CloudWatch Alarms giúp bạn theo dõi các số liệu theo thời gian và kích hoạt hành động (như gửi thông báo) khi các số liệu vượt quá ngưỡng xác định.
– **Tạo SNS Topic cho thông báo**:
“`bash
aws sns create-topic –name server-alerts
# Đăng ký email của bạn vào topic
aws sns subscribe \
–topic-arn arn:aws:sns:region:account-id:server-alerts \
–protocol email \
–notification-endpoint your-email@example.com
“`
– **Tạo cảnh báo CPU cao**:
“`bash
aws cloudwatch put-metric-alarm \
–alarm-name high-cpu-alarm \
–alarm-description “Alarm when CPU exceeds 80%” \
–metric-name CPUUtilization \
–namespace AWS/EC2 \
–statistic Average \
–period 300 \
–threshold 80 \
–comparison-operator GreaterThanThreshold \
–dimensions Name=InstanceId,Value=i-1234567890abcdef0 \
–evaluation-periods 2 \
–alarm-actions arn:aws:sns:region:account-id:server-alerts
“`
– **Tạo cảnh báo bộ nhớ thấp** (sử dụng số liệu tùy chỉnh từ CloudWatch Agent):
“`bash
aws cloudwatch put-metric-alarm \
–alarm-name high-memory-usage-alarm \
–alarm-description “Alarm when memory usage exceeds 80%” \
–metric-name mem_used_percent \
–namespace CWAgent \
–statistic Average \
–period 300 \
–threshold 80 \
–comparison-operator GreaterThanThreshold \
–dimensions Name=InstanceId,Value=i-1234567890abcdef0 \
–evaluation-periods 2 \
–alarm-actions arn:aws:sns:region:account-id:server-alerts
“`
– **Tạo cảnh báo không gian đĩa thấp**:
“`bash
aws cloudwatch put-metric-alarm \
–alarm-name low-disk-space-alarm \
–alarm-description “Alarm when disk usage exceeds 85%” \
–metric-name used_percent \
–namespace CWAgent \
–statistic Average \
–period 300 \
–threshold 85 \
–comparison-operator GreaterThanThreshold \
–dimensions Name=InstanceId,Value=i-1234567890abcdef0 Name=path,Value=/ Name=device,Value=xvda1 Name=fstype,Value=xfs \
–evaluation-periods 2 \
–alarm-actions arn:aws:sns:region:account-id:server-alerts
“`
4. Tạo bảng điều khiển và trực quan hóa hữu ích:
– **Tạo bảng điều khiển CloudWatch tùy chỉnh**:
“`bash
# Tạo bảng điều khiển
aws cloudwatch put-dashboard \
–dashboard-name “ServerMonitoring” \
–dashboard-body ‘{
“widgets”: [
{
“type”: “metric”,
“x”: 0,
“y”: 0,
“width”: 12,
“height”: 6,
“properties”: {
“metrics”: [
[ “AWS/EC2”, “CPUUtilization”, “InstanceId”, “i-1234567890abcdef0” ]
],
“period”: 300,
“stat”: “Average”,
“region”: “us-east-1”,
“title”: “CPU Utilization”
}
},
{
“type”: “metric”,
“x”: 0,
“y”: 6,
“width”: 12,
“height”: 6,
“properties”: {
“metrics”: [
[ “CWAgent”, “mem_used_percent”, “InstanceId”, “i-1234567890abcdef0” ]
],
“period”: 300,
“stat”: “Average”,
“region”: “us-east-1”,
“title”: “Memory Utilization”
}
},
{
“type”: “metric”,
“x”: 12,
“y”: 0,
“width”: 12,
“height”: 6,
“properties”: {
“metrics”: [
[ “CWAgent”, “used_percent”, “InstanceId”, “i-1234567890abcdef0”, “path”, “/”, “device”, “xvda1”, “fstype”, “xfs” ]
],
“period”: 300,
“stat”: “Average”,
“region”: “us-east-1”,
“title”: “Disk Utilization”
}
},
{
“type”: “log”,
“x”: 12,
“y”: 6,
“width”: 12,
“height”: 6,
“properties”: {
“query”: “SOURCE \’/var/log/httpd/error_log\’ | fields @timestamp, @message\n| sort @timestamp desc\n| limit 20”,
“region”: “us-east-1”,
“title”: “Recent Apache Errors”,
“view”: “table”
}
}
]
}’
“`
5. Tạo bộ lọc và chỉ số Logs:
CloudWatch Logs Metric Filters cho phép bạn tìm kiếm và đếm các sự kiện cụ thể trong nhật ký và chuyển đổi chúng thành số liệu có thể cảnh báo.
– **Tạo bộ lọc số liệu cho lỗi 5xx HTTP**:
“`bash
aws logs put-metric-filter \
–log-group-name “/var/log/httpd/access_log” \
–filter-name “HTTP5xxErrors” \
–filter-pattern “\” 5[0-9][0-9] \”” \
–metric-transformations \
metricName=HTTP5xxCount,metricNamespace=WebServer,metricValue=1
“`
– **Tạo cảnh báo cho số lỗi 5xx cao**:
“`bash
aws cloudwatch put-metric-alarm \
–alarm-name http-5xx-error-alarm \
–alarm-description “Alarm when 5xx errors are high” \
–metric-name HTTP5xxCount \
–namespace WebServer \
–statistic Sum \
–period 60 \
–threshold 10 \
–comparison-operator GreaterThanOrEqualToThreshold \
–evaluation-periods 1 \
–alarm-actions arn:aws:sns:region:account-id:server-alerts
“`
– **Tạo bộ lọc số liệu cho thông báo bảo mật Linux**:
“`bash
aws logs put-metric-filter \
–log-group-name “/var/log/messages” \
–filter-name “SecurityIssues” \
–filter-pattern “failed password|authentication failure|refused connect|invalid user” \
–metric-transformations \
metricName=SecurityIssueCount,metricNamespace=Security,metricValue=1
“`
b. Theo dõi logs ứng dụng và phân tích sự cố
Giám sát hiệu quả các nhật ký ứng dụng không chỉ giúp phát hiện sự cố mà còn cung cấp hiểu biết sâu sắc về cách ứng dụng của bạn hoạt động trên Amazon VPS. Phần này tập trung vào các phương pháp tiên tiến để thu thập, phân tích và trích xuất thông tin có giá trị từ nhật ký ứng dụng.
1. Các phương pháp thu thập nhật ký ứng dụng:
– **Chuẩn hóa định dạng và vị trí nhật ký**:
“`bash
# Tạo thư mục tập trung cho nhật ký ứng dụng
sudo mkdir -p /var/log/applications
# Đảm bảo quyền thích hợp
sudo chmod 755 /var/log/applications
sudo chown root:adm /var/log/applications
# Cấu hình logrotate để quản lý nhật ký
sudo vi /etc/logrotate.d/application-logs
“`
“`
/var/log/applications/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 root adm
sharedscripts
postrotate
systemctl reload nginx > /dev/null 2>/dev/null || true
# Thêm lệnh tải lại các dịch vụ ứng dụng khác nếu cần
endscript
}
“`
– **Cấu hình nginx để ghi nhật ký JSON**:
“`bash
sudo vi /etc/nginx/nginx.conf
“`
“`
http {
# … other configurations …
log_format json_combined escape=json
‘{‘
‘”time_local”:”$time_local”,’
‘”remote_addr”:”$remote_addr”,’
‘”remote_user”:”$remote_user”,’
‘”request”:”$request”,’
‘”status”: “$status”,’
‘”body_bytes_sent”:”$body_bytes_sent”,’
‘”request_time”:”$request_time”,’
‘”http_referrer”:”$http_referer”,’
‘”http_user_agent”:”$http_user_agent”‘
‘}’;
access_log /var/log/nginx/access.log json_combined;
# … rest of the configuration …
}
“`
– **Cấu hình Apache để ghi nhật ký JSON**:
“`bash
sudo vi /etc/httpd/conf/httpd.conf
“`
“`
# Tải module thích hợp
LoadModule log_config_module modules/mod_log_config.so
# Định nghĩa định dạng JSON
LogFormat “{ \”time\”: \”%t\”, \”remote_ip\”: \”%a\”, \”request\”: \”%r\”, \”status\”: \”%>s\”, \”bytes\”: \”%b\”, \”user_agent\”: \”%{User-agent}i\”, \”referer\”: \”%{Referer}i\”, \”request_time\”: \”%D\” }” json
# Sử dụng định dạng cho log chính
CustomLog “logs/access_log” json
“`
– **Cấu hình Node.js để ghi nhật ký có cấu trúc với Winston**:
“`javascript
const winston = require(‘winston’);
const { format } = winston;
// Định nghĩa logger
const logger = winston.createLogger({
level: process.env.LOG_LEVEL || ‘info’,
format: format.combine(
format.timestamp(),
format.json()
),
defaultMeta: { service: ‘user-service’ },
transports: [
// Ghi các nhật ký cấp độ error vào console và tệp error.log
new winston.transports.File({
filename: ‘/var/log/applications/app-error.log’,
level: ‘error’
}),
// Ghi tất cả các nhật ký vào combined.log
new winston.transports.File({
filename: ‘/var/log/applications/app-combined.log’
}),
// Ghi ra console trong môi trường phát triển
new winston.transports.Console({
format: format.combine(
format.colorize(),
format.simple()
)
})
]
});
// Sử dụng logger
logger.info(‘Application started’, { port: 3000 });
logger.error(‘Database connection failed’, {
error: ‘Connection timeout’,
database: ‘users’
});
“`
2. Phân tích nhật ký với CloudWatch Logs Insights:
CloudWatch Logs Insights cho phép bạn tương tác truy vấn và phân tích nhật ký của mình trong CloudWatch Logs. Dưới đây là một số truy vấn hữu ích:
– **Phân tích mã trạng thái HTTP từ nhật ký truy cập web**:
“`
fields @timestamp, @message
| parse @message “\”status\”: \”*\”,” as status_code
| stats count(*) as request_count by status_code
| sort request_count desc
“`
– **Tìm các URL yêu cầu chậm nhất**:
“`
fields @timestamp, @message
| parse @message “\”request\”: \”* * *\”,” as method, url, protocol
| parse @message “\”request_time\”:\”*\”” as request_time
| filter request_time > 1
| stats avg(request_time) as avg_time, max(request_time) as max_time, count(*) as request_count by url
| sort max_time desc
| limit 10
“`
– **Phân tích mẫu truy cập theo IP nguồn**:
“`
fields @timestamp, @message
| parse @message “\”remote_addr\”:\”*\”,” as ip_address
| stats count(*) as request_count by ip_address
| sort request_count desc
| limit 20
“`
– **Tìm các thử đăng nhập không thành công từ nhật ký bảo mật**:
“`
fields @timestamp, @message
| filter @message like /Failed password/ or @message like /authentication failure/
| parse @message “from * ” as source_ip
| stats count(*) by source_ip, bin(30m) as time_interval
| sort count(*) desc
“`
3. Tạo bảng điều khiển giám sát nhật ký:
– **Tạo bảng điều khiển dành riêng cho giám sát nhật ký**:
“`bash
aws cloudwatch put-dashboard \
–dashboard-name “ApplicationLogs” \
–dashboard-body ‘{
“widgets”: [
{
“type”: “log”,
“x”: 0,
“y”: 0,
“width”: 24,
“height”: 6,
“properties”: {
“query”: “SOURCE \’/var/log/applications/app-error.log\’ | fields @timestamp, @message\n| sort @timestamp desc\n| limit 10”,
“region”: “us-east-1”,
“title”: “Recent Application Errors”,
“view”: “table”
}
},
{
“type”: “log”,
“x”: 0,
“y”: 6,
“width”: 12,
“height”: 6,
“properties”: {
“query”: “SOURCE \’/var/log/nginx/access.log\’ | parse @message \”\\\”status\\\”: \\\”*\\\”\” as status_code | stats count(*) by status_code | sort status_code asc”,
“region”: “us-east-1”,
“title”: “HTTP Status Code Distribution”,
“view”: “pie”
}
},
{
“type”: “log”,
“x”: 12,
“y”: 6,
“width”: 12,
“height”: 6,
“properties”: {
“query”: “SOURCE \’/var/log/nginx/access.log\’ | parse @message \”\\\”request_time\\\”:\\\”*\\\”\” as request_time | stats avg(request_time) as avg_response_time, max(request_time) as max_response_time by bin(30m)”,
“region”: “us-east-1”,
“title”: “API Response Times”,
“view”: “timeSeries”,
“stacked”: false
}
},
{
“type”: “log”,
“x”: 0,
“y”: 12,
“width”: 24,
“height”: 6,
“properties”: {
“query”: “SOURCE \’/var/log/applications/app-combined.log\’ | fields @timestamp, @message\n| parse @message \”{*}\” as jsondata\n| sort @timestamp desc\n| limit 20″,
“region”: “us-east-1”,
“title”: “Recent Application Logs”,
“view”: “table”
}
}
]
}’
“`
4. Triển khai công cụ phân tích nhật ký trên EC2:
– **Cài đặt và cấu hình Loki (hệ thống lưu trữ và truy vấn nhật ký) với Promtail và Grafana**:
“`bash
# Tạo thư mục cấu hình
sudo mkdir -p /etc/loki
sudo mkdir -p /etc/promtail
# Tải Loki và Promtail
wget https://github.com/grafana/loki/releases/download/v2.4.1/loki-linux-amd64.zip
wget https://github.com/grafana/loki/releases/download/v2.4.1/promtail-linux-amd64.zip
# Giải nén
unzip loki-linux-amd64.zip
unzip promtail-linux-amd64.zip
# Di chuyển nhị phân
sudo mv loki-linux-amd64 /usr/local/bin/loki
sudo mv promtail-linux-amd64 /usr/local/bin/promtail
sudo chmod +x /usr/local/bin/loki /usr/local/bin/promtail
# Tạo tệp cấu hình Loki
sudo cat > /etc/loki/config.yaml << ‘EOF’ auth_enabled: false server: http_listen_port: 3100 ingester: lifecycler: address: 127.0.0.1 ring: kvstore: store: inmemory replication_factor: 1 final_sleep: 0s chunk_idle_period: 5m chunk_retain_period: 30s schema_config: configs: – from: 2020-10-24 store: boltdb-shipper object_store: filesystem schema: v11 index: prefix: index_ period: 24h storage_config: boltdb_shipper: active_index_directory: /var/lib/loki/index cache_location: /var/lib/loki/cache cache_ttl: 24h shared_store: filesystem filesystem: directory: /var/lib/loki/chunks limits_config: enforce_metric_name: false reject_old_samples: true reject_old_samples_max_age: 168h chunk_store_config: max_look_back_period: 0s table_manager: retention_deletes_enabled: false retention_period: 0s EOF # Tạo thư mục dữ liệu cho Loki sudo mkdir -p /var/lib/loki/chunks /var/lib/loki/index /var/lib/loki/cache sudo chmod -R 755 /var/lib/loki # Tạo tệp cấu hình Promtail sudo cat > /etc/promtail/config.yaml << ‘EOF’ server: http_listen_port: 9080 grpc_listen_port: 0 positions: filename: /var/lib/promtail/positions.yaml clients: – url: http://localhost:3100/loki/api/v1/push scrape_configs: – job_name: system static_configs: – targets: – localhost labels: job: varlogs __path__: /var/log/*log – job_name: nginx static_configs: – targets: – localhost labels: job: nginx __path__: /var/log/nginx/*log – job_name: applications static_configs: – targets: – localhost labels: job: applications __path__: /var/log/applications/*.log EOF # Tạo thư mục vị trí cho Promtail sudo mkdir -p /var/lib/promtail sudo chmod 755 /var/lib/promtail # Tạo dịch vụ systemd cho Loki sudo cat > /etc/systemd/system/loki.service << ‘EOF’ [Unit] Description=Loki log aggregation system After=network.target [Service] ExecStart=/usr/local/bin/loki -config.file=/etc/loki/config.yaml Restart=always User=root Group=root [Install] WantedBy=multi-user.target EOF # Tạo dịch vụ systemd cho Promtail sudo cat > /etc/systemd/system/promtail.service << ‘EOF’
[Unit]
Description=Promtail log agent for Loki
After=network.target
[Service]
ExecStart=/usr/local/bin/promtail -config.file=/etc/promtail/config.yaml
Restart=always
User=root
Group=root
[Install]
WantedBy=multi-user.target
EOF
# Bật và khởi động dịch vụ
sudo systemctl daemon-reload
sudo systemctl enable loki
sudo systemctl start loki
sudo systemctl enable promtail
sudo systemctl start promtail
# Cài đặt Grafana
sudo apt-get install -y apt-transport-https software-properties-common
wget -q -O – https://packages.grafana.com/gpg.key | sudo apt-key add –
echo “deb https://packages.grafana.com/oss/deb stable main” | sudo tee -a /etc/apt/sources.list.d/grafana.list
sudo apt-get update
sudo apt-get install -y grafana
# Bật và khởi động Grafana
sudo systemctl enable grafana-server
sudo systemctl start grafana-server
“`
Sau khi cài đặt, truy cập Grafana tại http://your-instance-ip:3000 (đăng nhập mặc định: admin/admin) và cấu hình Loki làm nguồn dữ liệu với URL http://localhost:3100.
5. Thiết lập cảnh báo dựa trên phân tích nhật ký:
– **Tạo bộ lọc số liệu và cảnh báo cho lỗi ứng dụng cụ thể**:
“`bash
# Tạo bộ lọc số liệu cho ngoại lệ trong nhật ký ứng dụng
aws logs put-metric-filter \
–log-group-name “/var/log/applications/app-error.log” \
–filter-name “DatabaseConnectionErrors” \
–filter-pattern “Database connection failed” \
–metric-transformations \
metricName=DatabaseConnectionFailures,metricNamespace=AppErrors,metricValue=1
# Tạo cảnh báo cho vấn đề kết nối cơ sở dữ liệu
aws cloudwatch put-metric-alarm \
–alarm-name database-connection-alarm \
–alarm-description “Alarm when database connection errors occur” \
–metric-name DatabaseConnectionFailures \
–namespace AppErrors \
–statistic Sum \
–period 60 \
–threshold 1 \
–comparison-operator GreaterThanOrEqualToThreshold \
–evaluation-periods 1 \
–alarm-actions arn:aws:sns:region:account-id:server-alerts
“`
c. Báo cáo hiệu suất và thiết lập tự động thông báo
Thiết lập báo cáo hiệu suất tự động và hệ thống thông báo là một phần quan trọng của chiến lược giám sát và bảo trì toàn diện cho Amazon VPS. Các công cụ này không chỉ cảnh báo bạn về sự cố ngay khi chúng xảy ra mà còn cung cấp thông tin chi tiết dài hạn về hiệu suất hệ thống và xu hướng phát triển.
1. Tạo báo cáo hiệu suất tự động:
– **Thiết lập Báo cáo Sử dụng CloudWatch để theo dõi hiệu suất hàng tuần/hàng tháng**:
“`bash
# Cài đặt AWS CLI và python vào instance nếu chưa có
sudo yum install -y python3 python3-pip
pip3 install –user boto3 matplotlib pandas
# Tạo script báo cáo hiệu suất
cat > performance_report.py << ‘EOF’
#!/usr/bin/env python3
import boto3
import datetime
import pandas as pd
import matplotlib.pyplot as plt
import io
import os
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
import smtplib
# Configure these variables
INSTANCE_ID = ‘i-1234567890abcdef0’
REGION = ‘us-east-1’
REPORT_PERIOD_DAYS = 7
EMAIL_FROM = ‘notifications@yourdomain.com’
EMAIL_TO = [‘admin@yourdomain.com’]
SMTP_SERVER = ‘smtp.yourdomain.com’
SMTP_PORT = 587
SMTP_USER = ‘smtp_user’
SMTP_PASSWORD = ‘smtp_password’
# Initialize AWS clients
cloudwatch = boto3.client(‘cloudwatch’, region_name=REGION)
ec2 = boto3.client(‘ec2’, region_name=REGION)
# Get instance information
instance_info = ec2.describe_instances(InstanceIds=[INSTANCE_ID])
instance_type = instance_info[‘Reservations’][0][‘Instances’][0][‘InstanceType’]
private_ip = instance_info[‘Reservations’][0][‘Instances’][0][‘PrivateIpAddress’]
try:
public_ip = instance_info[‘Reservations’][0][‘Instances’][0][‘PublicIpAddress’]
except KeyError:
public_ip = “None”
# Calculate time ranges
end_time = datetime.datetime.utcnow()
start_time = end_time – datetime.timedelta(days=REPORT_PERIOD_DAYS)
# Get metrics data
def get_metric_data(metric_name, statistic=’Average’):
response = cloudwatch.get_metric_statistics(
Namespace=’AWS/EC2′,
MetricName=metric_name,
Dimensions=[{‘Name’: ‘InstanceId’, ‘Value’: INSTANCE_ID}],
StartTime=start_time,
EndTime=end_time,
Period=3600, # 1 hour
Statistics=[statistic]
)
data_points = response[‘Datapoints’]
data_points.sort(key=lambda x: x[‘Timestamp’])
timestamps = [dp[‘Timestamp’] for dp in data_points]
values = [dp[statistic] for dp in data_points]
return timestamps, values
# Get Custom Metrics if available (memory, disk, etc.)
def get_custom_metric_data(metric_name, statistic=’Average’):
try:
response = cloudwatch.get_metric_statistics(
Namespace=’CWAgent’,
MetricName=metric_name,
Dimensions=[{‘Name’: ‘InstanceId’, ‘Value’: INSTANCE_ID}],
StartTime=start_time,
EndTime=end_time,
Period=3600, # 1 hour
Statistics=[statistic]
)
data_points = response[‘Datapoints’]
if not data_points:
return None, None
data_points.sort(key=lambda x: x[‘Timestamp’])
timestamps = [dp[‘Timestamp’] for dp in data_points]
values = [dp[statistic] for dp in data_points]
return timestamps, values
except:
return None, None
# Get standard metrics
cpu_timestamps, cpu_values = get_metric_data(‘CPUUtilization’)
network_in_timestamps, network_in_values = get_metric_data(‘NetworkIn’, ‘Sum’)
network_out_timestamps, network_out_values = get_metric_data(‘NetworkOut’, ‘Sum’)
# Get custom metrics if available
mem_timestamps, mem_values = get_custom_metric_data(‘mem_used_percent’)
disk_timestamps, disk_values = get_custom_metric_data(‘disk_used_percent’)
# Create plots
fig, axs = plt.subplots(3, 1, figsize=(10, 15))
# CPU Utilization
axs[0].plot(cpu_timestamps, cpu_values, marker=’o’)
axs[0].set_title(‘CPU Utilization (%)’)
axs[0].set_xlabel(‘Time’)
axs[0].set_ylabel(‘CPU %’)
axs[0].grid(True)
# Memory Utilization (if available)
if mem_values:
axs[1].plot(mem_timestamps, mem_values, marker=’o’, color=’green