Terraform là công cụ có khả năng quản lý cơ sở hạ tầng dưới dạng mã Code của HashiCorp. Nó là một công cụ để xây dựng, thay đổi và quản lý cơ sở hạ tầng một cách an toàn. Các nhóm vận hành hệ thống và cơ sở hạ tầng có thể sử dụng Terraform để quản lý môi trường bằng ngôn ngữ được gọi là Ngôn ngữ cấu hình HashiCorp (HCL) để con người có thể đọc được, và tự động hóa triển khai.
I. Cấu hình file
Tập hợp các tập tin được sử dụng để mô tả cơ sở hạ tầng ở Terraform được gọi đơn giản là “Terraform configuration”. Terraform sử dụng ngôn ngữ cấu hình riêng của nó, dùng để mô tả ngắn gọn về cơ sở hạ tầng.
Trong Terraform, chúng sử dụng ngôn ngữ được gọi là HCL (Hashcorp Configuration Language). Các file cấu hình có thể sử dụng dạng JSON, nhưng dạng này ít khi được sử dụng trong Terraform.
II. Cài đặt Terraform
1. Cập nhật hệ thống
sudo apt update -y
sudo apt upgrade -y
2. Thêm key của Hashicorp
wget -O- https://apt.releases.hashicorp.com/gpg | \
gpg --dearmor | \
tee /usr/share/keyrings/hashicorp-archive-keyring.gpg
gpg --no-default-keyring \
--keyring /usr/share/keyrings/hashicorp-archive-keyring.gpg \
--fingerprint
3. Thêm nguồn của Hashicorp
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] \
https://apt.releases.hashicorp.com $(lsb_release -cs) main" | \
tee /etc/apt/sources.list.d/hashicorp.list
4. Cài đặt Terraform.
sudo apt install terraform -y
Như vậy, chúng ta vừa thực xong bước cài đặt Terraform
III. Các kiến thức cốt lõi.
Một cấu hình dạng Terraform bao gồm một mô-đun gốc (root module). Các mô-đun con bên trong, khi chúng gọi lẫn nhau sẽ tạo thành một cây thư mục con.
Thành phần nhỏ nhất của việc cấu hình là các đối số. Tập hợp nhiều đối số tạo thành khối và nhiều khối sẽ tạo thành module.
Mục đích chính của ngôn ngữ Terraform là khai báo các resource sử dụng. Tất cả các tính năng của những ngôn ngữ khác, mục đích cũng chỉ là để làm cho việc định nghĩa của resource linh hoạt hơn và thuận tiện hơn mà thôi.
Một nhóm các Resource có thể được tập hợp chung vào một module, tạo ra một đơn vị cấu hình lớn hơn. Trong khi, một tài nguyên dùng để cấu hình cơ sở hạ tầng, còn mô-đun có thể mô tả, cấu hình một tập hợp nhiều đối tượng và thể hiện các mối quan hệ cần thiết giữa chúng để tạo ra một hệ thống phức tạp hơn.
Vì vậy, trong thư mục Terraform root , có thể có nhiều thư mục module được gọi là root Module. Tệp fin “tf” có thể được gọi từ bất kỳ nơi nào, kể cả từ Github.
1. Lệnh init, plan, và apply.
Tạo thư mục hello-terraform
.
cd $HOME
mkdir hello-terraform
cd hello-terraform
Tạo file main.tf với nội dung sau.
cat > main.tf <<EOF
provider "local" {
}
resource "local_file" "hello" {
content = "Hello, Terraform"
filename = "hello.txt"
}
EOF
Tệp main.tf chứa hai khối: khai báo trình provider và định nghĩa resource . Các provider tuyên bố rằng chúng ta sẽ sử dụng các local được cung cấp bởi một phiên bản tương thích nào đó.
Tiếp theo, chúng ta có một định nghĩa resource có tên hello kiểu local_file . Loại resource này , như tên của nó, chỉ là một file trên hệ thống file cục bộ với nội dung đã cho.
Vì đây là lần đầu tiên chúng ta chạy dự án này, chúng ta cần khởi tạo nó bằng lệnh init :
$ terraform init
Initializing the backend...
Initializing provider plugins...
- Reusing previous version of hashicorp/local from the dependency lock file
- Using previously-installed hashicorp/local v1.4.0
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
Trong bước này, Terraform quét các file dự án của chúng ta và tải xuống bất kỳ provider nào được yêu cầu – provider là local , trong trường hợp của chúng ta.
Tiếp theo, chúng ta sử dụng lệnh plan để xác minh những hành động mà Terraform sẽ thực hiện để tạo tài nguyên của chúng ta
$ terraform plan
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:
# local_file.hello will be created
+ resource "local_file" "hello" {
+ content = "Hello, Terraform"
+ directory_permission = "0777"
+ file_permission = "0777"
+ filename = "hello.txt"
+ id = (known after apply)
}
Plan: 1 to add, 0 to change, 0 to destroy.
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.
Ở đây, Terraform nói với chúng ta rằng nó cần tạo ra một nguồn tài nguyên mới, dự kiến là nó chưa tồn tại. Chúng ta cũng có thể thấy các giá trị được cung cấp mà chúng ta đã đặt và một cặp thuộc tính về permission. Vì chúng ta chưa cung cấp những giá trị đó trong định nghĩa tài nguyên của mình, trình cung cấp sẽ giả định các giá trị mặc định.
Bây giờ chúng ta có thể tiến hành tạo tài nguyên thực tế bằng lệnh apply .
$ terraform apply
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:
# local_file.hello will be created
+ resource "local_file" "hello" {
+ content = "Hello, Terraform"
+ directory_permission = "0777"
+ file_permission = "0777"
+ filename = "hello.txt"
+ id = (known after apply)
}
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
local_file.hello: Creating...
local_file.hello: Creation complete after 0s [id=392b5481eae4ab2178340f62b752297f72695d57]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Bây giờ chúng ta có thể xác minh rằng file đã được tạo với nội dung được chỉ định:
├── hello.txt
├── main.tf
└── terraform.tfstate
0 directories, 3 files
File hello.txt đã được tạo, đọc nội dung file hello.txt ta có kết quả.
$ cat hello.txt
Hello, Terraform
Tất cả đều tốt! Bây giờ, hãy xem điều gì sẽ xảy ra nếu chúng ta chạy lại lệnh apply , lần này bằng cách sử dụng tùy chọn -auto-approve để Terraform chạy ngay lập tức mà không yêu cầu bất kỳ xác nhận nào.
$ terraform apply -auto-approve
local_file.hello: Refreshing state... [id=392b5481eae4ab2178340f62b752297f72695d57]
No changes. Your infrastructure matches the configuration.
Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are needed.
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Lần này, Terraform không làm gì cả vì file đã tồn tại. Tuy nhiên, đó không phải là tất cả. Đôi khi tài nguyên tồn tại, nhưng ai đó có thể đã thay đổi một trong các thuộc tính của nó hoặc nội dung, một tình huống thường được gọi là “trôi dạt cấu hình” . Hãy xem Terraform hoạt động như thế nào trong trường hợp này. Hãy chỉnh sửa nội dung file hello.txt trước.
echo '' > $HOME/hello-terraform/hello.txt
Sau đó chạy lại lệnh terraform plan
$ terraform plan
local_file.hello: Refreshing state... [id=392b5481eae4ab2178340f62b752297f72695d57]
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:
# local_file.hello will be created
+ resource "local_file" "hello" {
+ content = "Hello, Terraform"
+ directory_permission = "0777"
+ file_permission = "0777"
+ filename = "hello.txt"
+ id = (known after apply)
}
Plan: 1 to add, 0 to change, 0 to destroy.
Terraform đã phát hiện ra sự thay đổi trong nội dung của file hello.txt và tạo ra một kế hoạch để khôi phục nó. Vì provider local thiếu hỗ trợ cho việc sửa đổi tại chỗ, chúng ta thấy rằng kế hoạch bao gồm một bước duy nhất đó là tạo lại file này.
Bây giờ chúng ta có thể chạy lại ứng dụng và kết quả là nó sẽ khôi phục nội dung của file về nội dung dự kiến của nó:
$ terraform apply -auto-approve
local_file.hello: Refreshing state... [id=392b5481eae4ab2178340f62b752297f72695d57]
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:
# local_file.hello will be created
+ resource "local_file" "hello" {
+ content = "Hello, Terraform"
+ directory_permission = "0777"
+ file_permission = "0777"
+ filename = "hello.txt"
+ id = (known after apply)
}
Plan: 1 to add, 0 to change, 0 to destroy.
local_file.hello: Creating...
local_file.hello: Creation complete after 0s [id=392b5481eae4ab2178340f62b752297f72695d57]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Kết quả
$ cat hello.txt
Hello, Terraform
2. Các khái niệm.
2.1. Ngôn ngữ sử dụng trong Terraform.
Ngôn ngữ khai báo của Terraform là HashiCorp Configuration Language (HCL). HCL là ngôn ngữ tự tạo, dễ sử dụng và dễ đọc để khai báo cấu hình infrastructure-as-code. Nó có thể được sử dụng để khai báo tài nguyên, provider, các biến và các module.
Terraform cũng hỗ trợ viết cấu hình bằng JSON, tuy nhiên, HCL là ngôn ngữ chính thức và được khuyến khích sử dụng. JSON là một cấu trúc dữ liệu đơn giản, nhưng không thể so sánh với HCL về tính dễ đọc và tính linh hoạt.
2.2. Provider.
Trong Terraform, một provider là một module mà Terraform sử dụng để quản lý và tạo các tài nguyên từ một nguồn nhà cung cấp như AWS, Azure, Google Cloud, hoặc bất kỳ nguồn nhà cung cấp nào khác mà Terraform hỗ trợ.
Mỗi provider sử dụng các API của nhà cung cấp để giao tiếp với hệ thống và quản lý các tài nguyên. Trong Terraform, người dùng có thể sử dụng nhiều provider trong một mô hình Terraform, cho phép họ quản lý các tài nguyên từ nhiều nguồn nhà cung cấp khác nhau.
Khi sử dụng Terraform, người dùng cần xác định và cấu hình các provider trong mô hình Terraform của họ bằng cách sử dụng cú pháp Terraform để xác định các thiết lập và các thông tin xác thực để giao tiếp với nhà cung cấp.
Khai báo cấu hình Provider trong Terraform cần bao gồm các bước sau:
- Xác định provider cần sử dụng: Cần xác định provider mà bạn muốn sử dụng để quản lý tài nguyên. Ví dụ, nếu bạn muốn quản lý tài nguyên trên AWS, bạn sẽ sử dụng provider “aws”.
- Khai báo provider: Sử dụng cú pháp Terraform để khai báo provider với tên provider và các thiết lập cho provider. Ví dụ:
provider "aws" {
region = "us-west-2"
}
- Cấu hình thông tin xác thực: Provider cần cấu hình thông tin xác thực để giao tiếp với hệ thống của nhà cung cấp. Thông tin xác thực có thể được cấu hình trực tiếp trong mô hình Terraform hoặc được nhập từ môi trường hoặc file cấu hình.
Ví dụ, cấu hình thông tin xác thực trực tiếp trong mô hình Terraform:
provider "aws" {
region = "us-west-2"
access_key = "ACCESS_KEY"
secret_key = "SECRET_KEY"
}
Lưu ý: Không nên lưu thông tin xác thực trực tiếp trong mô hình Terraform. Chúng ta cần sử dụng các phương pháp bảo mật hơn, như sử dụng môi trường hoặc file cấu hình.
2.2. Resource.
Trong Terraform, Resource là cấu trúc dùng để mô tả tài nguyên mà bạn muốn quản lý. Mỗi tài nguyên được mô tả bởi một resource block, với tên tài nguyên và các tham số cần thiết để tạo ra hoặc quản lý tài nguyên đó.
Ví dụ, tạo một EC2 instance trên AWS:
resource "aws_instance" "web" {
ami = "some-ami-id"
instance_type = "t2.micro"
}
Trong ví dụ trên, “aws_instance” là tên tài nguyên và “web” là tên cục bộ của tài nguyên. Các tham số, như “ami” và “instance_type”, được sử dụng để xác định cấu hình cho EC2 instance.
Tên tài nguyên trong Terraform là một chuỗi tùy chọn mà bạn xác định khi tạo một resource block. Tên tài nguyên phải là duy nhất trong toàn bộ tập tin cấu hình Terraform của bạn và phải tuân thủ các quy tắc đặt tên hợp lệ. Nó thường phải thường tuân theo quy ước provider_type cấp.
Ví dụ, tên tài nguyên cho một EC2 instance trên AWS có thể là “aws_instance_web_server” hoặc “web_server_instance”. Tên này sẽ được sử dụng trong các biến và module để tham chiếu tới tài nguyên đó.
Để minh họa cách hoạt động của điều này mình sẽ sẽ đưa 1 ví dụ tiếp theo. Bạn muốn tạo một EC2 instance trên AWS bằng Terraform, với 1 Elastic IP và 1 Security Group. Cấu hình Terraform có thể như sau:
provider "aws" {
region = "us-west-2"
}
resource "aws_instance" "web_server_instance" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
# Elastic IP
associate_public_ip_address = true
vpc_security_group_ids = [
"${aws_security_group.web_security_group.id}"
]
}
resource "aws_security_group" "web_security_group" {
name = "web_security_group"
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
Trong đó:
- Provider block xác định region của AWS.
- Resource block “aws_instance” tạo EC2 instance, sử dụng Elastic IP và Security Group đã định nghĩa.
- Resource block “aws_security_group” tạo Security Group với 1 rule ingress cho phép truy cập từ mọi IP với cổng 80.
Sau khi chạy câu lệnh “terraform apply”, Terraform sẽ tạo ra EC2 instance, Elastic IP và Security Group với cấu hình đã xác định trong resource blocks.
2.3. Count và for_each và đối số Meta.
- count: là một thuộc tính trong Terraform dùng để xác định số lượng của một tài nguyên cụ thể. Giá trị của count có thể là một số nguyên hoặc một biến.
- for_each: là một thuộc tính trong Terraform dùng để xác định tài nguyên sẽ được tạo cho mỗi phần tử trong một map hoặc một danh sách. Với for_each, bạn có thể tạo một tài nguyên mới cho mỗi giá trị trong map hoặc danh sách, với các thông tin riêng biệt cho mỗi tài nguyên.
Ví dụ về sử dụng count:
resource "aws_instance" "example" {
count = var.instance_count
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
}
Ví dụ về sử dụng for_each:
variable "instance_names" {
type = map(string)
}
resource "aws_instance" "example" {
for_each = var.instance_names
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
tags = {
Name = each.key
}
}
Trong ví dụ này, biến instance_names
là một map chứa các tên cho các instance AWS. Với for_each
, Terraform sẽ tạo một instance mới cho mỗi tên trong map, với tên của instance được chỉ định bởi giá trị của từng phần tử trong map.
Ví dụ kết hợp giữa count và for_each:
variable "instance_counts" {
type = map(number)
default = {
dev = 2
test = 3
prod = 4
}
}
locals {
instance_list = {
for env, count in var.instance_counts : "${env}" => range(count)
}
}
resource "aws_instance" "example" {
count = var.instance_counts[terraform.workspace]
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
for_each = local.instance_list
tags = {
Name = "${terraform.workspace}-${each.value}"
}
}
Trong ví dụ trên, biến instance_counts
định nghĩa số lượng các instance cần tạo cho mỗi môi trường (dev, test, prod). Sử dụng locals
để tạo danh sách các instance theo môi trường và workspace hiện tại. Cuối cùng, resource "aws_instance"
sử dụng count
và for_each
để tạo đủ số lượng instance với tên tương ứng.
2.4. Data Sources.
Data Sources là các nguồn dữ liệu được sử dụng trong Terraform để truy xuất dữ liệu từ các nguồn khác nhau, chẳng hạn như các dịch vụ cloud, API hoặc file. Khi sử dụng Data Sources, Terraform sẽ truy xuất dữ liệu từ nguồn đó và sử dụng nó để xác định các giá trị cho các biến hoặc các tài nguyên khác trong mô hình. Data Sources giúp cho việc quản lý và sử dụng dữ liệu trong Terraform đơn giản và dễ dàng hơn.
Data Source hoạt động khá nhiều dưới dạng tài nguyên “chỉ đọc” , theo nghĩa là chúng ta có thể lấy thông tin về những nguồn hiện có nhưng không thể tạo hoặc thay đổi chúng. Chúng thường được sử dụng để tìm nạp các tham số cần thiết để tạo các tài nguyên khác.
Ví dụ về Data Sources.
Ví dụ điển hình là nguồn dữ liệu aws_ami có sẵn trong nhà cung cấp AWS mà chúng ta sử dụng để khôi phục các thuộc tính từ AMI hiện có:
data "aws_ami" "ubuntu" {
most_recent = true
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-*"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
owners = ["099720109477"] # Canonical
}
Ví dụ này định nghĩa một Data Source được gọi là “ubuntu” truy vấn AMI và trả về một số thuộc tính liên quan đến hình ảnh được định vị. Sau đó, chúng ta có thể sử dụng các thuộc tính đó trong các định nghĩa tài nguyên khác, thêm tiền tố data vào tên thuộc tính:
resource "aws_instance" "web" {
ami = data.aws_ami.ubuntu.id
instance_type = "t2.micro"
}
2.5. State.
Trong Terraform, State là một tập hợp các thông tin về cấu hình của các Resource trong infrastructure của bạn. State được sử dụng để quản lý và cấu hình infrastructure, và giúp Terraform hiểu các Resource đã được tạo ra trong quá khứ và các thay đổi mới được áp dụng trong tương lai. State còn giúp Terraform tránh tạo ra các Resource trùng lặp hoặc xóa các Resource đang sử dụng.
Mục đích chính của file trạng thái là cung cấp thông tin về các tài nguyên hiện có, vì vậy khi chúng ta sửa đổi định nghĩa tài nguyên của mình, Terraform có thể tìm ra những gì nó cần làm.
Một điểm quan trọng về file trạng thái là chúng có thể chứa thông tin nhạy cảm . Ví dụ bao gồm mật khẩu ban đầu được sử dụng để tạo cơ sở dữ liệu, khóa riêng tư, v.v.
Giả sử bạn muốn tạo một tổ chức AWS trong Terraform với một số bucket S3. Khi bạn chạy lệnh “terraform apply”, Terraform sẽ tạo các bucket S3 và lưu trữ thông tin về các bucket đã được tạo ra trong tập tin State. Khi bạn muốn thực hiện thay đổi về tổ chức, Terraform sẽ sử dụng tập tin State để hiểu được các Resource hiện có và chỉ tạo thêm các Resource mới hoặc thay đổi các Resource cần thiết. Điều này giúp tránh tình trạng tạo ra các Resource trùng lặp hoặc xóa các Resource đang sử dụng.
Ví dụ, nếu bạn cấu hình Terraform để tạo ra một cụm EC2 instances, State sẽ chứa thông tin về ID của instances được tạo ra, IP, security group, vv. Khi bạn cập nhật cấu hình Terraform, Terraform sẽ so sánh tình trạng hiện tại với tình trạng được lưu trữ trong State và tạo ra các thay đổi tương ứng để giữ cho tình trạng infrastructure phù hợp với cấu hình mong muốn.
2.6. Module.
Module trong Terraform là một tập hợp của các tài nguyên và cấu hình được sử dụng để tạo ra một đối tượng phức tạp hơn hoặc chia nhỏ một cấu hình Terraform thành nhiều phần hợp lý. Một module có thể chứa bất kỳ tài nguyên nào trong Terraform, bao gồm cả các tài nguyên động, như EC2 instance hoặc S3 bucket, và các tài nguyên tĩnh, như các biến và những gì khác.
Module trong Terraform là một tập hợp các cấu hình Terraform cho tài nguyên, dữ liệu, và biến được tổ chức dưới dạng một đơn vị riêng biệt và có thể được sử dụng lại trong các mô hình Terraform khác.
Ví dụ: Bạn muốn tạo một cấu hình cho một tập hợp các EC2 instance với cấu hình giống nhau. Bạn có thể tạo một module EC2 với cấu hình cho một instance EC2 và sử dụng nó nhiều lần trong mô hình Terraform của mình mà không cần phải viết lại cấu hình đó cho mỗi instance.
Một ví dụ cụ thể về cách khai báo một module trong Terraform là:
module "example_module" {
source = "./module_folder"
argument_1 = var.variable_1
argument_2 = "example_value_2"
}
- Trong đó
module "example_module"
khai báo tên module. source = "./module_folder"
là đường dẫn đến thư mục chứa module.argument_1 = var.variable_1
vàargument_2 = "example_value_2"
là tham số truyền vào module.
2.7. Biến đầu vào (input variable).
Input variable là một tập hợp các giá trị có thể được gán từ bên ngoài, cho phép cho phép một module Terraform hoạt động với giá trị được cấu hình theo nhu cầu của người dùng. Các giá trị này có thể được gán trong file variables.tf hoặc trong lệnh terraform apply.
Bạn có thể sử dụng biến trong module bằng cách định nghĩa biến trong file variables.tf và truyền giá trị cho nó từ ngoài module thông qua file main.tf hoặc từ tham số truyền từ command line. Ví dụ:
File variables.tf:
variable "instance_type" {
type = string
}
File main.tf:
module "example_module" {
source = "./module_directory"
instance_type = var.instance_type
}
Trong đó, module_directory là thư mục chứa các tập tin cấu hình của module.
2.8. Biến cục bộ.
Local variables là biến được sử dụng trong Terraform configuration file. Chúng ta có thể khai báo local variables sử dụng cú pháp sau:
locals {
variable_name = "variable_value"
}
Ví dụ.
locals {
greeting = "Hello, Terraform!"
}
output "message" {
value = "${local.greeting}"
}
Kết quả của lệnh terraform apply
sẽ in ra “Hello, Terraform!”.
2.9. Workspaces.
Workspaces là tính năng của Terraform cho phép bạn tạo nhiều môi trường độc lập trên cùng một tập tin cấu hình. Bạn có thể sử dụng nó để tạo các môi trường phát triển, tổ chức hoặc cấu hình khác nhau cho tất cả các tài nguyên của mình.
Ví dụ: Giả sử bạn cần tạo một tập tin Terraform để quản lý các tài nguyên AWS trong môi trường phát triển và môi trường sản xuất. Bạn có thể sử dụng Workspaces để tạo hai môi trường độc lập và chạy Terraform trên mỗi môi trường một cách riêng biệt.
IV. Kết luận.
Terraform là một công cụ rất mạnh mẽ giúp chúng tôi áp dụng thực hành Cơ sở hạ tầng như mã trong các dự án của mình. Sức mạnh này, tuy nhiên, đi kèm với những thách thức của nó. Trong bài viết này, tôi đã cung cấp tổng quan nhanh về công cụ này để chúng ta có thể hiểu rõ hơn về các khả năng và các khái niệm cơ bản của nó