Triển Khai Cơ Sở Hạ Tầng Cloud bằng Terraform
Trong bài viết này, chúng ta sẽ tìm hiểu cách triển khai một máy chủ EC2 trên AWS bằng Terraform, một công cụ quản lý hạ tầng mã nguồn mở, giúp tự động hóa việc xây dựng, thay đổi và phiên bản hóa hạ tầng Cloud.
Xây Dựng Cấu Trúc Thư Mục
Theo hướng dẫn từ trang chính thức của Terraform, cấu trúc thư mục sẽ bao gồm:
- Hai module chính:
ec2
vànetworking
.
1. Tạo File main.tf
trong Thư Mục Gốc
h
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.16"
}
}
required_version = ">= 1.2.0"
}
provider "aws" {
region = var.aws.region
access_key = var.aws.access_key
secret_key = var.aws.secret_key
default_tags {
tags = {
Name = var.tag.name
}
}
}
2. Khai Báo Biến trong File variables.tf
h
variable "aws" {
sensitive = true
type = object({
region = string
access_key = string
secret_key = string
})
}
variable "tag" {
type = object({
name = string
})
default = {
name = "learning"
}
}
3. Gắn Giá Trị Biến trong File terraform.tfvars
h
# Cấu Hình AWS Provider
aws = {
region = <AWS_region>
access_key = <AWS_access_key>
secret_key = <AWS_secret_key>
}
# Tên Tag Mặc Định
tag = {
name = "learning"
}
# Cấu Hình Mạng
networking = {
vpc_cidr_block = "10.0.0.0/16"
subnet_cidr_block = "10.0.1.0/24"
}
4. File output.tf
Để Xuất Giá Trị Ra Màn Hình
h
output "instance_public_ip" {
description = "Địa chỉ IP công cộng của EC2 instance"
value = module.ec2.instance_public_ip
}
Khởi Tạo Workspace
Sau khi khai báo xong, sử dụng lệnh sau để khởi tạo workspace:
h
terraform init
Điều này sẽ tạo ra thư mục .terraform
và file .terraform.lock.hcl
.
Xây Dựng Các Module
Chúng ta sẽ xây dựng các module trong thư mục modules
.
1. Module Networking
Module này sẽ bao gồm các thành phần như VPC
, Public Subnet
, Security Group
, Route Table
, và Internet Gateway
.
- Tạo thư mục
networking
tạimodules/networking
và các filemain.tf
,variables.tf
,output.tf
.
File main.tf
cho Module Networking sẽ như sau:
h
// VPC
resource "aws_vpc" "vpc-learning" {
cidr_block = var.vpc_cidr_block
}
// Subnet
resource "aws_subnet" "subnet-learning" {
vpc_id = aws_vpc.vpc-learning.id
cidr_block = var.subnet_cidr_block
}
// Internet Gateway
resource "aws_internet_gateway" "gw-learning" {
vpc_id = aws_vpc.vpc-learning.id
}
// Route Table
resource "aws_route_table" "route-table-learning" {
vpc_id = aws_vpc.vpc-learning.id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.gw-learning.id
}
}
resource "aws_route_table_association" "a" {
subnet_id = aws_subnet.subnet-learning.id
route_table_id = aws_route_table.route-table-learning.id
}
// Security Group
resource "aws_security_group" "allow_tls" {
name = "allow_tls"
description = "Cho phép lưu lượng TLS vào và tất cả lưu lượng ra"
vpc_id = aws_vpc.vpc-learning.id
// Quy tắc vào
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"] // Cho phép SSH từ mọi nơi
}
// Quy tắc ra
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
2. Module EC2
Tương tự như module networking
, tạo thư mục ec2
tại modules/ec2
và các file main.tf
, variables.tf
, output.tf
.
File main.tf
cho Module EC2 như sau:
h
// EC2
resource "aws_instance" "web" {
ami = var.ami
instance_type = var.instance_type
subnet_id = var.subnet_id
vpc_security_group_ids = [var.security_group_id]
associate_public_ip_address = true
key_name = var.key_name
// Chạy lệnh sau khi EC2 được tạo
provisioner "local-exec" {
command = "echo IP address is ${self.private_ip}"
}
// Thực hiện các lệnh trên EC2
provisioner "remote-exec" {
connection {
type = "ssh"
user = var.user
private_key = var.key_private
host = self.public_ip
}
inline = [
"sudo yum update -y",
"sudo amazon-linux-extras enable nginx1",
"sudo yum install -y nginx",
"sudo systemctl start nginx",
"sudo systemctl enable nginx"
]
}
}
3. Khai Báo Variables và Xuất Giá Trị
Tạo các variables cần thiết trong variables.tf
và sử dụng output.tf
để xuất thông tin ra ngoài.
Kết nối giữa các module cũng thông qua việc khai báo biến trong file variables.tf
của thư mục gốc để truyền thông tin cần thiết đến từng module tương ứng.
Triển Khai Hệ Thống
Sau khi hoàn thành các bước cấu hình, ta cần khởi tạo lại workspace và thực hiện các lệnh sau:
h
terraform init
terraform fmt
terraform validate
Cuối cùng, thực hiện lệnh terraform apply
để triển khai hệ thống lên Cloud. Nếu mọi thứ diễn ra trôi chảy, bạn sẽ nhận được địa chỉ IP công cộng của instance EC2 vừa được tạo ra.
Kết Luận
Bài lab này đã hướng dẫn bạn cách xây dựng một cấu trúc thư mục và triển khai cơ sở hạ tầng Cloud bằng Terraform. Hy vọng bạn sẽ áp dụng kiến thức này trong các dự án thực tế sau này.
source: viblo