Bài viết này sẽ hướng dẫn bạn về các chức năng cơ bản của AWS CloudFormation, là các chức năng tích hợp sẵn có thể giúp bạn quản lý các stack của mình.
Fn::Ref
Nếu bạn cần sử dụng các giá trị được tạo động (dynamic), những giá trị cần thiết cho những tài nguyên khác, nhưng bạn chỉ biết được giá trị đó có lúc runtime? Ví dụ, bạn cần tạo một VPC mới và một Security group mới trong cùng một stack; và bạn cần truyền ID của VPC vào Security group. Đây là cách bạn có thể làm điều đó:
Resources:
mySecurityGroup: # Logical ID
Type: 'AWS::EC2::SecurityGroup'
Properties:
GroupDescription: My description here
VpcId:
Ref: myVPC # ref to VPC that will be created by CloudFormation
# etc.
myVPC: # Logical ID
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
# etc.
Một cách khác để sử dụng Ref là với Parameters. Giả sử bạn cần tạo một instance EC2 mới và cần truyền các key pair của EC2 và tag của instance trong quá trình tạo stack.
Parameters:
paramTagValue: # declare paramTagValue as a parameter
Description: Value of tag for EC2 instance
Type: String
paramKeyName: # declare paramKeyName as a parameter
Description: Name of an existing EC2 KeyPair to enable SSH access into the server
Type: 'AWS::EC2::KeyPair::KeyName'
Resources:
myEc2Instance: # Logical ID
Type: 'AWS::EC2::Instance'
Properties:
InstanceType: t2.micro
ImageId: ami-5b41123e
Tags:
- Key: CloudFormationLab
Value: !Ref paramTagValue # ref to Parameters
KeyName: !Ref paramKeyName # ref to Parameters
Lưu ý rằng Parameters cho phép bạn truyền input của người dùng tại thời điểm tạo hoặc khi cập nhật stack (sẽ được thảo luận trong các phần tiếp theo của series này).
Cách thứ ba để sử dụng Ref là như một pseudo parameter. Pseudo parameters là các tham số được định nghĩa trước bởi AWS CloudFormation. Ví dụ, nếu bạn cần lấy vùng mà tài nguyên của bạn đang được tạo, ví dụ us-west-1? Trong trường hợp đó, sử dụng AWS::Region:
Tags:
- Key: CloudFormationLab
Value: !Ref AWS::Region # use pseudo parameter to get a region
Các pseudo parameters khác:
- AWS::AccountId (trả về AWS account ID của tài khoản mà stack đang được tạo)
- AWS::StackId (trả về tên arn của stack)
- AWS::StackName (trả về tên của stack)
- AWS::NoValue (hoạt động như giá trị null)
Xem toàn bộ danh sách bằng cách truy cập tài liệu tham khảo Pseudo parameters của AWS.
Fn::Select
Select cho phép bạn chọn một mục từ một danh sách. Giả sử bạn có một danh sách các CIDR blocks và cần tạo 3 subnet bằng cách truyền CIDR block đầu tiên vào subnet đầu tiên, CIDR block thứ hai vào subnet thứ hai, và cứ thế. Đây là cách bạn có thể làm điều đó:
Parameters:
paramDbSubnetIpBlocks:
Description: 'Comma-delimited list of three CIDR blocks'
Type: CommaDelimitedList
Default: '10.0.48.0/24, 10.0.112.0/24, 10.0.176.0/24'
Resources:
myFirstSubnet: # Logical ID
Type: 'AWS::EC2::Subnet'
Properties:
VpcId: !Ref myVPC
CidrBlock: !Select [ 0, !Ref paramDbSubnetIpBlocks ] # output is 10.0.48.0/24
# etc.
mySecondSubnet: # Logical ID
Type: 'AWS::EC2::Subnet'
Properties:
VpcId: !Ref myVPC
CidrBlock: !Select [ 1, !Ref paramDbSubnetIpBlocks ] # output is 10.0.112.0/24
# etc.
myVPC:
Type: 'AWS::EC2::VPC'
Properties:
# etc
Fn::Join
Với Join bạn có thể lấy một tập hợp các giá trị và nối chúng thành một giá trị duy nhất, được ngăn cách bằng dấu phân cách xác định. Đây là một ví dụ:
Tags:
- Key: CloudFormationLab
Value: !Join [ ' ', [ 'SecurityGroup', 'for', !Ref AWS::Region ] ]
# Output is “SecurityGroup for us-west-1”
Fn::Split
Split là chức năng ngược lại của Join. Nó chia một chuỗi thành một danh sách các giá trị chuỗi. Thường được sử dụng với Select. Giả sử rằng giá trị của tham số là một chuỗi phân cách bằng dấu phẩy thay vì danh sách. Bạn vẫn có thể dễ dàng chuyển đổi chuỗi này thành một danh sách.
Parameters:
paramDbSubnetIpBlocks:
Description: 'Comma-delimited string of three CIDR blocks'
Type: CommaDelimitedList
Default: '10.0.48.0/24, 10.0.112.0/24, 10.0.176.0/24'
Resources:
myFirstSubnet: # Logical ID
Type: 'AWS::EC2::Subnet'
Properties:
VpcId: !Ref VPC
CidrBlock: !Select [ 0, !Split [',', !Ref paramDbSubnetIpBlocks]] # output is 10.0.48.0/24
# etc.
mySecondSubnet: # Logical ID
Type: 'AWS::EC2::Subnet'
Properties:
VpcId: !Ref VPC
CidrBlock: !Select [ 1, !Split [',', !Ref paramDbSubnetIpBlocks]] # output is 10.0.112.0/24
# etc.
Fn::FindInMap
Bắt đầu với Mappings. Tại sao bạn cần nó? Giả sử bạn muốn cung cấp một instance EC2 mới và muốn chỉ định image ID (AMI) dựa trên vùng mà instance của bạn đang được tạo. Ví dụ, đối với vùng North Virginia (‘us-east-1’) bạn cần sử dụng image id ‘ami-1853ac65’ và đối với Singapore (‘ap-southeast-1’) – ‘ami-e2adf99e’. Trong trường hợp này, bạn có thể sử dụng Mappings, cho phép bạn tạo các từ điển đơn giản “key” để sử dụng trong các khai báo tài nguyên của mình.
Mappings: # map image ids with regions
mapRegion:
us-east-1:
AMI: ami-1853ac65
us-west-1:
AMI: ami-bf5540df
eu-west-1:
AMI: ami-3bfab942
ap-southeast-1:
AMI: ami-e2adf99e
ap-southeast-2:
AMI: ami-43874721
Bây giờ, để gọi mapping của bạn và lấy giá trị dựa trên key, bạn cần sử dụng hàm FindInMap:
Mappings: # map image ids with regions
mapRegion:
us-east-1:
AMI: ami-1853ac65
us-west-1:
AMI: ami-bf5540df
# etc.
Resources:
myEc2Instance: # Logical ID
Type: 'AWS::EC2::Instance'
Properties:
InstanceType: t2.micro
ImageId: !FindInMap # define imageId based on region
- mapRegion # map's name
- !Ref 'AWS::Region' # top level key which is a region where your instance is being created
- AMI # second level key - e.g. for 'us-east-1' the value for ImageId is 'ami-1853ac65'
Các hàm tích hợp khác
Chúc mừng bạn đã đọc tới đây! Đến bây giờ, chúng ta đã đi qua các hàm tích hợp quan trọng nhất. Những hàm khác có thể sẽ được thảo luận ở những phần tiếp theo, dưới đây là danh sách các hàm:
- Fn::Base64 – trả về biểu diễn Base64 của chuỗi đầu vào
- Fn::Cidr – trả về một mảng các khối địa chỉ CIDR
- Fn::ImportValue – trả về giá trị của một đầu ra được xuất bởi một stack khác
- Fn::Sub – thay thế các biến trong một chuỗi đầu vào bằng các giá trị mà bạn chỉ định
- Fn::Transform – chỉ định một macro để thực hiện xử lý tùy chỉnh trên một phần của mẫu stack
Kết luận
Các hàm built-in rất hữu ích và hiệu quả nếu bạn muốn bắt đầu viết các template của mình. Còn một nhóm các hàm built-in nữa, gọi là Condition functions, sẽ được đề cập trong phần sau của loạt bài Hands-on AWS CloudFormation. Sau khi chúng ta hoàn thành với các hàm, chúng ta có thể bắt đầu sử dụng chúng trong các mẫu tùy chỉnh (custom templates).