😃
[Terraform/AWS] ブロックタイプの解説
概要
- HCLで使用する各ブロックタイプの説明
本記事を読み終わった時のゴール
- 各ブロックの意味を一定押さえ、コードの基本的な書き方やデプロイまで荒くてもイメージを持てる事。
目次
1.HCLについての簡易的な説明
2.各ブロックタイプの解説
本編
1.HCL(HashiCorp Configuration Language) とは?
- Hashicorp社が開発したTerraformでインフラ構築を行う際に用いる独自言語。
簡単な特徴を下記に記載します。
<特徴>
・変数や関数を使用する事が出来、簡易的なプログラムが組める。
・構造的に JSON に似ているが、ファイル内にコメントを書ける。(`#`,`//`,`/* */` を使用)
・キーと値の区切りは、 `:`ではなく、`=`である。
・ヒアドキュメントの記載が可能。
・ブロック単位 (ブロックタイプ,ラベル) で設定を行う。
・コードを実行する際は、カレントディレクトリの拡張子が`.tf` ファイルを読み込んで設定が反映される。
サブディレクトリのファイルは読み込まれない。
2.各ブロックタイプの解説
- 本記事では、全てのブロックタイプを用いて構築する事はしません。
概念的な部分をざっくり押さえていただけたらと思います。
1.terraform ブロック
- Terraform に関する基本的な設定
- 主にTerraformの使用バージョン,プロバイダの指定,ステートファイルの設定等を記述する。
config.tf
terraform {
required_version = "1.6.5" // 使用するterraform のバージョンを設定
required_providers {
aws = {
source ="hashicorp/aws"//プロバイダーとしてAWSを使用する事を明示的に設定
version = "5.30.0"
}
}
// S3バケットはユーザー側で別途作成する必要がある。
// state ファイルの説明は長くなるため本記事では割愛。
backend "S3" {
path = "./backend/terraform-state"
}
}
2.provider ブロック
- 指定したプロバイダを使用するにあたって、リージョンや認証情報の設定等を行う。
また、各リソースに共通で使用するデフォルトのタグを定義出来る。
config.tf
provider "aws" {
region ="ap-northeast-1"//東京リージョンをデフォルトリージョンに 指定。
profile = "test" // CLI や SDK で API 接続可能な認証ユーザ名を設定。
// AWS CLI の場合は、aws configureで設定したprofile名。
default_tags {
tags = {
env = local.environment // 全リソース共通で付与したいタグを設定
}
}
}
locals.tf
locals {
environment = "dev"
}
3.resource ブロック
- Terraform で管理対象とするリソースの設定を行う。
設定した内容に基づいて、実際のリソースが構築される。
network.tf
resource "aws_vpc" "test" {
cidr_block = "10.0.0.0/16"
tags = {
Name = "test-vpc"
}
}
4.data ブロック
- Terraform で管理対象外のリソースを取り込んで参照出来る。
- デフォルトや既存で作成済みのリソース,
output
で外出し設定をしているリソース等の参照が可能。
data.tf
// data ブロックを用いて、自らの AWS アカウント ID を AWS プロバイダか ら取得し、terraform の管理下に置く。
data "aws_caller_identity" "current" {}
5.output ブロック
- 作成したリソースの
ID
やname
等を外部から参照出来るように値を定義する。
output.tf
// data ブロックで取得したアカウント ID を外部向きに出力する設定
output "account_id" {
value = data.aws_caller_identity.current.account_id
}
// resource ブロックで取得した VPC ID を外部向きに出力する設定
output "vpc_id" {
value = data.aws_vpc.test.id
}
6.locals ブロック
- 外部から変更不可能な変数を設定する。
local.tf
locals {
ami ="ami-0dafcef159a1fc745"//AmazonLinux2のAMIを変数で 定義
type = "t2.micro" // インスタンスタイプの定義
}
compute.tf
resource "aws_instance" "test" {
ami = local.ami
instance_type = local.type
}
7.variable ブロック
- 外部から変更可能な値を設定する。
- 様々なデータ型を用いて値を定義できる。
variables.tf
variable "vpc_cidr" {
type = string
default = "192.168.0.0/24"
}
network.tf
resource "aws_vpc" "test" {
cidr_block = var.vpc_cidr // variable変数の値が代入される。
}
尚、他にも variables
変数を定義、反映する方法がいくつかあります。
①環境変数に埋め込む方法
- ファイルとして残したくない鍵情報等を定義したい場合に有効。
- 運用管理用で使用する共有のサーバを用いる場合に使用可能
variables.tf
variable "env" {
type = string
default = ""
}
コマンド
export TF_VAR_env="dev"
terraform apply
※TF_VAR_{variable変数のラベル名}={値}
②変数ファイルを用いる方法
-
git
で管理が出来るため、変更箇所が分かりやすくなる。
variables.tf
variable "vpc_cidr" {
type = string
default = ""
}
terraform.tfvars
vpc_cidr = "192.168.0.0/24"
network.tf
resource "aws_vpc" "test" {
cidr_block = var.vpc_cidr // terraform.tfvars内の値が代入される。
}
コマンド
terraform apply
③コマンド引数で指定する方法
- 実行の際にログに残す事が出来る。
- テストやデバッグで一時的に部分的な変更を行いたい場合に有効。
variables.tf
variable "env" {
type = string
default = ""
}
コマンド
terraform apply -var env="dev"
Discussion