Giới thiệu
Chào các bạn tới với hành trình chinh phục Terraform. Ở bài đầu tiên chúng ta sẽ tìm hiểu IaC (Infrastructure as Code) là gì, Terraform là gì và tại sao ta cần nó.
Infrastructure as Code
Từ cái tên của Infrastructure as Code thì ta có thể hiểu đơn giản là ta sẽ viết code để mô tả và cung cấp (provisioning) Infrastructure của chúng ta 😁. Từ Infrastructure tiếng việt có nghĩa là hạ tầng, còn ở trong ngành IT của chúng ta thì nó là hạ tầng của hệ thống, bao gồm máy chủ, mạng, Gateway, Database, tất cả những thứ cần thiết để triển khai ứng dụng của chúng ta trên môi trường máy chủ. Infrastructure as Code phù hợp nhất cho hạ tầng trên môi trường Cloud.
Ví dụ ở trên AWS Cloud, bình thường thì ta sẽ đăng nhập lên Web Console, rồi ta cần máy ảo thì ta thao tác trên Console để tạo máy ảo (EC2), ta cần database thì ta sẽ thao tác trên web để tạo database. Và từ từ thì hạ tầng hệ thống của chúng sẽ phình to ra, đây là lúc ta sẽ gặp vấn đề, ta sẽ không biết hệ thống hiện tại ta đang có những gì, cho dù ta có nhớ đi nữa thì lỡ người quản lý Cloud đó nghỉ việc, người mới vào sẽ làm sao biết được hạ tầng hiện tại? Ngoài ra, nếu lỡ có ai đó xóa EC2 của ta thì sao, ta phải tạo lại nó bằng tay, mà ta đâu biết là thằng EC2 lúc trước nó tạo ra với config thế nào, cho dù có ghi chú đi nữa thì việc tạo lại rất mất thời gian. Và nếu lỡ nguyên hạ tầng Cloud nó chết luôn thì sao? Không lẻ ta phải tạo lại nguyên cái hạ tầng hệ thống từ đầu? IaC sẽ giúp ta giải quyết những vấn trên, ta sẽ viết code để mô tả và sao lưu lại hạ tầng của chúng ta, nếu có việc gì xảy ra như nguyên hạ tầng chết hoặc ai đó sửa gì sai trên hạ tầng của ta thì ta có thể dễ dàng triển khai nó lại một cách dễ dàng.
Terraform
Trong mảng IaC này thì công cụ thông dụng nhất ở thời điểm hiện tại là Terraform. Terraform được phát triển bởi HashiCorp, chuyên dùng để cung cấp Infrastructure, ta chỉ việc viết code, rồi gõ một vài câu lệnh đơn giản, nó sẽ tạo ra Infrastructure cho ta, thay vì ta với lên Web Console bấm bấm rất tốn thời gian.
Luồng của Terraform sẽ như sau, ta viết code, xong ta gõ câu lệnh, và đợi Terraform cung cấp Infrastructure, sau khi Terraform tạo xong thì nó sẽ tạo ra một tệp tin được gọi là Terraform State để lưu lại kiến trúc hạ tầng hiện tại.
Có nhiều công cụ khác cũng làm được việc này, ví dụ như Ansible. Nhưng Ansible là một công cụ phục vụ cho việc Configuration, chứ nó không được tạo ra để tập trung cho mảng IaC, nên ta dùng Ansible thì sẽ tốn công chạy những thứ không cần thiết 😁.
Để triển khai một ứng dụng thì ta có thể làm nguyên luồng sau đây, dùng Terraform để tạo hạ tầng, sau đó dùng Ansible để cấu hình những thứ cần thiết cho máy chủ, như cài Docker, cấu hình công cụ CI trên máy chủ, … Sau đó thì ta dùng Docker hoặc Kubernetes để chạy ứng dụng.
Tại sao nên dùng Terraform
Bốn ưu điểm của Terraform so với các công cụ khác:
- Dễ xài
- Mã nguồn mở và miễn phí
- Declarative programing: chỉ diễn tả những thứ bạn cần và Terraform làm cho bạn
- Có thể cung cấp hạ tầng cho nhiều Cloud khác nhau như AWS, GCP, Azure trong cùng một tệp tin cấu hình (Cloud-Agnostic)
Tiếp theo ta làm một ví dụ nhỏ để hiểu hơn. Trong series này mình sẽ dùng Terraform để cung cấp hạ tầng trên AWS (tại mấy Cloud cái khác mình chưa xài 😂).
Để làm được bài này yêu cầu bạn phải có tài khoản AWS và IAM User với quyền Admin. Các bạn làm theo các bước ở đây nha AWS CLI Configure Quickstart. Sau khi có được Access Key
thì bạn tạo tệp tin tên là ~/.aws/credentials
với nội dung sau:
[default]
aws_access_key_id=<your-key>
aws_secret_access_key=<your-key>
Sau đó ta cài Terraform ở link này Terraform Installition. Oke, tiếp theo ta bắt đầu viết code.
“Hello Terraform!”
Ở ví dụ này ta sẽ dùng Terraform để tạo một EC2 trên AWS Cloud, ngôn ngữ Terraform sử dụng gọi là HashiCorp Configuration Language (HCL).
Các bước ta thực hiện như sau:
- Viết tệp tin Terraform
- Cấu hình AWS Provider
- Khỏi tạo Terraform bằng câu lệnh
terraform init
- Triển khai EC2 Instance bằng câu lệnh
terraform apply
- Xóa EC2 bằng câu lệnh
terraform destroy
Tạo một file tên là main.tf
:
provider "aws" {
region = "us-west-2"
}
Ta chỉ định ta sử dụng provider
tên là aws
, và resource
của ta sẽ được tạo ở Region là us-west-2. Sau đó ta thêm vào đoạn code tạo EC2:
provider "aws" {
region = "us-west-2"
}
resource "aws_instance" "hello" {
ami = "ami-09dd2e08d601bff67"
instance_type = "t2.micro"
tags = {
Name = "HelloWorld"
}
}
Ở trên ta sử dụng một block
tên là resources
, đây là block
quan trọng nhất của Terraform, ta sử dụng block này để tạo resource của chúng ta. Phía sau resource
thì ta sẽ có thêm giá trị nữa là resource type
mà ta muốn tạo (cái này phụ thuộc vào Provider của chúng ta sẽ cung cấp những resource type
nào) , ví dụ ở trên là aws_instance, và giá trị cuối cùng là tên của resource
đó, này ta muốn đặt gì cũng được.
Để xem những thuộc tính của một resource
nào đó, ta lên trang Terraform Registry để xem. Ví dụ ở đây mình cần xem thuộc tính của aws_instance của aws.
Ta bấm qua Documentation.
Tìm kiếm aws_instance
.
Mỗi resource
của chúng ta sẽ có giá trị arguments (đầu vào) và attributes (đầu ra) tùy thuộc vào resource type
, và giá trị đầu ra sẽ có loại gọi là computed attributes
, là những giá trị ta chỉ biết được khi resource
đã được tạo ra.
Xong khi ta viết cấu hình xong hết, thì ta mở terrminal lên và gõ terraform init
, bước này là bắt buộc khi ta viết một cấu hình cho hạ tầng mới, nó sẽ tải code của provider
xuống thư mục hiện tại nơi chứa tệp tin main.tf
.
terraform init
Initializing the backend...
Initializing provider plugins...
- Finding latest version of hashicorp/aws...
- Installing hashicorp/aws v3.66.0...
- Installed hashicorp/aws v3.66.0 (signed by HashiCorp)
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.
Sau khi init xong, ta gõ tiếp câu lệnh apply để nó tạo EC2 cho ta.
terraform apply -auto-approve
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the
following symbols:
+ create
Terraform will perform the following actions:
# aws_instance.hello will be created
+ resource "aws_instance" "hello" {
+ ami = "ami-09dd2e08d601bff67"
...
Plan: 1 to add, 0 to change, 0 to destroy.
aws_instance.hello: Creating...
aws_instance.hello: Still creating... [10s elapsed]
aws_instance.hello: Still creating... [20s elapsed]
...
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Sau khi nó chạy xong, ta lên Web Console của mình, ta sẽ thấy EC2 đã được tạo 😁.
Bây giờ nếu ta muốn xóa EC2 đi, ta chỉ cần chạy câu lệnh destroy
.
terraform destroy -auto-approve
aws_instance.hello: Refreshing state... [id=i-0ec68130272c45152]
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the
following symbols:
- destroy
Terraform will perform the following actions:
# aws_instance.hello will be destroyed
- resource "aws_instance" "hello" {
- ami = "ami-09dd2e08d601bff67" -> null
...
Plan: 0 to add, 0 to change, 1 to destroy.
aws_instance.hello: Destroying... [id=i-0ec68130272c45152]
aws_instance.hello: Still destroying... [id=i-0ec68130272c45152, 10s elapsed]
aws_instance.hello: Still destroying... [id=i-0ec68130272c45152, 20s elapsed]
aws_instance.hello: Still destroying... [id=i-0ec68130272c45152, 30s elapsed]
aws_instance.hello: Destruction complete after 35s
Destroy complete! Resources: 1 destroyed.
Ta lên Web Console thì ta sẽ thấy là EC2 của ta đã được xóa thành công. Vậy là ta đã hoàn thành ví dụ đầu tiên với Terraform.
Kết luận
Vậy là ta đã tìm hiểu xong về IaC là gì và Terraform sử dụng như thế nào. Như bạn thấy thì với Terraform, ta tạo và xóa resource
đi một cách rất dễ dàng. Bài tiếp theo mình sẽ nói sâu hơn về cách viết cấu hình code.
Nếu bài viết có gì sai hoặc cần cập nhật thì liên hệ Admin.
Tham gia nhóm chat của DevOps VN tại Telegram.
Kém tiếng Anh và cần nâng cao trình độ giao tiếp: Tại sao bạn học không hiệu quả?