Showing posts with label AWS. Show all posts
Showing posts with label AWS. Show all posts
Infra as Code là gì?
Bắt đầu bằng một câu chuyện…
Công ty nọ đang có kế hoạch phát triển một wep application để quản lý nhân sự. Thấy giang hồ đồn rằng deploy app lên nền tảng cloud tốt hơn nhiều so với on-premise, nên sếp quyết định tuyển một SA AWS về, bằng cấp đầy mình, kinh nghiệm mấy năm xây dựng hạ tầng cloud trên AWS ngon choét…
Anh kĩ sư AWS vào, ngay lập tức bằng kinh nghiệm của mình đã build 1 hệ thống infra trên AWS khá ngon, app được deploy trên chục con EC2, đặt trong một scaling group có khả năng tự động scale up, down tùy thuộc vào số lượng user request. Các EC2 được thiết lập mạng VPC, security group, bảo mật đến tận răng, không lo bị hack.
Làm được vài tháng, thì anh kĩ sư AWS xin quit vì trả lương bèo quá, để lại cái hệ thống cloud không ai maintains. Web app được deploy trên cloud hoạt động khá hiệu quả, sếp mừng lắm nên chỉ đạo xuống dưới
Lúc này, lính tráng khóc dở, mếu dở vì cái infra cloud hiện tại được anh kĩ sư AWS build hoàn toàn bằng cơm. Knowhow không biết, cả team không ai biết làm thế nào để tạo infra tương tự.
Như vậy là phải cần một loại tool nào đó mà chỉ cần bấm, enter command thì nó tự động build up ra 1 infra, không cần chạy manual như hiện tại nữa.
Thế là infra as code ra đời.
Infra as code là gì?
Thay vì build hệ thống bằng tay, như vào console gõ command, config, cài cắm… Bạn sẽ script hóa các bước trên bằng code. Như thế, việc xây dựng cấu hình hệ thống giống như lập trình một ứng dụng vậy. Bạn chỉ việc vào console execute chương trình là infra sẽ tự đông được build trong vòng một nốt nhạc, không cần kiến thức sâu rộng về hệ thống, công nhân thợ hồ cũng thực hiện được. Túm váy là chuyển từ thủ công, chân tay sang tự động hóa...
Việc sử dụng Infra as Code đem lại cho bạn rất nhiều lợi ích
Khi các steps được script hóa, thì việc tạo resource sẽ được thực hiện theo đúng quy trình, không thừa thiếu bước nào, hạn chế sai sót khi thực hiện bằng tay. Tưởng tượng một thanh niên tạo một con EC2 bằng tay, rồi nhân tiện add security group open all port thì thảm họa thế nào
Rất linh hoạt, bạn có thể dùng Infra as code để nhân bản nhiều infra cùng 1 lúc với các tham số khác nhau chỉ trong vòng 1 nốt nhạc. Không cần 1 anh kĩ sư AWS như ở trên nữa.
Với khả năng automate, Infra as Code được tích hợp vào quy trình CI/CD để xây dựng hạ tầng một cách nhanh chóng. Chỉ cần start một Jenkins pipeline là infra được build lên.
Giải pháp Infra as Code
Các dự án DevOps hiện tại của mình gần như đã loại bỏ việc tạo infra manual. Tất cả đều được viết dưới dạng code và tích hợp vào Jenkins.
2 giải pháp Infra as Code mình hay sử dụng cho các dự án DevOps là Terraform và AWS Cloudformation. Đối với hệ tầng được xây dựng trên nền tảng AWS thì Cloudformation là giải pháp rất hiệu quả
Mô hình build Infra as Code dùng CloudFormation như sau
Anh Dev mô tả hạ tầng thành dạng template (JSON or YAML) format
File template được lưu local hoặc trên S3
AWS Cloudformation sẽ đọc nội dung trong template để build lên hạ tầng
Khi tích hợp Infra as Code vào CI/CD, mình thường sử dụng Python và Jinja template để tạo AWS CloudFormation. Jinja sẽ dùng các tham số đầu vào để tạo ra Cloudformation template. Sau đó, sử dụng cloudformation API để thực thi việc tạo infra.
Bài này giới thiệu Infra as Code ở góc độ lý thuyết, bài tiếp theo sẽ đi vào thực hành các xây dựng Infra đơn giản bằng Terraforms và Cloudformation.
@giaosucan
Giải thích tên dịch vụ trên Amazon Web Service (AWS)
Dịch vụ trên AWS được đặt tên theo 2 kiểu như sau:
- Tên viết tắt, như: EC2, S3, RDS…
- Tên của vật thực, như: BeanStalk, Kinesis, Snowball…
Vậy làm sao để nhớ, chỉ có những người đã từng làm việc qua những dịch vụ này mới có thể nhớ nổi. Đối với người mới bắt đầu, việc thích ứng với những cái tên này thật sự gặp nhiều trở ngại. Cùng tôi tìm hiểu xem chúng có những ý nghĩa, và tại sao lại đặt ra như vậy nhé.
STT | Tên dịch vụ | Viết tắt/giải thích | Tên gợi nhớ | Sử dụng |
1 | EC2 | Elastic Compute Cloud | Amazon Virtual Servers | Chứa một số thứ mà user nghĩ đó là computer. Hay gọi nó là máy ảo cho dễ. |
2 | S3 | Simple Storage Service | Amazon Unlimited FTP Server | Chứa bất kì thứ gì, dân IT gọi là object. Chứa hình ảnh, file tĩnh, html, css, backup, file chia sẻ, còn gọi là persistent storage.
Nhiều lắm! ( > ^-^ < )
|
3 | RDS | Relational Database Service | Amazon SQL | Database thôi, chỉ có điều chứa từ MS SQL, MySQL, PostgresDB, OracleDB, đến MariaDB. |
4 | BeanStalk | Represent the stem of a bean plant, proverbially fast growing and tall. | Amazon App Service | Giống như AppService của Azure. Nói trắng ra là host web app, mobile app. Tự scale, tự HA, lớn lên theo nhu cầu, như “dây đậu” (beanstalk). |
5 | VPC | Virtual Private Cloud | Amazon Virtual Colocated Rack | Tách môi trường AWS ra thành nhiều môi trường nhỏ, gọi là private cloud. Của riêng bạn, không lầm lẫn với bất kì môi trường nào khác, có gateway, có security rule…. |
6 | IAM | Identity and Access Management | Users, Keys and Certs | Quản lý users, key, certs. Tập trung, dễ sử dụng bởi nhiều dịch vụ khác, quản lý dễ hơn. Chỉ vậy thôi đấy. |
7 | SQS | Simple Queue Service | Amazon Queue | Hàng đợi, dịch sát nghĩa, giữ request lại theo thứ tự, tích hợp với các dịch vụ khác trong AWS như SNS. Giống RabbitMQ. |
8 | SNS | Simple Notification Service | Amazon Messenger | Gửi thông báo đến điện thoại, email hay SMS gì đấy tùy bạn cấu hình nhé! |
9 | EMR | Elastic MapReduce | Amazon Hadooper | Ứng dụng trong BigData. Tạm gọi là Hadooper |
10 | ECS | Elastic Container Service | Amazon Docker as a Service | Chạy container, tất cả xoay quanh containers đều có ở đây. |
11 | Kinesis | Represent an undirected movement of a cell, organism, or part in response to an external stimulus | Amazon High Throughput | Sử dụng trong trường hợp dữ liệu cần đưa đi với tốc độ cao, ví dụ như dùng cho việc phân tích dữ liệu hay lượt like hotgirl trên Facebook chẳn hạn, hoặc là lượt xem MV Lạc Trôi mới của Sơn Tùng. |
12 | SES | Simple Email Service | Amazon Transactional Email | Gửi email tự động như “Bạn đã mất tiền ở ví Bitcoin của mình”, hoặc là “Website của bạn đã bị hack”. Cũng có thể dùng để gửi email chúc ngủ ngon cho 100 cô người yêu mỗi đêm, nhưng không khuyến khích. |
13 | EBS | Elastic Block Store | Amazon EC2 Block Storage | Đĩa gắn vào máy ảo (EC2 ở trên) để chạy OS. Tưởng tượng chính là chiếc Samsung SSD 960 Pro vậy hay là Seagate 20GB 7200rpm thời tống cũng được. |
14 | Lambda | Function as a Service | AWS App Scripts | Function as a Service, mỗi lần chạy Function là tính tiền, không cần dựng môi trường như máy ảo rườm rà đối với 1 function bé tí, bắt event và thế là execute Function thôi. |
15 | Route53 | Route DNS (53) | Amazon DNS + Domains | Quản lý tất cả những bài toán nào liên quan đến DNS, bao gồm cả việc mua domain mới. |
16 | CloudFront | In Front of Cloud | Amazon CDN | CDN như Akamai, nhưng ít edge node hơn, hiệu năng chưa ai so sánh giữa CloudFront và Akamai. Chỉ biết là CloudFront dùng để stream các trận đấu của Việt Nam tại U23 Châu Á 2017 vừa rồi thôi. Có xem là có trải nghiệm CloudFront rồi đấy nhé. |
17 | Snowball | A ball of snow pressed together in the hands, especially for throwing | AWS Big Old Portable Storage | Dịch vụ chuyển dữ liệu hàng petabyte đến AWS DataCenter, bằng cách shipping phần cứng đến AWS thông qua UPS (công ty chuyển phát hàng hóa). |
Cách Học AWS Hiệu Quả Cho Người Mới Bắt Đầu

