Terraform Series - Bài 9 - Terraform Backend: Remote Backend with Terraform Cloud
Link bài viết gốc - Bài 9 - Tìm hiểu Terraform Cloud: Remote Backend
Giới thiệu
Chào các bạn tới với series về Terraform, ở 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.
Implement Terraform Cloud Remote Backend
Các bạn có thể đọc bài 6 để 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à login vào trong Terraform Cloud.
Terraform Cloud
Terraform Cloud là một dịch vụ của HashiCorp, nó sẽ giúp ta trong việc quản lý terraform 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 infrastructure provisioning một cách 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.
Create a account
Đầu tiên để làm việc với Terraform Cloud ta phải tạo tài khoản trước, các bạn truy cập vào link này https://app.terraform.io/signup/account để tạo tài khoản.
Sau đó các bạn đăng nhập vào Terraform Cloud thì các bạn sẽ thấy UI như sau, chúng ta chọn Start from scratch.
Bước tiếp theo nó sẽ bắt bạn nhập thông tin về organization, các bạn nhập gì cũng được. Sau đó bấm tạo, khi tạo xong bạn sẽ thấy ta có UI như sau.
Oke, vậy là ta đã chuẩn bị đầy đủ, bước tiếp theo ta sẽ làm việc với remote backend.
Use Remote Backend
Để sử dụng được remote backend, ở UI Workspaces bạn bấm vào tạo Workspaces, ở trang tiếp theo các bạn chọn CLI-driven workflow.
Sau đó các bạn 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.
Bạn sẽ thấy status của workspace là Waiting for configuration, tiếp theo ta sẽ cấu hình để terraform local của ta có thể sử dụng Remote Backend này. Kéo xuống xíu thì bạn sẽ thấy có phần hướng dẫn để ta cấu hình và sử dụng.
Các bạn có thể làm theo nó cho nhanh hoặc làm theo hướng dẫn của mình.
Đầu tiên ta tạo một folder và file 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 config như sau vào file terraform của ta.
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 file main.tf
với config của workspace ta vừa tạo ở trên.
Sử dụng cloud block với terraform version 1.1 trở lên, đối với version 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"
}
...
Oke, sau khi viết code xong, ta sẽ chạy câu lệnh terraform login để ta đăng nhập vào remote backend của ta. Chạy terraform login
nó sẽ mở một UI như sau cho ta.
Bấm Create API token.
Nhớ copy nhé. Sau đó bấm Done, quay lại terminal dán giá trị ta vừa copy vào.
Nếu giá trị đúng thì terraform local của ta đã login vào Terraform Cloud thành công.
Sau khi login 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 đã config remote backend thành công 😁. Bây giờ bạn 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ộ config liên quan tới credential như là secret key và access key của AWS ta đều phải config ở trên remote backend. Đây là một điểm mạnh khi ta xài remote backend, vì toàn bộ config liên quan tới credential ta đều setting ở 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 quá menu 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 option là Environment variable, điền vào giá trị, nhớ check biến đó là Sensitive.
Làm tương tự cho AWS_SECRET_ACCESS_KEY.
Bấm save.
Ok, giờ ta chạy lại câu lệnh terraform plan
ta sẽ thấy nó chạy thành công.
$ 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)
Giờ ta 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 state file của ta sẽ được lưu ở remote, bạn có thể kiểm tra ở trên terraform cloud, bấm qua tab State.
Bấm vào Triggered via CLI ta sẽ thấy giá trị của state file. Ngoài ra terraform cloud còn hiển thị các resource hiện tại đang có cho ta, giúp ta có cái nhìn tốt hơn về 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 local của ta. Do đó, khi bạn đang chạy mà bạn có bấm Ctrl + C để tắt quá trình chạy thì nó chỉ tắt stream thôi, còn runtime ở remote server của ta 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 team có thể làm việc một cách hiệu quả hơn và đảm bảo security. Nếu có thắc mắc hoặc cần giải thích rõ thêm chỗ nào thì các bạn có thể hỏi dưới phần comment. Hẹn gặp mọi người ở bài tiếp theo ta sẽ tìm hiểu về CI/CD với Terraform Cloud.
DevOps VN
Học DevOps tại các trung tâm uy tín.
Kiến thức dinh dưỡng IT.
Ủng hộ trang tại đây.
All rights reserved