Trong bài trước, chúng ta đã đi qua một số Pseudo parameters và Intrinsic functions như là Ref, GetAtt, GetAZs, FindInMap, Select, Join, Split. Vẫn còn một vài Intrinsic functions rất hữu dụng và chưa được đề cập tới. Chúng ta hãy cùng đi qua Condition functions (Điều kiện) và thử tạo một template và một stack sử dụng các intrinsic functions chúng ta đã đi qua.
Intrinsic Functions – Điều kiện
Trong trường hợp bạn cần làm việc trên 2 môi trường dev và prod, chúng ta có một số yêu cầu sau:
- Tạo mới một resource là EC2
- Thêm EBS attach với EC2 vừa tạo, nhưng chỉ ở môi trường prod, để tiết kiệm chi phí ở môi trường dev
Parameters:
paramEnvironmentType: # Hỏi người dùng chọn 'dev' hoặc 'prod'
Description: Environment type
Default: dev # Mặc định là 'dev'
Type: String
AllowedValues: [dev, prod]
ConstraintDescription: 'dev' or 'prod'
Conditions:
isProd: !Equals [!Ref paramEnvironmentType, prod] # TRUE nếu là 'prod', ngược lại FALSE
Resources:
myVolume: # Tạo EBS volume chỉ khi là 'prod'
Type: 'AWS::EC2::Volume'
Condition: isProd # Điều kiện khởi tạo cho resource này
Properties:
Size: 100
Giải thích chi tiết:
- Parameters: Trong phần này, chúng ta khai báo paramEnvironmentType, là một tham số đầu vào. Người dùng sẽ chọn giá trị ‘dev’ hoặc ‘prod’ khi tạo stack.
- Conditions: Chúng ta khai báo biến boolean isProd, dùng để kiểm tra môi trường triển khai (‘dev’ hay ‘prod’) dựa trên giá trị của paramEnvironmentType.
- Resources: Sử dụng hàm Condition để tham chiếu đến biến isProd.
• Kết quả:
- Nếu môi trường là ‘prod’, AWS CloudFormation sẽ tạo EBS volume.
- Nếu là ‘dev’, CloudFormation sẽ bỏ qua tài nguyên này.
AWS CloudFormation cũng cung cấp 5 hàm Intrinsic để tạo tài nguyên dựa trên điều kiện như:
- Fn::Equals: So sánh giá trị
Conditions:
isProd: !Equals [!Ref paramEnvironmentType, prod] # TRUE nếu 'prod', ngược lại FALSE
- Fn::And: Trả về TRUE nếu tất cả các điều kiện là TRUE, FALSE nếu ít nhất một điều kiện là FALSE.(Lưu ý: Tối đa 10 điều kiện cho mỗi hàm Fn::And)
Conditions:
isProd: !Equals [!Ref paramEnvironmentType, prod]
isCreateS3Bucket: !And
- !Equals [!Ref paramMonth, 'January'] # TRUE nếu là 'January'
- !Condition isProd # TRUE nếu là 'prod'
- Fn::Or: Trả về TRUE nếu bất kỳ điều kiện nào là TRUE, FALSE nếu tất cả là FALSE. (Lưu ý: Tối đa 10 điều kiện cho mỗi hàm Fn::Or)
Conditions:
isProd: !Equals [!Ref paramEnvironmentType, prod]
isCreateS3Bucket: !Or
- !Equals [!Ref paramMonth, 'January'] # TRUE nếu là 'January'
- !Condition isProd # TRUE nếu là 'prod'
- Fn::Not: Đảo ngược kết quả: TRUE thành FALSE, FALSE thành TRUE.
Conditions:
isNonProd: !Not [!Equals [!Ref paramEnvironmentType, prod]] # TRUE nếu không phải 'prod'
- Fn::If: Lựa chọn giá trị dựa trên điều kiện.
Conditions:
isProd: !Equals [!Ref paramEnvironmentType, prod]
Resources:
myEC2Instance:
Type: 'AWS::EC2::Instance'
Properties:
InstanceType: !If [isProd, t2.large, t2.micro] # 't2.large' nếu 'prod', ngược lại 't2.micro'