Terraform Series – Bài 8 – Terraform Backend: Remote Backend with Terraform Cloud

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, và sau đó tìm hiểu về cách

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, và sau đó tìm hiểu về cách implement CI/CD cho infrastructure bằng Terraform Cloud.

image.png

Terraform Cloud – image from Hashicorp

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.

image.png

Terraform Cloud – image from Amazic

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.

image.png

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.

image.png

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.

image.png

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.

image.png

Sau đó các bạn nhập vào tên của Workspace và bấm tạo.

image.png

Sau khi tạo xong thì workspace của ta đã sẵn sàng để sử dụng.

image.png

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.

image.png

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.

image.png

Bấm Create API token.

image.png

Nhớ copy nhé. Sau đó bấm Done, quay lại terminal dán giá trị ta vừa copy vào.

image.png

Nếu giá trị đúng thì terraform local của ta đã login vào Terraform Cloud thành công.

image.png

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.

image.png

Bấm tạo. Đặt tên variable sets là AWS Credentials, chọn Apply to all workspaces in this organization.

image.png

Tiếp theo ta tạo biến để lưu hai giá trị AWS_ACCESS_KEY_IDAWS_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.

image.png

Làm tương tự cho AWS_SECRET_ACCESS_KEY.

image.png

Bấm save.

image.png

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.

image.png

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.

image.png

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.

Mục tìm kiếm đồng đội

Hiện tại thì bên công ty mình, là Hoàng Phúc International, với hơn 30 năm kinh nghiệm trong lĩnh vực thời trang. Và là trang thương mại điện tử về thời trang lớn nhất Việt Nam. Team công nghệ của HPI đang tìm kiếm đồng đội cho các vị trí như:

Với mục tiêu trong vòng 5 năm tới về mảng công nghệ là:

  • Sẽ có trang web nằm trong top 10 trang web nhanh nhất VN với 20 triệu lượt truy cập mỗi tháng.
  • 5 triệu loyal customers và có hơn 10 triệu transactions mỗi năm.

Team đang xây dựng một hệ thống rất lớn với rất nhiều vấn để cần giải quyết, và sẽ có rất nhiều bài toàn thú vị cho các bạn. Nếu các bạn có hứng thú trong việc xây dựng một hệ thống lớn, linh hoạt, dễ dàng mở rộng, và performance cao với kiến trúc microservices thì hãy tham gia với tụi mình.

Nếu các bạn quan tâm hãy gửi CV ở trong trang tuyển dụng của Hoàng Phúc International hoặc qua email của mình nha [email protected]. Cảm ơn các bạn đã đọc.

Nguồn: viblo.asia

Bài viết liên quan

WebP là gì? Hướng dẫn cách để chuyển hình ảnh jpg, png qua webp

WebP là gì? WebP là một định dạng ảnh hiện đại, được phát triển bởi Google

Điểm khác biệt giữa IPv4 và IPv6 là gì?

IPv4 và IPv6 là hai phiên bản của hệ thống địa chỉ Giao thức Internet (IP). IP l

Check nameservers của tên miền xem website trỏ đúng chưa

Tìm hiểu cách check nameservers của tên miền để xác định tên miền đó đang dùn

Mình đang dùng Google Domains để check tên miền hàng ngày

Từ khi thông báo dịch vụ Google Domains bỏ mác Beta, mình mới để ý và bắt đầ