Giới thiệu
Ở bài trước chúng ta đã nói về S3 Standard Backend. Ở bài này chúng ta sẽ tìm hiểu về loại Backend tiếp theo, là Remote Backend. Chúng ta sẽ sử dụng Terraform Cloud để làm Remote Backend.
Sử dụng Remote Backend
Các bạn đọc bài Terraform Backend để hiểu rõ hơn về ưu và nhược điểm của Remote Backend.
Để sử dụng Remote Backend, ta cần phải tạo tài khoản và đăng nhập vào trong Terraform Cloud.
Terraform Cloud
Terraform Cloud là một dịch vụ của HashiCorp, nó giúp ta trong việc quản lý resource một cách dễ dàng và bảo mật hơn. Ngoài ra Terraform Cloud còn giúp ta trong việc xây dựng CI/CD cho việc cung cấp hạ tầng rất đơn giản.
Terraform Cloud có ba cách sử dụng là:
- Version control workflow.
- CLI-driven workflow.
- API-driven workflow.
Ta sẽ sử dụng CLI-driven Workflow cho Remote Backend, Version Control Workflow cho CI/CD.
Tạo tài khoản
Đầu tiên để làm việc với Terraform Cloud ta phải tạo tài khoản trước, truy cập vào đường dẫn này Signup và tạo tài khoản.
Sau đó ta đăng nhập vào Terraform Cloud và chọn Start from scratch.
Bước tiếp theo ta nhập thông tin về Organization. Sau đó bấm tạo, khi tạo xong ta sẽ thấy UI như bên dưới.
Vậy là ta đã chuẩn bị xong, bây giờ ta sẽ làm việc với Remote Backend.
Sử dụng
Để sử dụng được Remote Backend, ở UI Workspaces ta bấm vào tạo Workspaces và chọn CLI-driven workflow.
Sau đó ta nhập vào tên của Workspace và bấm tạo.
Sau khi tạo xong thì Workspace của ta đã sẵn sàng để sử dụng.
Ta sẽ thấy trạng thái của Workspace là Waiting for configuration, tiếp theo ta sẽ cấu hình để Terraform Local kết nối tới Remote Backend.
Kéo xuống ta sẽ thấy phần cấu hình và sử dụng.
Đầu tiên ta tạo một thư mục và tệp tin main.tf
với đoạn code.
provider "aws" {
region = "us-west-2"
}
data "aws_ami" "ami" {
most_recent = true
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
}
owners = ["099720109477"]
}
resource "aws_instance" "server" {
ami = data.aws_ami.ami.id
instance_type = "t3.micro"
lifecycle {
create_before_destroy = true
}
tags = {
Name = "Server"
}
}
output "public_ip" {
value = aws_instance.server.public_ip
}
Để sử dụng Remote Backend ta cần thêm cấu hình sau vào tệp tin Terraform.
terraform {
cloud {
organization = <organization-name>
workspaces {
name = <workspace-name>
}
}
}
Ta sẽ xài cloud block
với hai thuộc tính là organization
và workspaces
. Cập nhật tệp tin main.tf
với cấu hình của Workspace ta vừa tạo ở trên.
Sử dụng cloud block với Terraform phiên bản 1.1 trở lên, đối với phiên bản nhỏ hơn 1.1 ta xài remote block.
terraform {
cloud {
organization = "HPI"
workspaces {
name = "terraform-series-remote-backend"
}
}
}
provider "aws" {
region = "us-west-2"
}
...
Tiếp theo ta sẽ chạy câu lệnh terraform login
để đăng nhập vào Remote Backend. Khi chạy ta sẽ thấy UI như bên dưới.
Bấm Create API token.
Sao chép giá trị và bấm Done, quay lại Terminal dán giá trị ta vừa sao chép vào.
Nếu giá trị đúng thì Terraform Local của ta đã đăng nhập vào Terraform Cloud thành công.
Sau khi đăng nhập xong, ta chạy câu lệnh init
.
terraform init
Initializing Terraform Cloud...
Initializing provider plugins...
- Finding latest version of hashicorp/aws...
- Installing hashicorp/aws v4.8.0...
- Installed hashicorp/aws v4.8.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.
Terraform Cloud has been successfully initialized!
You may now begin working with Terraform Cloud. Try running "terraform plan" to
see any changes that are required for your infrastructure.
If you ever set or change modules or Terraform Settings, run "terraform init"
again to reinitialize your working directory.
Vậy là ta đã cấu hình Remote Backend thành công 😁. Bây giờ ta chạy câu lệnh terraform plan
thử.
terraform plan
Running plan in Terraform Cloud. Output will stream here. Pressing Ctrl-C
will stop streaming the logs, but will not stop the plan running remotely.
Preparing the remote plan...
To view this run in a browser, visit:
https://app.terraform.io/app/HPI/terraform-series-remote-backend/runs/run-7R7giQVT4TqnaAzL
Waiting for the plan to start...
Terraform v1.1.7
on linux_amd64
Configuring remote state backend...
Initializing Terraform configuration...
╷
│ Error: error configuring Terraform AWS Provider: no valid credential sources for Terraform AWS Provider found.
Bạn sẽ thấy nó báo lỗi, vì bây giờ khi ta sử dụng Remote Backend thì toàn bộ cấu hình liên quan tới Credential như là secret key
và access key
của AWS ta đều phải cấu hình ở trên Remote Backend. Đây là một điểm mạnh khi ta xài Remote Backend, vì toàn bộ cấu hình liên quan tới Credential ta đều nằm ở một chỗ, không cần phải lưu Credential dưới máy của ta => tăng tính bảo mật.
Để cấu hình Credential ta bấm qua mục Settings chọn Variable sets.
Bấm tạo, đặt tên variable sets
là AWS Credentials, chọn Apply to all workspaces in this organization.
Tiếp theo ta tạo biến để lưu hai giá trị AWS_ACCESS_KEY_ID
và AWS_SECRET_ACCESS_KEY
. Bấm Add variable cho AWS_ACCESS_KEY_ID
, chọn Environment variable và điền vào giá trị, nhớ chọn biến đó là Sensitive.
Làm tương tự cho AWS_SECRET_ACCESS_KEY
.
Bấm lưu.
Giờ ta chạy lại câu lệnh terraform plan
.
terraform plan
Running plan in Terraform Cloud. Output will stream here. Pressing Ctrl-C
will stop streaming the logs, but will not stop the plan running remotely.
Preparing the remote plan...
...
Plan: 1 to add, 0 to change, 0 to destroy.
Changes to Outputs:
+ public_ip = (known after apply)
Chạy câu lệnh apply
nào.
terraform apply
...
aws_instance.server: Creating...
aws_instance.server: Still creating... [10s elapsed]
aws_instance.server: Creation complete after 12s [id=i-0839b6f71c5749de4]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Outputs:
public_ip = "34.220.170.155"
Khi câu lệnh apply
chạy xong thì lúc này tệp tin State của ta sẽ được lưu ở trên Terraform Cloud. Ở trên Terraform Cloud, bấm qua phần State.
Bấm vào Triggered via CLI ta sẽ thấy giá trị của tệp tin State. Ngoài ra Terraform Cloud còn hiển thị các resource hiện tại đang có cho ta, giúp ta dễ dàng kiểm tra các resource hiện tại. Bấm qua tab Overview kéo xuống phía dưới.
Quan trọng: lưu ý một điều là khi ta chạy các câu lệnh của Terraform với Remote Backend, thì Terraform Runtime sẽ không chạy ở máy của ta mà sẽ chạy ở Remote Server, và nó sẽ Stream kết quả về máy của ta. Do đó, khi bạn đang chạy mà bạn có bấm Ctrl + C
để tắt thì nó chỉ tắt Stream, còn Terraform ở Remote Server vẫn chạy bình thường.
Kết luận
Vậy là ta đã tìm hiểu xong về cách sử dụng Terraform Remote Backend, sử dụng Remote Backend giúp ta tập trung toàn bộ cấu hình Credentials về chung một chỗ, giúp đội nhóm có thể làm việc một cách hiệu quả hơn và đảm bảo tính bảo mật. Ở bài tiếp theo ta sẽ tìm hiểu về CI/CD với Terraform Cloud.
Tác giả @Quân Huỳnh
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ả?