+2

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:

  1. 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"}
    ]
  }
]
  1. 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.

  1. 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"
]
  1. 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.

  1. 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"]}]
  1. 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"}]}
]
  1. 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".

image.png

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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí