AWS CloudFormation Overview: Sơ lược về CloudFormation
Overview
AWS CloudFormation là một công cụ IAC provisioning (IAC có hai nhóm chính là: provisioning và configuration, bạn có thể xem chi tiết tại bài viết này) giúp người dùng đơn giản hóa việc cấp phát và quản lý hạ tầng AWS.
Một số khái niệm cần biết khi sử dụng CloudFormation:
- Template file: được coi như bản thiết kế cho hạ tầng AWS, file này có thể được viết dưới dạng .yml hoặc json
- Stacks: mỗi stack tương ứng với một hạ tầng, bao gồm tất cả các tài nguyên AWS có trong file template. Khi bạn khởi tạo, sửa hoặc xóa các tài nguyên hạ tầng, thực chất là bạn thao tác với CloudFormation stack.
- Change set: bộ thay đổi cần cập nhật cho stack hiện tại. Changeset cho phép bạn thấy trước được chi tiết các thay đổi trong hạ tầng trước khi nó được áp dụng.
CloudFormation Template
Trong phần này ta sẽ tìm hiểu chi tiết từng mục có trong file template.
Description (optional)
Mục này cho phép bạn mô tả template, thường được dùng để cung cấp thông tin về hạ tầng mà template sẽ tạo. Ví dụ trong file template.yml, ta khai báo Description như sau:
Description: >-
AWS CloudFormation sample template.
Here are some
details about
the template.
Parameter (optional)
Định nghĩa các tham số truyền vào file template khi khởi tạo hạ tầng. Ta có thể định nghĩa tham số như sau:
Parameters:
InstanceTypeParameter:
Type: String
Default: t2.micro
AllowedValues:
- t2.micro
- m1.small
- m1.large
Description: Enter t2.micro, m1.small, or m1.large. Default is t2.micro.
Trong đó:
- InstanceTypeParameter: tên của tham số
- Type: dạng dữ liệu, có thể là
String, Number, List<Number>, CommaDelimitedList
hoặc một số type riêng biệt của AWS - AllowedValues: tập giá trị của tham số
Một số lưu ý khi sử dụng tham số:
- Bạn có thể khai báo tối đa 200 tham số trong file template
- Tên tham số phải độc nhất trong file
- Tham số phải được khai báo và sử dụng trong cùng một file template.
Để sử dụng các tham số đã khai báo, ta sử dụng từ khóa "Ref". Ví dụ
Type: {"Ref" : "InstanceTypeParameter"}
Functions
Functions là một thành phần của template giúp bạn tương tác với dữ liệu. Function được biểu diễn trong template file theo 2 format: Fn::<FunctionName>
hoặc !<FunctionName>
Một số function phổ biến:
- Fn::And
Cú pháp:
"Fn::And" : [{condition}, {...}] Được sử dụng như toán tử AND để gộp các mệnh đề điều kiện
Ví dụ:
"Fn::And": [
<!-- condition 1 -->
{
"Fn::Equals": [
"sg-mysggroup",
{"Ref": "ASecurityGroup"}
]
},
<!-- condition 2 -->
{
"Fn::Contains": [
[
"m1.large",
"m1.small"
],
{"Ref": "InstanceType"}
]
}
]
- Fn::Contains
Kiểm tra một string có nằm trong list string
Cú pháp
"Fn::Contains" : [[list_of_strings], string]
Ví dụ:
"Fn::Contains" : [
["m1.large", "m1.small"], {"Ref" : "InstanceType"}
]
Ở đây ta kiểm tra giá trị biến InstanceType có nằm trong list: ["m1.large", "m1.small"] không.
- Fn::EachMemberEquals
Cú pháp
"Fn::EachMemberEquals" : [[list_of_strings], string]
Hàm này sẽ trả về true nếu tất cả thành phần trong [list_of_strings] đều có giá trị đúng bằng string
Ví dụ
"Fn::EachMemberEquals" : [
{"Fn::ValueOfAll" : ["Tags.Department"]}, "IT"
]
- Fn::EachMemberIn
Cú pháp
"Fn::EachMemberIn" : [[strings_to_check], [strings_to_match]]
Trả về true nếu tất list string đầu là tập con của list string sau. 5. Fn::Equals
Cú pháp:
"Fn::Equals" : ["value_1", "value_2"]
So sánh hai giá trị, trả về true nếu chúng bằng nhau và ngược lại.
- Fn::Not
Cú pháp
"Fn::Not" : [{condition}]
Hàm phủ định, hoạt động như toán tử NOT Ví dụ:
"Fn::Not" : [{"Fn::Equals" : [{"Ref" : "EnvironmentType"}, "prod"]}]
- Fn::Or
Cú pháp
"Fn::Or" : [{condition}, {...}]
Được sử dụng như toán tử OR để gộp các mệnh đề điều kiện
Ví dụ:
"Fn::Or" : [
{"Fn::Equals" : ["sg-mysggroup", {"Ref" : "ASecurityGroup"}]},
{"Fn::Contains" : [["m1.large", "m1.small"], {"Ref" : "InstanceType"}]}
]
- Fn::RefAll
Cú pháp:
"Fn::RefAll" : "parameter_type"
Trả về tất cả các giá trị tương ứng của một tham số AWS (tham số được định nghĩa sẵn bởi AWS). Ví dụ
"Fn::RefAll" : "AWS::EC2::VPC::Id"
Hàm trên sẽ trả về tất cả ID của VPC (Virtual Private Cloud) mà account aws có thể truy cập.
Mappings
Khai báo các biến có cấu trúc dữ liệu dạng map.
Ví dụ:
Mappings:
RegionMap:
us-east-1:
"HVM64": "ami-0ff8a91507f77f867"
us-west-1:
"HVM64": "ami-0bdb828fd58c52235"
eu-west-1:
"HVM64": "ami-047bb4163c506cd98"
ap-southeast-1:
"HVM64": "ami-08569b978cc4dfa10"
ap-northeast-1:
"HVM64": "ami-06cd52961ce9f0d85"
Ở đây ta khai báo một map có tên RegionMap.
Để truy vấn dữ liệu từ map, ta sử dụng function Fn::FindInMap
với cú pháp
Fn::FindInMap: [ MapName, TopLevelKey, SecondLevelKey ]
Ví dụ, nếu muốn truy xuất dữ liệu "ami-0ff8a91507f77f867" từ map RegionMap phía trên, ta sử dụng
!FindInMap [RegionMap, "us-east-1", "HVM64"]
Conditions
Định nghĩa các biến điều kiện trong template file.
Cú pháp
"Conditions" : {
"Logical ID" : {Intrinsic function}
}
Trong đó:
- Logical ID: tên biến điều kiện, cần đảm bảo độc nhất trong template
- Intrinsic function: hàm điều kiện, trả về giá trị true hoặc false
Ví dụ
Conditions:
isProd: !Equals [!Ref paramEnvironmentType, prod] # if 'prod' then TRUE, otherwise FALSE
isDev: !Equals [!Ref paramEnvironmentType, dev]
Ở đây ta định nghĩa hai biến điều kiện: isProd và isDev, giá trị của hai biến này phụ thuộc vào tham số paramEnvironmentType.
Các biến này sẽ được sử dụng làm điều kiện khởi tạo resources. Ví dụ:
Resources:
NewVolume:
Type: 'AWS::EC2::Volume'
Condition: isProd
Properties:
Size: 100
AvailabilityZone: !GetAtt
- EC2Instance
- AvailabilityZone
Ví dụ trên sẽ khởi tạo resource EC2 Volume nếu isProd trả về true.
Resources
Đây là mục quan trọng nhất, mục này định nghĩa các resource cần khởi tạo trên AWS.
Cú pháp:
Resources:
Logical ID:
Type: Resource type
Properties:
Set of properties
Trong đó:
- Logical ID: tên resource, cần đảm bảo độc nhất trong template.
- Type: kiểu resource, truy cập link để tìm hiểu thêm về các kiểu resource AWS hỗ trợ
- Properties: các thuộc tính của resource, mỗi kiểu resources sẽ có tập thuộc tính riêng.
Ví dụ:
Resources:
myEC2Instance: # create a new EC2 instance
Type: 'AWS::EC2::Instance'
Properties:
ImageId: !FindInMap # define imageId based on region
- mapRegion # map's name
- !Ref 'AWS::Region' # top level key which is a region where a new instance is being created
- AMI # second level key - e.g. for 'us-east-1' the value for ImageId is 'ami-0ff8a91507f77f867'
Tags:
- Key: CloudFormationLab
Value: !Join [' ', ['EC2 Instance for', !Ref AWS::Region] ]
Quản lý hạ tầng với AWS CLI
Sau khi đã có template file, ta có thể khởi tạo, quản lý hạ tầng và tài nguyên AWS thông qua hai cách: sử dụng giao diện web hoặc AWS CLI
Đối với cách thứ nhất, truy cập website https://aws.amazon.com/ , tiến hành đăng nhập và tìm kiếm mục "CloudFormation".
Trong phạm vi bài viết này, chúng ta sẽ thảo luận về cách thứ 2: tương tác thông qua AWS CLI.
Validate template
Bước đầu tiên sau khi tạo template là kiểm tra liệu cú pháp có hợp lệ. Ta có thể sử dụng lệnh sau:
aws cloudformation validate-template --template-body file://template.yml
Lưu ý cần có prefix file:// nếu không hệ thống sẽ báo lỗi An error occurred (ValidationError) when calling the CreateStack operation: Template format error: unsupported structure.
Khởi tạo stack
Để khởi tạo stack, ta sử dụng câu lệnh sau:
aws cloudformation create-stack \
--stack-name myteststack \
--template-body file://template.yml \
--parameters ParameterKey=Parm1,ParameterValue=test1 ParameterKey=Parm2,ParameterValue=test2
Với các tham số:
- "--stack-name": tên stack trên CloudFormation
- "--template-body": đường dẫn tới template file, ở đây là template.yml.
- "--parameters": các tham số truyền vào để ghi đè Parameters trong file template
Xem danh sách các stack
Để liệt kê các stack hiện đang có, sử dụng câu lệnh
aws cloudformation list-stacks --stack-status-filter CREATE_COMPLETE
Ở đây ta sử dụng "--stack-status-filter" để lọc các stack có trạng thái "CREATE_COMPLETE". Ngoài ra bạn có thể lọc với các trạng thái khác như: CREATE_FAILED, DELETE_COMPLETE, UPDATE_IN_PROGRESS, ...
Chi tiết về câu lệnh có thể xem tại đây.
Xem thông tin chi tiết của stack đã tạo
aws cloudformation describe-stacks --stack-name myteststack
Xem lịch sử cập nhật stack
aws cloudformation describe-stack-events --stack-name myteststack
Liệt kê các resources có trong stack
aws cloudformation list-stack-resources --stack-name myteststack
Get stack template
Trong trường hợp bạn muốn tái sử dụng template file của một stack, sử dụng câu lệnh sau:
aws cloudformation get-template --stack-name myteststack
Update stack
Sau khi cập nhật template file hoặc cần thay đổi tham số, bạn có thể cập nhật stack với câu lệnh aws cloudformation update-stack
aws cloudformation update-stack --stack-name mystack \
--template-body file://template.yml \
--parameters ParameterKey=VPCID,UsePreviousValue=true ParameterKey=SubnetIDs,ParameterValue=SampleSubnetID1\\,UpdatedSampleSubnetID2
Xóa stack
aws cloudformation delete-stack --stack-name myteststack
Phần kết
Trong bài viết này, mình đã giới thiệu sơ lược qua về công cụ AWS CloudFormation, các thành phần trong template file và cách tương tác với CloudFormation thông qua giao diện dòng lệnh AWS CLI. Hy vọng kiến thức bổ ích cho mọi người!
All rights reserved