【Terraform】创建多个资源的方法(count、for_each)

首先

以下是关于使用 Terraform 生成多个资源的两种方法 count 和 for_each 的简要总结。

如何使用count

使用 count 可以指定生成资源的次数。

 

我們將試著創建二個IAM使用者。

# ---------------------------------------------
# Terraform configuration
# ---------------------------------------------
terraform {
  required_version = ">=0.13"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.0"
    }
  }
}

provider "aws" {
  profile = "terraform" # ご自身のaws profile
  region  = "ap-northeast-1"
}

# ---------------------------------------------
# IAM User
# ---------------------------------------------
resource "aws_iam_user" "user" {
  count = 2 
  name  = "testuser-${count.index}"
}

我将执行。

$ terraform apply

当您查看AWS控制台时,您会发现已创建了两个按照指定的计数(count)生成的IAM用户。
您可以看到 ${count.index} 在0开始。

スクリーンショット 2022-11-01 18.10.56.png

for_each的使用方法

使用for_each可以在展开指定的映射时生成多个资源。

 

我們試著創建三個子網絡。

for_each用以按照键值对形式指定数值。

  for_each = {
    "192.168.1.0/24" = "ap-northeast-1a"
    "192.168.2.0/24" = "ap-northeast-1c"
    "192.168.3.0/24" = "ap-northeast-1d"
  }

可以使用each.key和each.value来获取值。

  cidr_block        = each.key
  availability_zone = each.value

实际的代码如下所示。

terraform {
  required_version = ">=1.3"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.0"
    }
  }
}
provider "aws" {
  profile = "terraform"
  region  = "ap-northeast-1"
}

# ---------------------------------------------
# Network
# ---------------------------------------------
resource "aws_vpc" "vpc" {
  cidr_block = "192.168.0.0/20"
}

resource "aws_subnet" "subnet" {
# キーバリュー形式で値を指定
  for_each = {
    "192.168.1.0/24" = "ap-northeast-1a"
    "192.168.2.0/24" = "ap-northeast-1c"
    "192.168.3.0/24" = "ap-northeast-1d"
  }
# each.keyとeach.valueで値を取得
  vpc_id            = aws_vpc.vpc.id
  cidr_block        = each.key
  availability_zone = each.value
}

我会执行。

$ terraform apply

只要没有问题,您可以通过查看AWS控制台来确定使用for_each创建的子网数量为3个。

スクリーンショット 2022-11-01 18.28.03.png

我使用 Terraform 的 count 和 for_each 功能来生成多个资源。

广告
将在 10 秒后关闭
bannerAds