Thực hành AWS CloudFormation – Phần 3. Các hàm cơ bản

5 min read

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).

Tài liệu tham khảo



Avatar photo

Clean Code: Nguyên tắc viết hàm trong lập trình…

Trong quá trình phát triển phần mềm, việc viết mã nguồn dễ đọc, dễ hiểu là yếu tố then chốt để đảm bảo code...
Avatar photo Dat Tran Thanh
3 min read

Clean Code: Nguyên tắc comment trong lập trình

Trong lập trình, code không chỉ là một tập hợp các câu lệnh để máy tính thực thi, mà còn là một hình thức...
Avatar photo Dat Tran Thanh
3 min read

Clean Code: Nguyên tắc xử lý lỗi (Error Handling)

Trong quá trình phát triển phần mềm, việc xử lý lỗi không chỉ là một phần quan trọng mà còn ảnh hưởng trực tiếp...
Avatar photo Dat Tran Thanh
4 min read

Leave a Reply

Your email address will not be published. Required fields are marked *