😃

[Terraform/AWS] ブロックタイプの解説

2024/01/21に公開

概要

  • 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 ブロック

  • 作成したリソースの IDname 等を外部から参照出来るように値を定義する。
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"
GitHubで編集を提案

Discussion