What is CloudFormation?
CloudFormation là một dịch vụ của AWS cho phép bạn tạo các tài nguyên AWS một cách tự động, trực quan và dễ dàng. Với CloudFormation, bạn có thể tạo ra một tập hợp các tài nguyên AWS như EC2 instances, VPC, ELB, RDS, S3, IAM, và nhiều tài nguyên khác một cách tự động và dễ dàng thông qua việc định nghĩa các tài nguyên đó bằng cách sử dụng các mẫu CloudFormation.
Các mẫu CloudFormation là những file JSON hoặc YAML, được sử dụng để định nghĩa các tài nguyên AWS và các phụ thuộc giữa các tài nguyên đó. Ví dụ, bạn có thể định nghĩa một nhóm EC2 instances, một cặp khóa bảo mật, một S3 bucket và một tập hợp các quyền truy cập tới các tài nguyên đó. Khi bạn triển khai các mẫu này, AWS sẽ tự động tạo ra các tài nguyên bạn yêu cầu một cách tự động, nhanh chóng và dễ dàng.
Với CloudFormation, bạn có thể quản lý và triển khai các tài nguyên AWS một cách hiệu quả hơn, đồng thời giảm thiểu việc phải quản lý các tài nguyên bằng tay và giúp tạo ra môi trường nhất quán trong quá trình phát triển ứng dụng.
Benefits of AWS CloudFormation
Dưới đây là giải thích chi tiết về lợi ích của AWS CloudFormation:
- Infrastructure as code: AWS CloudFormation cho phép tạo cơ sở hạ tầng thông qua các đoạn code, giúp các tài nguyên được tạo tự động, nhanh chóng, dễ dàng và chính xác, không cần phải tạo tài nguyên thủ công, giúp tăng sự kiểm soát trong quá trình triển khai cơ sở hạ tầng.
- Đánh giá chi phí: Khi tạo các tài nguyên thông qua CloudFormation, bạn có thể đánh dấu các tài nguyên với các định danh để dễ dàng theo dõi chi phí của mỗi tài nguyên trong stack. Bạn cũng có thể ước tính chi phí của cơ sở hạ tầng của mình bằng cách tính toán các chi phí của từng tài nguyên trong CloudFormation template.
- Chiến lược tiết kiệm chi phí: Trong quá trình phát triển, bạn có thể đặt lịch tự động xóa các CloudFormation template vào lúc 5 giờ chiều và tạo lại chúng vào lúc 8 giờ sáng hôm sau để tiết kiệm chi phí cho các tài nguyên không cần thiết vào ngoài giờ làm việc.
- Khả năng hủy bỏ và tái tạo cơ sở hạ tầng trên đám mây một cách nhanh chóng và dễ dàng: Với CloudFormation, bạn có thể xây dựng và hủy bỏ cơ sở hạ tầng trên đám mây của mình một cách tự động mà không cần phải thực hiện bất kỳ thao tác thủ công nào.
- Tự động tạo sơ đồ hình cho các mẫu CloudFormation: CloudFormation cung cấp tính năng tự động tạo sơ đồ hình cho các mẫu của bạn, giúp bạn có thể nhanh chóng đánh giá và hiểu được cấu trúc và các tài nguyên của môi trường đám mây của bạn.
- Lập trình theo kiểu khai báo (declarative programming): Với CloudFormation, bạn không cần phải lo lắng về việc đặt thứ tự hoặc sắp xếp các tài nguyên trong cơ sở hạ tầng. Thay vào đó, bạn chỉ cần định nghĩa các tài nguyên mà bạn muốn, và CloudFormation sẽ tự động xác định các yêu cầu về thứ tự và vận hành.
- Không cần phải tạo lại từ đầu: CloudFormation cho phép bạn tận dụng các mẫu có sẵn trên web, giúp bạn tiết kiệm thời gian và công sức trong việc xây dựng cơ sở hạ tầng của mình.
- Hỗ trợ gần như tất cả các tài nguyên AWS: CloudFormation hỗ trợ hầu hết các tài nguyên AWS, giúp bạn có thể quản lý cơ sở hạ tầng của mình một cách toàn diện. Bạn cũng có thể sử dụng “tài nguyên tùy chỉnh” cho các tài nguyên không được hỗ trợ bởi CloudFormation.
CloudFormation Stack Designer
Một ví dụ về việc sử dụng CloudFormation của AWS để tạo một stack cho WordPress. Một stack bao gồm nhiều tài nguyên khác nhau trong AWS, như EC2 instances, security groups, S3 buckets, load balancers, v.v. Trong ví dụ này, chúng ta có thể nhìn thấy tất cả các tài nguyên được sử dụng và mối quan hệ giữa chúng, giúp cho việc quản lý hệ thống trở nên dễ dàng hơn. Các tài nguyên này được khai báo trong một CloudFormation template và được triển khai theo đúng thứ tự được chỉ định trong template đó.
Chúng ta sẽ nói sâu hơn các thành phần ở ví dụ trên, các thành phần được triển khai trong stack này bao gồm:
- TargetGroup: một nhóm các đích đến (targets) trên máy chủ web được sử dụng để định tuyến traffic đến cho ứng dụng web.
- LoadBalancer: cân bằng tải ứng dụng web giữa các máy chủ web trong nhóm đích đến (TargetGroup).
- DBInstance: một cơ sở dữ liệu (database) được triển khai để lưu trữ dữ liệu của ứng dụng WordPress.
- SecurityGroup: một nhóm bảo mật được liên kết với máy chủ web và cơ sở dữ liệu để kiểm soát lưu lượng traffic truy cập vào các tài nguyên này.
- LaunchConfiguration: cấu hình khởi tạo cho các máy chủ web được triển khai trên EC2.
- AutoScalingGroup: một nhóm các máy chủ web được triển khai trên EC2 sử dụng cấu hình khởi tạo (LaunchConfiguration) được chỉ định, và được tự động mở rộng hoặc thu hẹp kích thước theo nhu cầu của ứng dụng.
- Listener: một máy chủ nghe (listener) được cấu hình để lắng nghe traffic đến từ LoadBalancer và định tuyến traffic đến TargetGroup tương ứng.
Mối quan hệ giữa các thành phần được biểu diễn bằng các đường mũi tên trong sơ đồ tổng quan. Ví dụ, máy chủ web được triển khai trong AutoScalingGroup được liên kết với nhóm đích đến trong TargetGroup để cung cấp dịch vụ web cho ứng dụng, và được bảo vệ bởi SecurityGroup để kiểm soát lưu lượng truy cập vào máy chủ web. LoadBalancer được cấu hình để cân bằng tải traffic giữa các máy chủ web trong TargetGroup, và được liên kết với máy chủ nghe (listener) để định tuyến traffic đến đúng nhóm đích đến.
Hands on
Trong Prerequisite – Prepare template của AWS CloudFormation, chúng ta có ba tùy chọn là “Template is ready”, “Use a sample template” và “Create template in Designer”.
- Tùy chọn “Use a sample template” cho phép chúng ta chọn một trong các mẫu CloudFormation có sẵn để bắt đầu tạo ra stack.
- Tùy chọn “Create template in Designer” cho phép chúng ta sử dụng giao diện đồ họa để thiết kế các tài nguyên trong template của chúng ta. Chúng ta có thể kéo và thả các tài nguyên khác nhau từ thư viện đồ họa và tạo ra các kết nối giữa chúng.
- Tuỳ chọn “Template is ready” là một phần trong Prerequisite – Prepare template, nó yêu cầu bạn chuẩn bị một AWS CloudFormation template (file YAML hoặc JSON) trước khi bạn có thể sử dụng tính năng AWS CloudFormation để tạo và quản lý nguồn tài nguyên AWS của bạn. Nó giúp bạn đảm bảo rằng tất cả các thông tin cần thiết để tạo một nguồn tài nguyên AWS đã được đặt đúng và đầy đủ trong mẫu CloudFormation của bạn, và như vậy bạn có thể đảm bảo được tính toàn vẹn của nguồn tài nguyên của mình trong quá trình triển khai và vận hành. Khi bạn đã chuẩn bị xong mẫu, bạn có thể sử dụng nó để tạo và quản lý các nguồn tài nguyên AWS của mình.
Các tùy chọn “Amazon S3 URL” và “Upload a template file” trong phần “Template source” của CloudFormation console cho phép bạn chọn nơi mà mẫu của bạn được lưu trữ và tải lên.
Nếu bạn chọn “Amazon S3 URL”, bạn cần cung cấp đường dẫn URL của mẫu CloudFormation được lưu trữ trong Amazon S3. URL sẽ trỏ đến file JSON hoặc YAML chứa mẫu.
Nếu bạn chọn “Upload a template file”, bạn có thể tải lên file JSON hoặc YAML chứa mẫu CloudFormation từ máy tính của bạn trực tiếp lên console. Bạn cũng có thể kéo và thả file vào trang CloudFormation để tải lên file mẫu của mình.
Cả hai tùy chọn này đều cho phép bạn sử dụng mẫu CloudFormation của riêng mình để tạo ra tài nguyên trên AWS.
Chúng ta sẽ sử dụng tuỳ chọn “Upload a template file” và hãy upload 1 file lên bằng cách bấm vào Choose file.
Dưới đây là nội dung file 0-just-ec2.yaml. Đây là một phần của AWS CloudFormation template, định nghĩa một tài nguyên EC2 instance trong tài nguyên AWS. Tài nguyên được đặt tên là “MyInstance” và được thiết lập sẵn với các thuộc tính sau:
- Type: Loại tài nguyên được tạo ra, ở đây là “AWS::EC2::Instance”.
- AvailabilityZone: Khu vực sẽ đặt instance trong.
- ImageId: ID của AMI (Amazon Machine Image) để sử dụng cho instance.
- InstanceType: Loại instance sẽ sử dụng. Ở đây là t2.micro, đây là loại instance có giá cả phải chăng và phổ biến nhất trên AWS.
Resources:
MyInstance:
Type: AWS::EC2:: Instance
Properties:
AvailabilityZone: us-east-1a
ImageId: ami-a4c7edb2
InstanceType: t2.micro
Ở hình trên, bạn sẽ thấy có tuỳ chọn “View in Designer”, bạn hãy click vào đó, bạn có thể nhìn thấy topo thể hiện các resource trực quan bằng giao diện đồ hoạ và hiện tại nó chỉ có 1 resource duy nhất là “MyInstance”.
Bạn có thể quay lại và bấm vào Next, hãy đặt tên cho Stack này và bấm vào Next.
Phần này mình chỉ gắn tags cho nó mà thôi, sau đó bấm next.
Bạn có thể bấm vào đây để ước tính chi phí của mình.
Nhưng bây giờ mình chỉ view cho các bạn xem thôi rồi bỏ qua phần ước tính chi phí này.
Sau khi view các thiết lập, bạn có thế bấm vào Create stack.
Như vậy bạn đã tạo xong 1 stack.
Và như bạn thấy, nhiệm vụ của mình là viết ra những đoạn code như thế này, sau đó upload lên stack và hệ thống sẽ tự làm tất cả. Ví dụ của mình là đoạn code ngắn dùng để tạo ra một instance. Và đây là lý do tại sao CloudFormation còn được người ta gọi là Infrastructure as code.
Chúng ta quay lại phần Event, chúng ta cũng có thể thấy các tiến trình đang diễn ra.
Và nếu chúng ta quay sang phần EC2 › Instance, bạn sẽ thấy có 1 instance đã được tạo.
Nếu quay lại phần Event của Stacks, bạn sẽ thấy thông báo tiến trình hoàn thành.
Hoặc sang tab “Stack info” bạn cũng thấy status “CREATE_COMPLETE” báo hiệu công việc đã hoàn thành.
Vây giờ nếu bạn muốn update stack, bạn có thể chọn stack cần update và bấm vào “Update”
Hãy update file mới của bạn và bấm Next.
Hãy cùng View qua đoạn code mình vừa update lên nhé.
---
Parameters:
SecurityGroupDescription:
Description: Security Group Description
Type: String
Resources:
MyInstance:
Type: AWS::EC2::Instance
Properties:
AvailabilityZone: us-east-1a
ImageId: ami-a4c7edb2
InstanceType: t2.micro
SecurityGroups:
- !Ref SSHSecurityGroup
- !Ref ServerSecurityGroup
# an elastic IP for our instance
MyEIP:
Type: AWS::EC2::EIP
Properties:
InstanceId: !Ref MyInstance
# our EC2 security group
SSHSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Enable SSH access via port 22
SecurityGroupIngress:
- CidrIp: 0.0.0.0/0
FromPort: 22
IpProtocol: tcp
ToPort: 22
# our second EC2 security group
ServerSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: !Ref SecurityGroupDescription
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 192.168.1.1/32
Outputs:
ElasticIP:
Description: Elastic IP Value
Value: !Ref MyEIP
Đây là một đoạn code của AWS CloudFormation được viết bằng định dạng YAML. Nó mô tả việc tạo ra một EC2 instance trên AWS và tạo ra một Elastic IP cho instance đó.
Trong phần Parameters, nó định nghĩa một tham số SecurityGroupDescription có kiểu dữ liệu là String, được mô tả là mô tả cho Security Group.
Trong phần Resources, nó tạo ra một EC2 instance có tên MyInstance với các thuộc tính như AvailabilityZone, ImageId, InstanceType và SecurityGroups. SecurityGroups bao gồm hai Security Group được định nghĩa trong phần này: SSHSecurityGroup và ServerSecurityGroup.
- SSHSecurityGroup là một Security Group cho phép truy cập SSH vào instance qua cổng 22.
- ServerSecurityGroup là một Security Group khác có thể được đặt tên theo tham số SecurityGroupDescription, cho phép truy cập HTTP qua cổng 80 từ bất kỳ địa chỉ IP nào, và cho phép truy cập SSH từ địa chỉ IP cụ thể là 192.168.1.1.
Sau đó, nó tạo ra một Elastic IP có tên MyEIP, liên kết với instance MyInstance.
Cuối cùng, trong phần Outputs, nó định nghĩa một đầu ra ElasticIP, mô tả giá trị của Elastic IP và trả về địa chỉ IP của Elastic IP liên kết với instance MyInstance.
Tóm lại, đoạn mã này được sử dụng để tạo ra một EC2 instance trên AWS và cấu hình một số thông số như Elastic IP và các Security Group để cho phép truy cập vào instance đó.
Phần này chúng ta có thể nhập mô tả Security group.
Phần này mình không sửa đổi gì và bấm next.
Ở phần review bạn có thể xem lại các thiết lập mới, ví dụ như Add có nghĩa là có thành phần mới được thêm vào hoặc Modify tức là sửa lại các thành phần cũ đã có sẵn. Nếu không còn gì thay đổi, bạn có thể bấm Update stack để cập nhật lại stack này.
Như vây là stack của mình đang ở tiến trình cập nhật.
Trong lúc chờ cập nhật chúng ta có thể view qua phần Template, bạn sẽ thấy nội dung file yaml mới của stack. Bạn có thể bấm vào View in Designer để xem tiến trình băng topo trực quan.
Và đây là topo.
Hãy cùng xem lại tiến trình của các resource.
Sang phần Event để xem các tiến trình nhưng mà bạn hãy để ý có một sự kiện xoá Instance cũ.
Quay lại bảng quản lý instance, đúng như sự kiện thông báo bạn sẽ thấy Instance “DemoCF” cũ đang bị xoá.
Và sau tiến trình xoá Instance cũ thành công thì bạn sẽ thấy 1 thông báo quá trình Update thành công.
Và nếu như bạn muốn xoá stack thì bạn chọn stack muốn xoá và bấm vào Delete.
Bạn sẽ có một cảnh báo, cảnh báo này có nghĩa là nếu bạn xóa stack này thì tất cả các resources được tạo ra bởi stack đó sẽ bị xóa theo chính sách xóa được định nghĩa trước đó. Nếu trong tài nguyên được tạo ra bởi stack có định nghĩa DeletionPolicy là “Delete” thì nó sẽ bị xóa ngay lập tức khi stack bị xóa. Nếu DeletionPolicy là “Retain” thì tài nguyên đó sẽ không bị xóa khi xóa stack. Nếu DeletionPolicy là “Snapshot”, thì tài nguyên đó sẽ được tạo ra một bản snapshot trước khi xóa stack.
Bạn nhận được thông báo xoá stack.