自由気ままに書いちゃおう

好きなことをつらつらと・・・

【Terraform】(初心者向け) countを使って繰り返す

この記事では、Terraformの count の使い方をサンプルコードを交え記載しております。

尚、AWSリソースの作成を繰り返す方法を紹介しています。

countとは

count は、特定のリソースを複数回作成するために利用します。

数値を指定することで、その数値の回数だけリソースを作成することが可能です。

https://developer.hashicorp.com/terraform/language/meta-arguments/count

基本的な使い方1

count の基本的な使い方を見てみましょう。 以下のコードスニペットは、AWSのセキュリティグループを3つ作成します。

resource "aws_security_group" "example" {
  count = 3

  name        = "sg-example-${count.index}"
  description = "Example security group"

  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

ここで、count キーワードにより、3つのセキュリティグループが作成されます。

また、${count.index}は、現在の反復のインデックスを返す特殊な変数です。(詳細は後述)

基本的な使い方2

resource "aws_instance" "example" {
  count = 3

  ami           = "ami-0c94855ba95c574c8"
  instance_type = "t2.micro"
}

このコードは、同じ設定のEC2インスタンスを3つ作成します。

countの値を変更することで、作成するインスタンスの数を調整できます。

count.indexの利用

countと組み合わせてcount.indexを利用することで、インスタンスごとに異なる設定を行うことも可能です。以下にその例を示します。

resource "aws_instance" "example" {
  count = 3

  ami           = "ami-0c94855ba95c574c8"
  instance_type = "t2.micro"
  tags = {
    Name = "example-instance-${count.index + 1}"
  }
}

この例では、各インスタンスのNameタグにインスタンスの番号を付けています。

count.indexは0から始まるため、人間が使いやすい1から始まる数字にするために+ 1をしています。

条件付きでリソースを作成する

countは、条件によってリソースを作成するかどうかを制御するのにも使えます。以下にその例を示します。

variable "create_instance" {
  description = "Create instance or not"
  type        = bool
  default     = false
}

resource "aws_instance" "example" {
  count = var.create_instance ? 1 : 0

  ami           = "ami-0c94855ba95c574c8"
  instance_type = "t2.micro"
}

この例では、create_instance変数がtrueの場合にのみインスタンスを作成します。

変数のデフォルト値はfalseなので、何も指定しなければインスタンスは作成されません。

countの注意点

count は強力ですが、注意点もあります。

  1. 順序の変更: count を使用すると、リソースの順序が重要になります。順序が変わると、Terraformは新しいリソースを作成し、既存のリソースを破棄します。これはコストやダウンタイムにつながる可能性があります。

  2. 条件付き作成: count は、条件付きのリソース作成をサポートしています。条件付きリソースの作成には、三項演算子 (condition ? true_val : false_val) を使用します。

以下に例を示します:

variable "create_sg" {
  description = "Should we create the security group?"
  default     = false
}

resource "aws_security_group" "example" {
  count = var.create_sg ? 1 : 0

  name        = "sg-example"
  description = "Example
}



以上です。