Những người đang chuẩn bị ôn luyện chứng chỉ AWS cần bắt đầu từ đâu và nên lưu ý những điểm nào? Bài viết lần này sẽ đề cập đến những dịch vụ chính của AWS, những kiến thức từ network, storage cho đến vấn đề bảo mật đều là những thông tin cơ bản cần phải nắm, giúp người mới bắt đầu ôn luyện chứng chỉ dễ dàng tiếp cận và thực hành nhất.
Chuẩn bị kiến thức căn bản
Các khái niệm căn bản được liệt kê ở đây các bạn đều có thể dễ dàng tìm kiếm và đọc được trên Google.
Network:
Là kiến thức quan trọng khi tiếp cận AWS, bạn cần phải thành thục các khái niệm về remote thông qua SSH hoặc RDP, bởi vì các service thường dùng nhất ví dụ như AWS EC2 sẽ phải config bằng cách remote vào server và thao tác trên server. Ngoài ra các khái niệm về Firewall, DNS, Proxy cũng cần phải nắm. Skill command line (bash shell, power shell) cũng là 1 skill quan trọng để có thể thao tác dễ dàng với cloud services.
Storage:
Có 3 loại storage chính, Block, Filesystem, Object. Mỗi loại có ưu điểm nhược điểm cũng như mục đích sử dụng khác nhau. Loại Block để dễ hình dung thì nó giống như ổ cứng lưu trữ của máy tính, chỉ được mount vào 1 máy và chạy, loại Filesystem là 1 loại shared storage có thể dùng được cho nhiều máy, còn loại Object Storage như kiểu 1 storage service dạng như Google Drive, AWS S3.
Security:
Kiến thức về security rất quan trọng, thường thì các lập trình viên chỉ quan tâm tới bảo mật ở application, khi tiếp cận với cloud services, cần phải quan tâm tới bảo mật ở tầng network (firewall, proxy) và tầng OS (patching security) nữa.
Ảo hoá:
Tất cả các cloud service đều được xây dựng trên nền tảng ảo hoá, ảo hoá là công nghệ được thiết kế để tạo ra tầng trung gian giữa phần cứng và phần mềm chạy trên nó. Ảo hoá giúp 1 máy vật lý có thể tạo thành nhiều máy ảo chạy động lập.
Học 1 AWS service
Sau khi đã thành thạo các kiến thức cơ bản để tiếp cận AWS, chúng ta sẽ bắt đầu học cách tìm hiểu 1 AWS service. Mọi service của AWS đều có thông tin về chức năng, cách sử dụng, document rất rõ ràng trên web, nhưng khó khăn của người mới tiếp cận là lượng thông tin quá nhiều, vậy thì đọc phần nào cho hiệu quả và nắm được service nhanh nhất.

