0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

AWS CloudFormation Hướng Dẫn Thực Hành: Tạo EC2 Instance với EBS Volume

Đăng vào 1 tuần trước

• 6 phút đọc

Tổng Quan

Trong bài viết này, chúng ta sẽ cùng nhau thực hiện từng bước để triển khai một EC2 instance cùng với EBS Volume sử dụng CloudFormation template. Đây là một kỹ thuật rất hữu ích cho việc quản lý hạ tầng trên AWS một cách tự động và hiệu quả.

Thực Hành

Bước 1: Tạo Tệp Template.yml

Khởi tạo tệp template.yml với nội dung sau:

Copy
Description: >-
  AWS CloudFormation sample template. 
  Create a new EC2 instance and if environment is 'prod' then attach a new EBS volume to it

Bổ sung các tham số (parameters):

Copy
## =================== PARAMETERS ===================
Parameters:
  paramEnvironmentType: # yêu cầu người dùng định nghĩa môi trường như 'dev', 'qa' hoặc 'prod'
    Description: Loại môi trường
    Default: dev # Mặc định là môi trường 'dev'
    Type: String
    AllowedValues: [dev, qa, prod]
    ConstraintDescription: Phải chỉ định 'dev', 'qa' hoặc 'prod'
  paramTagValues: # yêu cầu người dùng chỉ định giá trị cho tags
    Description: 'Danh sách giá trị tags phân cách bằng dấu phẩy tương ứng với các phòng ban'
    Type: CommaDelimitedList
    Default: 'Development, Operation, Finance'

Tại đây, chúng ta đã khai báo hai tham số chính:

  • paramEnvironmentType: Đại diện cho loại môi trường đang triển khai, có thể là dev, qa hoặc prod.
  • paramTagValues: Danh sách các giá trị phân cách bằng dấu phẩy sẽ được sử dụng làm tag cho các tài nguyên.

Tiếp theo, khởi tạo một đối tượng map trong mục Mapping:

Copy
## =================== MAPPINGS ===================
Mappings: # ánh xạ ID hình ảnh với các khu vực
  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

Đối tượng này sẽ lưu giữ ID hình ảnh EC2 mà chúng ta sẽ tạo cho từng vùng (region) riêng biệt.

Tiếp theo, khởi tạo Điều kiện (Condition):

Copy
## =================== CONDITIONS ===================
Conditions:
  isProd: !Equals [!Ref paramEnvironmentType, prod] # nếu là 'prod' thì TRUE, ngược lại FALSE
  isDev: !Equals [!Ref paramEnvironmentType, dev]   # nếu là 'dev' thì TRUE, ngược lại FALSE

Hai biến điều kiện này sẽ xác định loại môi trường hiện tại dựa trên tham số paramEnvironmentType mà chúng ta đã khai báo trước đó.

Cuối cùng, chúng ta sẽ thêm các tài nguyên (resources), bao gồm: EC2 Instance, EBS Volume và VolumeAttachment (để liên kết EC2 instance với volume).

Copy
Resources:
  myEC2Instance: # tạo một EC2 instance mới
    Type: 'AWS::EC2::Instance'
    Properties:
      ImageId: !FindInMap # xác định ImageId dựa trên vùng
        - mapRegion # tên của map
        - !Ref 'AWS::Region' # khóa cấp cao nhất xác định vùng mà instance mới sẽ được tạo
        - AMI # khóa cấp hai - ví dụ: 'us-east-1' giá trị cho ImageId là 'ami-0ff8a91507f77f867'
      InstanceType: !If [isProd, t2.micro, !If [isDev, t2.nano, t1.micro]] # nếu 'prod' thì t2.micro, nếu 'dev' thì t2.nano, còn lại thì t1.micro
      Tags:
      - Key: CloudFormationLab
        Value: !Join [' ', ['EC2 Instance for', !Ref AWS::Region]]

  myVolume: # tạo một EBS volume mới chỉ khi môi trường là 'prod'
    Type: 'AWS::EC2::Volume'
    Condition: isProd # điều kiện để tạo EBS volume, chỉ nếu môi trường là 'prod'
    Properties:
      Size: 20 # 20 GiB
      AvailabilityZone: !GetAtt myEC2Instance.AvailabilityZone # lấy AZ của EC2 instance mới
      Tags:
        - Key: CloudFormationLab
          Value: !Select [0, !Ref paramTagValues] # kết quả là 'Development' - giá trị đầu tiên trong danh sách tham số.

  myMountPoint: # gắn một EBS volume với một EC2 instance chỉ khi môi trường là 'prod'
    Type: 'AWS::EC2::VolumeAttachment'
    Condition: isProd # điều kiện để gắn EBS volume, chỉ nếu môi trường là 'prod'
    Properties:
      InstanceId: !Ref myEC2Instance # tham chiếu đến EC2 instance
      VolumeId: !Ref myVolume # tham chiếu đến EBS volume
      Device: /dev/sdh

