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:
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):
## =================== 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:
## =================== 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):
## =================== 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).
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 myVolume và myMountPoint 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