Product Details:
Tài liệu về 1 AWS service có thể dễ dàng được tìm thấy trên google với từ khóa đơn giản “aws service_name” ví dụ “aws ec2”, mục đầu tiên bạn cần đọc là Product Details, mục này sẽ miêu tả service đó là gì, dùng để làm gì 1 cách overview nhất.
Getting Started:
Mục này sẽ hướng dẫn cách truy xuất vào service đó từ AWS console nhanh nhất, tất nhiên việc đầu tiên là bạn phải có 1 account AWS, tài khoản AWS tạo rất đơn giản, nhưng cần credit card add vào và phải đợi thời gian các service kích hoạt lên hết, từ lúc tạo tài khoản tới lúc dùng được tất cả các service mất tầm 24 giờ.
FAQs:
Mục này nên đọc để biết những khó khăn thường gặp phải khi tiếp cận service đó, rất hữu dụng.
Documentation:
Cuối cùng là phần documentation full của service đó, phần này thường rất nhiều chữ, miêu tả đầy đủ mọi thứ về 1 service từ cách config tới cách nó vận hành, cách sử dụng, bạn có thể tìm tất cả các thông tin của 1 AWS service tại mục này. Do nó rất nhiều thông tin nên để catch up hết cũng khó, tốt nhất là cần phần nào search phần đó.
Sử dụng 1 AWS service
Có 3 cách để truy xuất, config và sử dụng 1 AWS service, mỗi cách có những ưu điểm nhược điểm khác nhau và được dùng cho những mục đích khác nhau, nhưng cả 3 cách đều có thể full config được một AWS service, miễn là bạn có đủ quyền hạn.
AWS Console:

