【GCP与Terraform】【入门篇③】操作Terraform模块
上次
【GCP和Terraform】【入门篇①】使用Terraform创建GCP虚拟机
https://qiita.com/SHA_AKA/items/86bf08e9cf35c3b7fd6f
【GCP和Terraform】【入门篇②】Terraform的依赖关系和VPC配置
https://qiita.com/SHA_AKA/items/77125c7460e73a29de1b
这次的目标
- Terraform模块是使用模块创建配置文件的实现结果。
关于Terraform模块的内容
如果继续使用 Terraform 来管理基础设施,配置将逐渐变得复杂。下面列出的问题可能会变得越来越严重:
– 对于 main.tf 配置文件的管理变得困难。
– 更新一个资源块可能会对其他块产生意外的影响,因此配置更新的风险增加。
– 开发环境和生产环境的管理会变得混乱。
– 跨项目或团队的共同开发、运维和维护成本增加。
为了解决这个问题,可以利用模块。
Terraform配置文件.tf汇总到一个目录中的一个或多个模块。
例如,Terraform模块的目录可能会像下面这样。
|--main.tf
|--variables.tf
|--modules
| |--gcs-static-website-bucket
| | |--LICENSE
| | |--README.md
| | |--main.tf
| | |--outputs.tf
| | |--variables.tf
| |--vm-instance
| | |--LICENSE
| | |--README.md
| | |--main.tf
| | |--outputs.tf
| | |--variables.tf
在上述例子中,主目录的配置文件为main.tf,并存在两个模块:gcs-static-website-bucket和vm-instance。对于每个文件:
许可证在分发模块时会包含许可证。当共享模块时,可以通过这个LICENSE文件让模块的使用者了解使用条件。但是Terraform不使用这个文件。说明文档.md这是一个用Markdown格式编写的文档,用于说明模块的使用方法。Terraform不使用此文件。主要.tf这个文件包含了模块构成的主要部分。还可以创建其他的配置文件来整理配置文件,以适应项目的需求。variables.tf 只是一个文件名。这是一个包含了用于模块的变量定义的文件。当其他人使用这个模块时,每个变量将被配置为模块块内的参数。由于在Terraform中需要定义所有值,没有默认值的变量将都成为必需的参数。而有默认值的变量可以被指定为模块参数。结果.tf这是一个包含模块输出定义的文件。用于将模块输出传递给构成的其他部分的相关信息,这些信息是由模块定义的基础设施的各个部分组成的。
还有其他的文件,比如terraform.tfstate、.terraform或.tfvars,但是我们这次不会对它们进行解释。
2. 使用模块构建基础设施
我打算按照上述相同的结构来实施存储桶和实例的配置。
在/gcs-static-website-bucket/variables.tf文件中添加以下内容。
variable "name" {
description = "作成するバケットの名前"
type = string
default = "一意のバケット名前"
}
variable "project_id" {
description = "バケットを作成するプロジェクトの ID"
type = string
default = "projectid"
}
variable "location" {
description = "バケットの場所"
type = string
default = "asia-northeast3"
}
variable "bucket_policy_only" {
description = "バケットに対するバケット ポリシーのみのアクセスを有効にする"
type = bool
default = true
}
variable "versioning" {
description = "true に設定すると、バージョニングがこのバケットで完全に有効になる"
type = bool
default = true
}
variable "force_destroy" {
description = "バケットを削除する際、含まれているすべてのオブジェクトが削除されるかどうかがこのブール値オプションで決まる。false の場合、Terraform はオブジェクトが含まれているバケットを削除できない。"
type = bool
default = true
}
将以下内容添加到/gcs-static-website-bucket/main.tf文件中。
resource "google_storage_bucket" "bucket" {
name = var.name
project = var.project_id
location = var.location
force_destroy = var.force_destroy
versioning {
enabled = var.versioning
}
}
下一步,我们需要在 `/vm-instance/variables.tf` 文件中添加以下内容。
variable "project_id" {
description = "projectid"
default = "shadev2022"
}
variable "name" {
description = "インスタンスの名前"
default = "instance1"
}
variable "machine_type" {
description = "machine_type"
default = "n1-standard-1"
}
variable "zone" {
description = "zone"
default = "asia-northeast1-c"
}
variable "image" {
description = "image"
default = "debian-cloud/debian-9"
}
将以下内容添加到 /vm-instance/main.tf 文件中。
resource "google_compute_instance" "instance" {
project = var.project_id
name = var.name
machine_type = var.machine_type
zone = var.zone
boot_disk {
initialize_params {
image = var.image
}
}
network_interface {
network = "default"
access_config {
}
}
}
最后,我们将以下内容添加到~/main.tf文件中。
module "gcs-static-website-bucket" {
source = "./modules/gcs-static-website-bucket"
}
module "vm-instance" {
source = "./modules/vm-instance"
}
通过模块文件夹名可以指定模块。
建立配置文件的过程已经完成。
3. 实施结果
使用terraform init命令和terraform apply命令来执行。
结果如下所示。
module.gcs-static-website-bucket.google_storage_bucket.bucket: Creating...
module.vm-instance.google_compute_instance.instance: Creating...
module.gcs-static-website-bucket.google_storage_bucket.bucket: Creation complete after 1s [id=<projectid>]
module.vm-instance.google_compute_instance.instance: Still creating... [10s elapsed]
module.vm-instance.google_compute_instance.instance: Creation complete after 13s [id=projects/<projectid>/zones/asia-northeast1-c/instances/instance1]
删除资源并下次使用
当你执行terraform destroy命令时,将会删除你现在配置的所有资源。
下次我们将讨论有关Terraform State的话题。