iT邦幫忙

2023 iThome 鐵人賽

DAY 3
0
DevOps

大家都在用 Terraform 實作 IaC 為什麼不將程式寫得更簡潔易讀呢?系列 第 3

如何利用 HCL 語言的撰寫 Terraform 專案的基本介紹 (Part III) - 模組化

  • 分享至 

  • xImage
  •  

HCL(HashiCorp Configuration Language)中的模組是一種功能強大的機制,用於將 Terraform 配置劃分為可重用、模組化的組件。模組允許你將一組相關聯的資源和配置封裝在一個可獨立管理的單元中,從而提高了代碼的可讀性、可維護性和可重用性,使你的代碼更有組織結構且易於管理。

以下是 HCL 模組的主要功能:

  1. 模組封裝性: 模組允許你將一組相關的資源和配置封裝在一個獨立的文件夾或目錄結構中。這樣,你可以將具體的實現細節隱藏起來,並僅提供必要的輸入和輸出接口。
  2. 可重用性: 你可以在多個 Terraform 項目中使用相同的模組,從而實現配置的重用。這可以節省大量時間,特別是當你需要在不同環境中使用相似的配置時。
  3. 參數化: 模組可以接受參數作為輸入,這使得你可以根據特定需求自定義配置。參數化還增加了模組的靈活性,使它適用於不同的用例。
  4. 版本管理: 模組可以使用版本控制工具(如 Git)進行管理,從而確保你可以跟蹤和控制模組的變化,並在需要時回滾到先前的版本。
  5. 模組間相依性: 你可以在模組中設置讓模組依賴其他模組的邏輯,從而實現復雜的架構和配置。
  6. 抽象化和模板化: 模組允許你將通用邏輯和模板抽象出來,從而提高代碼的可讀性和可維護性。這使得你可以定義一次,多次使用。
  7. 模組測試: 你可以為模組撰寫單元測試,以確保其正確性和穩定性。這有助於減少潛在的錯誤並提高配置的可靠性。

接下來,要撰寫一個 AWS EC2 模組範例來展示使用模組的好處。

首先,我們先建立一個 modules 目錄儲存所有模組檔案,然後再創建一個名為 ec2_instances 模組的目錄,並在該目錄中新增兩個檔案,檔案結構如下:

├── main.tf
└── modules
    └── ec2_instances
        ├── data.aws_ami.ami.tf
        ├── main.tf
        ├── provider.tf
        └── variables.tf
  • main.tf:此專案根目錄下主程式檔案,我們會在此檔案使用共用的模組,後面會詳細說明。
  • /modules/ec2_instances/:此目錄為我們接下來範例要建立的模組相關程式放置的目錄。
  • ./modules/ec2_instances/variables.tf: 在這個檔案中,我們定義了 EC2 實例模組需要用到的變數,於description欄位中會註明每個變數的用途。
variable "region" {
  description = "AWS region"
  default     = "ap-northeast-1"
}

variable "aws_profile" {
  type        = string
  description = "Profile in .aws/config"
  default     = "<YOUR_PROFILE>"
}

variable "instance_count" {
  type = number
  description = "Number of EC2 instances to create"
  default = 0
}

variable "instance_type" {
  type = string
  description = "The type of EC2 instance"
  default = "t2.micro"
}

variable "ami_id" {
  type = string
  description = "The ID of the AMI"
  default     = null
}

variable "environment" {
    type = string
    description = "The environment of EC2 instance"
}
  • ./modules/ec2_instances/provider.tf": 由於我們要建立資源在 AWS 環境上,所以我們定義模組需要用到的 AWS provider 在這個檔案中,並且透過變數方式指定佈署的 Region 與使用的 AWS Profile Name。
aws" {
  region = var.aws_region
  profile = var.aws_profile
}
  • ./modules/ec2_instances/main.tf: 在這個檔案中,我們定義了 EC2 實例模組。
resource "aws_instance" "example" {
  count         = var.instance_count
  ami           = (var.ami_id == null) : data.aws_ami.selected_ami.id ? var.ami_id
  instance_type = var.instance_type

  tags = {
    Name        = "ec2-instance-${count.index}"
    Environment = var.environment
  }
}
  • ./modules/ec2_instances/data.aws_ami.ami.tf: 在這個檔案中,使用了多個過濾條件來篩選我們所需的 AMI。
data "aws_ami" "selected_ami" {
  most_recent = true

  filter {
    name   = "name"
    values = ["amzn2-ami-hvm-*-x86_64-ebs"]
  }

  filter {
    name   = "root-device-type"
    values = ["ebs"]
  }

  filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }

  owners = ["amazon"]
}

最後我們來實作 main.tf 來說明如何利用 ec2_instances模組。

  • 模組中需要指定 sourcemain.tf 相對位置到 my_ec2_instances 模組目錄位置。
  • 指定於 ./modules/ec2_instances/variables.tf 中,可以傳入模組的變數。
    • 由於 ami_id 有指定預設值為 null 如果不指定會自動從 data.selected_ami 挑選一個 AMI 並 assign 上去。
terraform {
  required_providers {
    aws = {
      version = "5.15.0"
    }
  }
}

module "my_ec2_instances" {
  source = "./modules/ec2_instances"

  instance_count = 2
  instance_type  = "t3a.micro"
  # ami_id         = "ami-0c55b159cbfafe1f0"
  environment    = "Dev"
}

下一篇將說明如何用 Terraform 進行佈署動作。


上一篇
如何利用 HCL 語言的撰寫 Terraform 專案的基本介紹 (Part II) - HCL 常用函式
下一篇
如何利用 HCL 語言的撰寫 Terraform 專案的基本介紹 (Part IV) - 套用 HCL 代碼
系列文
大家都在用 Terraform 實作 IaC 為什麼不將程式寫得更簡潔易讀呢?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言