Web console của AWS là cách nhanh nhất và trực quan nhất để truy xuất và config AWS service, tại dashboard chính bạn có thể truy xuất vào bất cứ service nào, có thanh search bar hỗ trợ.
AWS Command Line Interface (CLI):
Ngoài cách vào web portal truyền thống, AWS cũng hổ trợ người dùng truy xuất service thông qua các APIs, được wrapper lại bằng bộ command line. Nếu thành thục thì thao tác bằng command line sẽ nhanh hơn cả khi vào web console thao tác, nhưng thao tác bằng command line được đánh giá là 1 interface khó và cần kinh nghiệm, vì rất dễ sai lầm, lỡ tay update hoặc xóa service nếu dùng sai command.
Cách thao tách này thường được dùng bởi các system administrator với kinh nghiệm dùng command line thành thục.
AWS SDK:
Đây là một phương thức truy cập vào AWS service thông qua SDK, AWS cung cấp 1 bộ SDK cho rất nhiều ngôn ngữ như Java, .Net, Python, Node … dùng cho các lập trình viên có thể viết ứng dụng và thao tác, config các AWS service.
Các service chính của AWS
IAM:
Service dùng để làm phân quyền trên AWS (Authentication & Authorization).
VPC:
Virtual Private Cloud, dùng để xây dựng 1 mạng LAN ảo trên Cloud, hỗ trợ tổ chức network, subnet, firewall…service gồm các component chính là subnet, security group, network ACL..
EC2:
Service cho thuê máy ảo của AWS, hỗ trợ rất nhiều sizing và có khả năng config cao để phù hợp với nhu cầu đa dạng của người sử dụng, service bao gồm các component chính là instance, ELB, EBS, ASG …
S3:
Service cho thuê dung lượng của AWS, đây là 1 dạng object storage đã được đề cập ở đầu bài viết, data là một tài sản cực kỳ quan trọng của bất cứ user nào và AWS ý thức được điều đó, cho nên S3 được đảm bảo độ tin cậy lên đến 99,999999999 % data của bạn sẽ không bị đột nhiên biến mất (trừ trường hợp bạn chủ động xóa hoặc bị xóa vì lý do gì đó).
RDS:
Relational Database Service, AWS cung cấp database as a service cho người sử dụng với những config đã được tunnel sao cho optimize nhất về performance, support hầu hết các DB engine phổ biến như MySQL, MS SQL, Oracle, PostgreSQL…RDS hỗ trợ sẵn cho người dùng những tính năng như read-replica, automatic backup, high availability…
Bên trên là những service chính của AWS mà người mới dễ dàng tiếp cận và thực hành nhất, account AWS mới đăng ký có 12 tháng free-tier được dùng thử các service với 1 số lượng giờ nhất định để người dùng dễ dàng tiếp cận.
Kiến Trúc Message Queue Trong Microservice

