Infrastructure as Code. Tạo máy chủ ảo EC2 trên AWS với Terraform

Các công ty hiện nay thường không tự xây dựng Data Center mà thường lựa chọn sử dụng dịch vụ Public/Private Cloud của các nhà cung cấp trên thế giới như AWS, Azure hay Google Cloud. Mặc dù vậy đôi khi việc học cách sử dụng các nền tảng Cloud này cũng là một vấn đề không đơn giản, chiếm mất nhiều thời gian và công sức của người sử dụng.

Làm thế nào để bạn đối mặt với các thành phần gặp lỗi hay thực hiện nâng cấp, rollback khi cần. Cần phải bảo trì như nào? Đây là những câu hỏi được đặt ra cho các công ty khi lựa chọn sử dụng dịch vụ Public Cloud.

Trong kỹ thuật phần mềm, thế giới đã phát triển để quản lý tính phụ thuộc và các phiên bản các modules phần mềm. Câu hỏi đặt ra là liệu chúng ta có thể ứng dụng để quản lý hạ tầng hay không? Câu trả lời là có. Và một nguyên liệu quan trọng để thực hiện điều đó là biến việc triển khai hạ tầng như việc lập trình coding. Và trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu về việc quản lý hạ tầng AWS sử dụng Terraform.

Infrastructure As Code

Infrastructure as code (IaC) đề cập đến quá trình quản lý hạ tầng IT thông qua các file đã được định nghĩa sẵn hơn là việc sử dụng các công cụ cấu hình tương tác trên giao diện.

Các file định nghĩa thông thường được đặt dưới version control. Kết hợp với việc sử dụng CI/CD, quá trình tự động hóa cấp cao được thực hiện. IaC kết hợp với tự đông hóa tạo ra 03 ưu điểm:

  • Khả năng tái lập: Có thể tạo lại các bộ phận hoặc toàn bộ cơ sở hạ tầng từ đầu dựa trên các tệp định nghĩa. Bằng cách sử dụng các phiên bản rõ ràng cho từng thành phần và phiên bản các tệp định nghĩa, kết quả của việc triển khai là có thể lặp lại.
  • Tốc độ: Máy tính thực hiện rất nhanh các tác vụ được xác định trước. Khi thiết lập và định cấu hình môi trường mới, có càng ít tương tác giữa người với người càng tốt sẽ tăng tốc độ triển khai của bạn.
  • Chất lượng: Do hai ưu điểm đầu tiên, phương pháp này trở nên khả thi và tiết kiệm chi phí hợp lý để thực hiện các thử nghiệm tự động cho cơ sở hạ tầng của bạn. Điều này cải thiện sự mạnh mẽ và chất lượng triển khai của bạn. Loại bỏ các tương tác của con người cũng giúp tránh lỗi.

Rất nhiều các công cụ cho phép tiếp cận IaC như Ansible, Puppet, Chef và SaltStack và có vài ví dụ nổi bật.

  • Ansible hoạt động trên nguyên lý cưỡng bức, ví dụ như bạn có thể khai báo cài đặt hạ tầng và vận hành với nguyên tắc push nó chủ động chuyển đến các thành phần và thay đổi chúng.
  • Puppet mặt khác hoạt động trên nguyên lý khai báo, ví dụ như bạn mô tả trạng thái mong muốn và làm việc theo nguyên lý pull. Puppet agent chạy trên từng server và lấy các cấu hình sau cùng từ Puppet master.

Các công cụ đề cập trên đây đều là các công cụ quản lý cấu hình (configuration tool) hay làm nhiệm vụ provisioning. Theo đó chúng được thiết kế để làm nhiệm cài đặt phần mềm và quản lý cấu hình trên nhiều máy chủ khác nhau. Câu hỏi được đặt ra là làm thế nào để bạn có được máy chủ mà bạn muốn quản lý và câu trả lời là orchestration management.

Các Orchestration Management tập trung vào việc tạo ra các tài nguyên khác nhau như máy chủ ảo theo thứ tự chuẩn và liên kết chúng với nhau theo yêu cầu.

HashiCorp Terraform là công cụ orchestrator tool mạnh mẽ. Trong bài viết này, tôi muốn đưa ra một cái nhìn sâu hơn về Terraform trong ứng dụng thực tế.

Triển khai hạ tầng AWS với Terraform

Bài toán

Trong ví dụ này chúng ta sẽ từng bước triển khai một hạ tầng đơn giản trên AWS. Mục tiêu là tạo một máy ảo sử dụng EC2 và SSH để kết nối đến máy ảo này. Để làm việc đó chúng ta cần cấu hình mở cổng 22 và sao chép public key lên máy chủ ảo.

Cài đặt môi trường AWS trên Terraform

Việc đầu tiên cần làm là tạo một account trong AWS và gán full quyền tác động trên EC2.

Trên máy tính PC hay laptop của mình, chúng ta cần cấu hình 1 vài lệnh cơ bản.

Tạo file credential config trong thư mục ~/.aws

# ~/.aws/credentials
[default]
aws_access_key_id=<access_key>
aws_secret_access_key=<secret_access_key>
# ~/.aws/config
[default]
region=ap-southeast-1
output=json

Truy cập vào AWS Management console My Security Credential để lấy thông tin Access key và Secret key tương ứng.

Bạn cũng có thể cài đặt AWS CLI tuy nhiên không yêu cầu bắt buộc cho Terraform hoạt động.

Các lệnh cấu hình Terraform

  • Tạo và cấu hình các file *.tf trong cùng thư mục chưa các file setup môi trường AWS để deploy hạ tầng bằng Terraform. Các file này có thể định dạng JSON hoặc HCL (HashiCorp Configuration Language).
  • Thực thị lệnh terraform init dể khởi tạo môi trường Terraform và tải các file cần thiết về máy client. Terraform lưu trạng thái của nó trong backend của hệ thống. Trong ví dụ này chúng ta sử dụng local backend tại trong máy client, còn với các ứng dụng Production thì có thể lựa chọn sử dụng các backend khác tùy thyộc vào nhu cầu.

# Các lệnh terraform cơ bản

  • terraform plan: sử dụng để đánh giá trạng thái hiện tại và trạng thái mong muốn khi triển khai hạ tầng.
  • terraform apply: sử dụng để thực thi câu lệnh chuyển đến trạng thái mong muốn.
  • terraform show: sử dụng để kiểm tra và debug kết quả vừa đạt được.
  • terraform detroy: loại bỏ các resource đã tạo trong file định nghĩa.

Chi tiết cấu hình

# Tạo file example.tf

# example.tf

provider "aws" {
  region     = "ap-southeast-1"
}
resource "aws_instance" "example" {
  ami           = "ami-0cbc6aae997c6538a" # Ubuntu 14.04 LTS AMD64 in eu-central-1<br>
  instance_type = "t2.micro"
  security_groups = ["${aws_security_group.allow_8088.name}"]
}
  • Khai báo trường resource $aws_instance . Tương tự như $aws_security_group
  • Khai báo các thành phần trong các trường như ami, instance type...
  • Trỏ thuộc tính resource theo cấu trúc sau: aws_security_group.allow_8088.name

# Tạo resource aws_security_groupallow_8088 và khai báo tham chiếu trên resource của aws_instance ${aws_security_group.allow_8088.name}

resource "aws_security_group" "allow_8088" {
  name = "allow_ssh"
  # SSH access
  ingress {
    from_port   = 8088
    to_port     = 8088
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

Tham khảo:

Leave a Reply

Your email address will not be published. Required fields are marked *