⛳
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.tfstate
のoutputs
セクションに明示的に情報を表示。 -
terraform.tfstate
のresources
セクションにも書かれているがそこから直接参照することは不可。
10. terraform destroyとdataブロックの関係
dataブロックで参照した既存リソースは、terraform destroy
実行時には削除されません。あくまで参照のみで、管理対象外です。
Discussion