Trong kiến trúc microservices, ứng dụng phần mềm được cấu thành từ các dịch vụ độc lập. Để hoàn thành một tác vụ của người dùng trên phần mềm, kết nối và giao tiếp giữa các microservices là cần thiết vì một tác vụ gồm nhiều tác động khác nhau lên các services. Vì vậy, giao tiếp giữa các microservices là một vấn đề cực kì quan trọng.
Hãy xem xét một ví dụ cụ thể sau:
Service Order và Payment exposed các API để client hoặc các service khác gọi đến nó

Khi client call REST API request để thực hiện một Order. Order service nhận request xử lý business logic rồi gọi tới Payment Service qua API để thực hiện Payment.
Mô hình trên là loại mô hình kết nối Point-To-Point, các service kết nối trực tiếp với nhau thông qua API end-point. Tuy nhiên, mô hình này chỉ áp dụng với hệ thống có số lượng service nhỏ. Nếu số lượng service tăng, giao tiếp kiểu này sẽ trở nên rắc rối phức tạp, khó quản lý
Để giải quyết vấn đề trên, Microservice sử dụng mô hình Message Queue để giao tiếp giữa các service

Trong mô hình này, các Microservice không giao tiếp trực tiếp với nhau mà thông qua hệ thống Message Queue, giao tiếp bất đồng bộ
- Order Microservice publish một message đến Message queue theo một topic nào đó.
- Payment Microservice và các Microservice sẽ subscribe các message theo một topic cụ thể. Ví dụ Payment Microservice subscribe message topic “ABC” thì chỉ khi Order Microservice gửi message ABC thì nó mới nhận.
Cơ chế này tương tự như cách bạn gửi thư từ A đến B. A sẽ không đem thư đến tận nơi cho B mà gửi qua bưu điện, ghi rõ địa chỉ người nhận. Bưu điện đóng vai trò như một Message Broker để phát thư đến người nhận theo địa chỉ đã cho.
Cách này tách biệt người gửi và người nhận, và người truyền tin trung gian sẽ lưu tin nhắn đến khi người nhận có thể xử lý.
Giao tiếp giữa người gửi/ người nhận được tạo ra bởi message broker qua các tiêu chuẩn truyền tin bất đồng bộ như AMQP, MQTT.
Advance message queue protocol (AMQP)

AMQP một giao thức internet mở và được chuẩn hóa để truyền message tin cậy giữa các ứng dụng hoặc tổ chức. AMQP giúp các chuyên gia CNTT xây dựng một hệ sinh thái tin nhắn đồng nhất, đa dạng, kết nối các hệ thống một cách tương tác và hợp tác.
.

AMQP kết nối qua:
- Tổ chức – ứng dụng trong các tổ chức khác nhau
- Công nghệ – ứng dụng trên các nền tảng khác nhau
- Thời gian: Hỗ trợ giao tiếp bất đồng bộ
- Không gian – hoạt động ở khoảng cách xa hoặc trên các mạng nghèo nàn
Ngoài ra MQP được thiết kế với các đặc điểm chính sau:

Ứng dụng của AMQP trong Microservice
Vì những ưu thế của AMQP, nên nó đã được sử dụng trong Microservice để thực hiện communication giữa các service.
Phần này sẽ hướng dẫn bạn phát triển một service đơn giản dùng AMQP.
Cài đặt môi trường
Trong ví dụ này, mình sử dụng Service Broker là RabitMQ. Một message broker dùng nền tảng AMQP khá phổ biến.
Download bộ cài RabitMQ tại đây. RabitMQ hỗ trợ cả Windows, Linux. Bài này mình sử dụng môi trường Windows
Sau khi cài đặt xong, vào thư mục cài đặt của RabitMQ
C:\Program Files (x86)\RabbitMQ Server\rabbitmq_server-3.3.4\sbin
Chạy command dưới để enable rabbitMQ plugin
rabbitmq-plugins.bat enable rabbitmq_management
Khởi động RabitMQ
rabbitmq-service.bat stop rabbitmq-service.bat install rabbitmq-service.bat start
Sau đó bạn có thể truy cập vào RabitMQ theo link sau http://localhost:15672/mgmt. Enter login guest/guest

Màn hình quản lý RabbitMQ hiển thị như ở dưới