Chi tiết về các tài nguyên được tạo:

  • myEC2Instance: Là tài nguyên kiểu AWS::EC2::Instance với các thuộc tính như ImageId (tìm từ map mapRegion), InstanceType (lựa chọn loại instance dựa vào điều kiện), và Tags (nhãn gán cho tài nguyên).
  • myVolume: Là tài nguyên kiểu AWS::EC2::Volume với các thuộc tính như kích thước 20GB, khu vực AvailabilityZone hút từ myEC2Instance và nhãn tag. Resource này chỉ được tạo nếu điều kiện isProd là TRUE.
  • myMountPoint: Là tài nguyên kiểu AWS::EC2::VolumeAttachment với các thuộc tính tương tự như InstanceId, VolumeId và Device. Resource này cũng chỉ được tạo khi điều kiện isProd là TRUE.

Vậy là chúng ta đã hoàn thành phần khởi tạo template, bạn có thể tham khảo tệp template hoàn chỉnh tại đây. Để tìm hiểu chi tiết về cú pháp trong tệp template, truy cập vào mục "CloudFormation Template" trong bài viết "Sơ lược về CloudFormation".

Bước 2: Tạo Hạ Tầng Cơ Sở (Infrastructure)

Tại bước này, chúng ta sẽ khởi tạo tài nguyên AWS đã định nghĩa trong tệp Template bằng cách sử dụng AWS CLI. Chạy lệnh sau để tạo stack:

aws cloudformation create-stack --stack-name ec2-with-volume --template-body file://template.yml

Kiểm tra trạng thái stack vừa tạo bằng lệnh:

aws cloudformation describe-stacks --stack-name ec2-with-volume

Chú ý đến trạng thái stack: "StackStatus": "CREATE_COMPLETE".

Bước 3: Xem Stack Trên Website

Truy cập vào website AWS, tiến hành đăng nhập và tìm kiếm mục "CloudFormation":

Nhấp vào tên stack mà bạn vừa khởi tạo, tại đây bạn sẽ thấy nhiều thông tin về stack như ID, trạng thái, thời gian khởi tạo, cùng các mục đã định nghĩa trong tệp template như Resources, Parameters, Outputs, ...

Truy cập vào tab Resources, bạn sẽ thấy hiện tại chỉ có myEC2Instance được khởi tạo. Nguyên nhân có thể là do trong tệp template, giá trị mặc định của tham số paramEnvironmentType là "dev", nên điều kiện isProd sẽ trả về FALSE, do đó hai resource myVolumemyMountPoint sẽ không được tạo.

Bước 4: Cập Nhật Stack

Trong phần này, chúng ta sẽ cập nhật tham số paramEnvironmentType sang giá trị "prod". Chạy lệnh sau để khởi tạo ChangeSet:

aws cloudformation create-change-set --stack-name ec2-with-volume --change-set-name updateParamEnvironmentType --use-previous-template --parameters ParameterKey="paramEnvironmentType",ParameterValue="prod"

Truy cập vào giao diện web, trong tab "Change sets", nhấp vào ChangeSet vừa tạo:
Bạn sẽ thấy các thay đổi sẽ được áp dụng nếu execute ChangeSet, bao gồm việc hai resource sẽ được tạo mới và một resource sẽ được cập nhật.

Tiến hành execute ChangeSet với lệnh:

aws cloudformation execute-change-set --stack-name ec2-with-volume --change-set-name updateParamEnvironmentType

Theo dõi trạng thái stack trên website, bạn sẽ thấy cả 3 resource đã được khởi tạo thành công!

Bước 5: Xóa Stack

Cuối cùng, sau khi thực hành xong, đừng quên xóa stack:

aws cloudformation delete-stack --stack-name ec2-with-volume
Kiểm tra trên giao diện web để chắc chắn rằng bạn đã xóa stack thành công.

Kết Luận

Trong bài viết này, mình đã chia sẻ chi tiết từng bước để triển khai EC2 instance với EBS Volume sử dụng CloudFormation template. Hy vọng rằng bài viết này sẽ giúp ích cho bạn trong việc làm quen với dịch vụ AWS CloudFormation. Cảm ơn bạn đã đọc!
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào