Terraformの基礎まとめ(1)

に公開

Terraformの基礎まとめ(1)

本記事では、Terraformを学習する上で重要な基本的な要素を整理します。
個人の再学習用です。間違いや誤解があればコメントでご指摘ください。
参考書籍、公式サイト、ChatGPT、手元で実際にTerraformを操作しながら学習しています。

参考資料

[詳解]AWS Infrastructure as Code――使って比べるTerraform&AWS CDK
Terraform AWS


1. HCL(HashiCorp Configuration Language)とは?

Terraformが使用する設定記述言語で、宣言型で読み書きがしやすい特徴を持っています。

HCLの基本構文

resource "aws_s3_bucket" "example" {
  bucket = "my-bucket"
  acl    = "private"

  tags = {
    Environment = "Dev"
  }
}

2. コンフィグのブロック

Terraformの設定は複数のブロックで構成され、主なブロックには以下があります。

  • provider:Terraformが操作するクラウドやサービス(例:AWS)を指定し、その認証情報やリージョンなどを設定
  • resource:Terraformが作成・管理する具体的なインフラリソース(例:EC2インスタンスやS3バケット)を定義
  • variable:再利用性や柔軟性のために外部からの入力値を定義
  • output:Terraformの実行結果として、ユーザーや他のモジュールに渡す値を表示・出力
  • module:再利用可能なTerraformコードの単位を呼び出すためのブロックで、大規模構成の分割管理に利用
  • data既存のリソースや外部情報を読み取り専用で参照するためのブロックで、構成の動的化に利用可能

ブロックの構造例

resource "aws_instance" "example" {
  ami           = "ami-xxxxxxxx"
  instance_type = "t2.micro"

  tags = {
    Name = "example"
  }
}

3. 引数の型

Terraformで使用する引数には以下の型があります。

  • 基本型: string, number, bool
  • 複合型: list, map, object, tuple, set
variable "instance_names" {
  type = list(string)
  default = ["web1", "web2"]
}

4. nullの使い方

nullは値を未設定やデフォルトにしたい時に使います。

variable "optional_setting" {
  type    = string
  default = null
}

resource "aws_instance" "example" {
  instance_type = var.optional_setting != null ? var.optional_setting : "t2.micro"
}

5. Argument Reference と Attribute Reference

  • Argument Reference:Terraformリソースを作成するための入力引数
  • Attribute Reference:リソース作成後にTerraformから参照可能になる出力値
# 引数
resource "aws_sqs_queue" "my_queue" {
  name = "test-queue-tf"
}

# 属性の参照
output "sqs_queue_url" {
  value = aws_sqs_queue.my_queue.id
}

6. 識別子について

識別子はTerraform内で一意である必要があります。具体的には、同一モジュール内で同じリソースタイプと名前の組み合わせを複数回使うことはできません。


7. dataブロック

dataブロックは既存のAWSリソースや動的情報を取得するために使います。

既存のSQSキューを参照する例

data "aws_sqs_queue" "existing_queue" {
  name = "existing-queue-name"
}

現在のAWSアカウント情報を取得する例

data "aws_caller_identity" "current" {}

8. outputブロックの活用

outputブロックはTerraformで取得した情報を分かりやすく表示するために使用します。

output "existing_sqs_queue_url" {
  value = data.aws_sqs_queue.existing_queue.url
}

output "aws_account_id" {
  value = data.aws_caller_identity.current.account_id
}

9. terraform.tfstate と outputの関係

  • terraform.tfstate はTerraformが管理するリソースの情報をJSON形式で保持。
  • output ブロックは terraform.tfstateoutputsセクションに明示的に情報を表示。
  • terraform.tfstateresourcesセクションにも書かれているがそこから直接参照することは不可。

10. terraform destroyとdataブロックの関係

dataブロックで参照した既存リソースは、terraform destroy 実行時には削除されません。あくまで参照のみで、管理対象外です。


Discussion