Implementation
Ở đây, mình sẽ implement 2 service. Một service đóng vai trò là producer để gửi message đến queue, service kia là consumer để nhận message này. Ngôn ngữ sử dụng là .Net core.
Tạo 2 project console application .NET core tên là Producer và Consumer. Mình sử dụng package RabbitMQ.Client để giao tiếp với RabitMQ server.
Producer

Producer sẽ send một message là hello đến RabitMQ.
Tạo một connection đến RabitMQ server. Trong trường hợp này RabitMQ là local server.
var factory = new ConnectionFactory() { HostName = "localhost" }; using (var connection = factory.CreateConnection())
Khai báo Queue
channel.QueueDeclare(queue: "hello", durable: true, exclusive: false, autoDelete: false, arguments: null);
Một số tham số cần chú ý
- Durable: true (Queue vẫn tồn tại nếu nhưng RabitMQ khởi động lại)
- Exclusive: Được sử dụng bởi chỉ một connection và queue sẽ bị xóa khi connection đó kết thúc
- Auto-delete: Queue sẽ bị xóa nếu như consumer cuối cùng hủy subscribe
Thực hiện publish message
channel.BasicPublish(exchange: "", routingKey: "hello", basicProperties: null, body: body);
Consumer
Consumer sẽ chạy liên tục là lắng nghe trên queue, để nhận message từ producer
Consumer cũng phải tạo connection và queue tương tự như Producer
var factory = new ConnectionFactory() { HostName = "localhost" }; using (var connection = factory.CreateConnection()) using (var channel = connection.CreateModel()) { channel.QueueDeclare(queue: "hello", durable: true, exclusive: false, autoDelete: false, arguments: null);
Consumer subscribe message từ Producer, khi có message đến, Event Consumer_Received sẽ được call, extract data và thực hiện business logic tương ứng.
var consumer = new EventingBasicConsumer(channel); consumer.Received += Consumer_Received;
channel.BasicConsume(queue: "hello", autoAck: true, consumer: consumer);
private static void Consumer_Received(object sender, BasicDeliverEventArgs e) { var body = e.Body; var message = Encoding.UTF8.GetString(body); Console.WriteLine(" [x] Received {0}", message); }
Chạy chương trình, bạn sẽ thấy message từ Hello World được send từ Procedure đến Consumer thông qua RabitMQ.

Trên RabitMQ server, sẽ thấy queue hello được tạo ra như hình dưới:

Trên đây là một demo đơn giản thể hiện việc communication giữa các Microservice với nhau thông qua Message Queue, dùng cơ chế bất đồng bộ. Thực tế, Microservice còn có nhiều hình thức communicate nữa như RPC, Rest API HTTP…
Còn rất nhiều kiến thức kĩ thuật về thế giới Microservice mà chúng ta cần phải tìm hiểu.
Subscribe to:
Posts (Atom)
The Ultimate XP Project
(Bài chia sẻ của tác giả Ryo Amano ) Trong bài viết số này, tôi muốn viết về dự án phát triển phần mềm có áp dụng nguyên tắc phát triển...

-
Datadog là một dịch vụ giám sát, tập hợp số liệu và sự kiện từ các máy chủ, cơ sở dữ liệu, các ứng dụng, các công cụ và dịch vụ để trình bà...
-
Let’s continue investigating Software Architecture. We considered who is a Software Architect, what types of Software Architects exist and w...
-
How many plots are there in Hollywood movies? Some critics say there are only five. How many ways can you structure a program? Right now...
-
Tìm kiếm một lợi thế trong sự nghiệp IT của bạn? Chứng nhận IT vẫn là một bằng chứng hiệu quả nhất để bạn nhanh chóng đạt được các kỹ năng ...
-
Hiện nay, chúng ta đã quen với những Chatbot được xây dựng dựa trên các Platform có sẵn như IBM Watson Conversation, Luis, API.Ai, Amazon L...
-
Sau khi hoàn thành bước liệt kê danh sách chức năng, nghiệp vụ của hệ thống tiếp đến xây dựng tầng V của thiết kế cơ bản. Để làm được bước...
-
Continuous Delivery is a process, where code changes are automatically built, tested, and prepared for a release to production. I hope...
-
This time we will talk about the purpose of the development of projects, construction of architectural solutions, and programming of algorit...
-
(Source: Projectmanagement.com) Mr. Michael Wood writes the artile on ProjectManagement.com, "8 Trends That Will Shape Project Manage...