HCL(HashiCorp Configuration Language)中的模組是一種功能強大的機制,用於將 Terraform 配置劃分為可重用、模組化的組件。模組允許你將一組相關聯的資源和配置封裝在一個可獨立管理的單元中,從而提高了代碼的可讀性、可維護性和可重用性,使你的代碼更有組織結構且易於管理。
以下是 HCL 模組的主要功能:
接下來,要撰寫一個 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
模組。
source
以 main.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 進行佈署動作。