Quản lý hạ tầng AWS với Terraform

Quản lý hạ tầng AWS với Terraform

Xem nhanh

Infra as Code là gì?

Infra as Code (IaC) là phương pháp quản lý và cấu hình cơ sở hạ tầng tự động hoá thông qua mã nguồn. Thay vì cấu hình thủ công thì sử dụng script, template để tự động hoá công việc này.

IaC ra đời giải quyết các vấn đề của phương pháp triển khai Infra truyền thống như:

  • Tốc độ triển khai chậm khi phải quản lý nhiều môi trường khác nhau
  • Không nhất quán, sai sót do người thực thi
  • Không tái sử dụng được
  • Khó kiểm soát, theo dõi hoặc phục hồi các phiên bản cấu hình trước đó

Một số các công cụ IaC

  • CloudFormation là dịch vụ của AWS cho phép người dùng định nghĩa và triển khai cấu trúc (yaml or json)
  • AWS Cloud Development Kit: sử dụng các ngôn ngữ lập trình để định nghĩa (ts, js, C#, Java, Python)
  • Terraform là mã nguồn mở linh hoạt, tương tác với nhiều môi trường cloud (AWS, Azure, Google Cloud Platform, …)
  • Azure Resource Manager
  • Google cloud deployment manager

Trong bài viết này sẽ sử dụng Terraform làm công cụ triển khai IaC trên AWS

Terraform

Terraform là công cụ quản lý cơ sở hạ tầng dưới dạng mã nguồn của HashiCorp

Các plugin Terraform, được gọi là nhà cung cấp, cho phép Terraform tương tác với các nền tảng đám mây và các dịch vụ khác thông qua API của chúng.

HashiCorp và cộng đồng Terraform đã viết hơn 1.000 nhà cung cấp để quản lý tài nguyên trên Amazon Web Services (AWS), Azure, Google Cloud Platform (GCP), Kubernetes, Helm, GitHub, Splunk và DataDog, cùng nhiều dịch vụ khác.

What is Infrastructure as Code with Terraform? | Terraform | HashiCorp Developer

Nguồn: What is Infrastructure as Code with Terraform? | Terraform | HashiCorp Developer

Các bước triển khai cơ sở hạ tầng với Terraform:

  • Scope: Xác định phạm vi hạ tầng cần cho dự án.
  • Author: Viết mã khai báo tài nguyên hạ tầng bằng Terraform.
  • Initialize: Khởi tạo dự án, cài đặt plugin/provider cần thiết.
  • Plan: Xem trước các thay đổi trên hạ tầng mà Terraform sẽ thực hiện.
  • Apply: Áp dụng các thay đổi lên hạ tầng như đã lên kế hoạch.
  • Destroy: Xoá hoặc giải phóng toàn bộ hạ tầng khi không cần sử dụng.

Cài đặt môi trường

AWS

Kiểm tra AWS CLI version sau cài đặt:

aws --version
aws-cli/2.15.30 Python/3.11.8 Darwin/22.6.0 exe/x86_64 prompt/off

Access Key dùng để xác thực và ủy quyền truy cập AWS services từ bên ngoài AWS.

Để có thông tin AWS Access key ID và AWS Secret Access Key, chúng ta cần tạo trên AWS bằng cách:

- Cách 1: Tạo Access Key cho root user

- Cách 2: Tạo mới một user, rồi tạo Access Key cho user đó.

AWS khuyến khích tạo user để limit quyền cho nó, nên chúng ta sẽ tạo mới một user có quyền Administrator Access như sau:

aws user

Sau đó, add Access Key cho user này:

aws access key

Hãy Download file .csv về để lưu lại thông tin Access Key

  • Thực hiện configure để access đến AWS
pnt % aws configure              
AWS Access Key ID [****************IJVS]: Your Access Key ID
AWS Secret Access Key [****************4lDq]: Your Secret Access Key
Default region name [ap-southeast-1]: 
Default output format [json]: 
  • Kiểm tra access:
pnt % aws sts get-caller-identity
{
    "UserId": "Your User ID",
    "Account": "Your Account",
    "Arn": "arn:aws:iam::Your-User-ID:user/ptn-admin"
}

Thông tin hiển thị như trên cho thấy bạn đã access đến AWS thành công

Terraform

Kiểm tra version sau cài đặt:

pnt % terraform --version
Terraform v0.14.7

Your version of Terraform is out of date! The latest version
is 1.8.5. You can update by downloading from https://www.terraform.io/downloads.html

terraform plugin

Tạo và xoá infrastructure bằng Terraform

Thực hiện các bước triển khai cơ sở hạ tầng với Terraform:

Scope

Để làm quen với việc tạo infrastructure bằng terraform, chúng ta sẽ thực hiện tạo resource:

  • EC2 instance: 1
  • Security groups: 1

Để đơn giản chúng ta sẽ sử dụng VCP default. Do đó, bạn cần chọn region có sẵn VCP. Trong bài viết này, tôi sử dụng ap-southeast-1 region.

Author

Tại bước này, chúng ta thực hiện viết cấu hình cho resource

  • Chuẩn bị key pair để kết nối SSH vào EC2 instances
ssh-keygen -t rsa -b 4096 -C "your email account"
Enter file in which to save the key (/Users/pnt/.ssh/id_rsa): ./keypair
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
  • Để define các resource, chúng ta tạo ra file main.tf
Copy
provider "aws" {
  region = "ap-southeast-1"
}

resource "aws_key_pair" "test-keypair" {
  key_name   = "test-keypair"
  public_key = file("../keypair/key.pub")
}

resource "aws_instance" "demo-instance" {
  ami           = "ami-0fa377108253bf620" # ami-0e4b5d31e60aa0acd
  instance_type = "t3.large"
  key_name      = aws_key_pair.test-keypair.key_name
  tags = {
    Name = "Demo Instance"
    Company = "CMC-Japan"
    Domain = "DevOps"
  }
  vpc_security_group_ids = [aws_security_group.test-security-group.id]
}

resource "aws_security_group" "test-security-group" {
  name        = "test-security-group"
  description = "test-security-group"

  ingress {
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

Giải thích cấu trúc file cấu hình Terraform

Trong file cấu hình chính (ví dụ: main.tf), chúng ta cần chú ý tới một số thành phần quan trọng như sau:

  • provider:

Provider xác định nền tảng đám mây hoặc dịch vụ mà Terraform sẽ tương tác để quản lý tài nguyên. Terraform hỗ trợ rất nhiều provider khác nhau như AWS, Azure, Google Cloud Platform, v.v. Trong ví dụ này, chúng ta đang định nghĩa provider là aws, nghĩa là toàn bộ tài nguyên được tạo ra sẽ nằm trên nền tảng AWS.

  • resource:

Phần resource dùng để khai báo chi tiết các tài nguyên hạ tầng sẽ được khởi tạo, quản lý. Trong file mẫu main.tf , chúng ta khai báo ba loại resource:

  1. aws_key_pair: Tạo khoá SSH, dùng để truy cập vào các máy chủ EC2.
  2. aws_instance: Khai báo và tạo một instance EC2 trên AWS.
  3. aws_security_group: Khai báo một security group, dùng để thiết lập các quy tắc tường lửa cho instance.

Việc tách các thành phần rõ ràng như trên giúp cấu hình Terraform dễ đọc, dễ bảo trì và mở rộng khi cần thiết. Để hiểu rõ hơn cách định nghĩa chi tiết từng loại resource hoặc khám phá thêm nhiều loại tài nguyên khác, bạn có thể tham khảo tài liệu chính thức của Terraform.

Initialize

Trước khi áp dụng cấu hình cơ sở hạ tầng từ main.tf, chúng ta phải khởi tạo Terraform bằng lệnh terraform init. Trong quá trình khởi tạo, Terraform sẽ tải xuống và cài đặt các nhà cung cấp được xác định trong file cấu hình vào thư mục làm việc hiện tại.

terraform init

Sau khi chạy lệnh này, bạn sẽ thấy tại folder hiện tại các provider cần thiết được tải về như sau:

provider

Plan

Terraform tạo một kế hoạch thực thi cho những thay đổi sẽ được thực hiện. Hãy xem lại kế hoạch này để đảm bảo Terraform sẽ thực hiện những thay đổi như mong đợi bằng cách chạy terraform plan

plan

Như thông tin trên, chúng ta thấy plan là 3 resource được add với thông tin tên của chúng: aws_instance.demo-instance, aws_key_pair.test-keypair, aws_security_group.test-security-group

Apply

Áp dụng cấu hình của bạn ngay bây giờ bằng lệnh terraform apply. Terraform sẽ in ra kế hoạch thực thi và yêu cầu bạn xác nhận các thay đổi trước khi áp dụng

apply

Lúc này, kiểm tra trên AWS sẽ thấy các resource đã được tạo ra như sau:

resource

Chi tiết các resource:

keypair

ec2

security group

Các resource được tạo ra đúng như cấu hình từ main.tf

Nếu bạn đã thực hiện bước Apply thì Hãy nhớ thực hiện bước Destroy sau khi thực hành để tránh mất phí

Destroy

Khi bạn không còn cần cơ sở hạ tầng, hãy sử dụng Terraform để hủy bỏ nó. Terraform sẽ hủy bỏ tài nguyên khi bạn xóa chúng khỏi cấu hình và áp dụng thay đổi. Bạn cũng có thể hủy bỏ tất cả tài nguyên do cấu hình của mình quản lý bằng lệnh terraform destroy

Tại bài viết này, tôi muốn huỷ bỏ toàn bộ tài nguyên đã tạo nên tôi sẽ chạy lệnh terraform destroy

destroy

3 resources đã được destroy. Sau khi destroy, bạn có thể kiểm tra lại AWS một lần nữa để chắc chắn các resource đã được huỷ bỏ.

Kết

Hi vọng bài viết đã giúp các bạn hiểu hơn về IaC và cách sử dụng Terraform để cấu hình cơ sở hạ tầng trên AWS.

Tài liệu tham khảo

Infrastructure as Code - AWS

What is Infrastructure as Code with Terraform? | Terraform | HashiCorp Developer