【Terraform】Terraformの基本的な構文について徹底解説!!

【Terraform】Terraformの基本的な構文について徹底解説!! インフラ
スポンサーリンク

はじめに

この記事で分かること
  • Terraformの基本的な構文の書き方
ぴんくうさぎ
ぴんくうさぎ

Terraformで何ができるかはわかった!

でもTerraform特有の構文がよくわからないなあ。

みどりがめ
みどりがめ

OK!今回はTerraformの構文、文法について

学習していこう!

Terraform自体の解説やインストールについては、以下の記事で解説しております。
併せてご覧ください。

テラフォーム(terraform)

terraform自体の定義情報を記載します。
ある程度、定型的なことを記述することが多いです。

  • required_version:Terraformのバージョン
  • required_providers:プロバイダーの指定。
  • backend:terraformが管理するstateファイルの保存方法を指定します。
    下記例では、s3に保存しています。

    ※stateファイルについて
    Terraformの実行によって、作成されるリソースを管理しています。Terraformのファイルを変更し、再実行する際には、stateファイルを参照し、どの箇所を変更するかなどを判断します。
terraform {
  required_version = ">=1.3"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~>3.0"
    }
  }
  backend "s3" {
    bucket  = "manage-bucket-sample"
    key     = "terraform.tfstate"
    region  = "ap-northeast-1"
    profile = "terraform"
  }
}
Terraform Settings - Configuration Language | Terraform | HashiCorp Developer
The terraform block allows you to configure Terraform behavior, including the Terraform version, bac...

プロバイダー(provider)

Terraformはさまざまなプロバイダーに対応しているので、
使用するプロバイダーを指定する必要があります。

provider "aws" {
    region = "ap-northeast-1"
}
Providers - Configuration Language | Terraform | HashiCorp Developer
An overview of how to install and use providers, Terraform plugins that interact with services, clou...

変数

Terraformで宣言できる変数を紹介します。

入力変数(variable)

tfファイル外から値を受け取る場合に使用します。
input_variableに任意の変数名を指定します。
ブロック内では以下のオプションを記載することができます。

  • type:型を指定できます。(number、string、boolean)
  • default:デフォルト値を指定できます。
  • sensitive:trueにするとCLIへの出力を抑制できます。(機密情報をマスク化したい場合)
  • description:変数の説明を記載します。
variable "input_variable" {
  type = string
}
Input Variables - Configuration Language | Terraform | HashiCorp Developer
Input variables allow you to customize modules without altering their source code. Learn how to decl...

出力変数(output)

作業ディレクトリ外から値を使用する場合に使用する変数です。
output_variableに任意の変数名を指定します。
ブロック内では以下のオプションを記載することができます。

  • sensitive:trueにするとCLIへの出力を抑制できます。(機密情報をマスク化したい場合)
  • description:変数の説明を記載します。
  • depends_on:値の出力に依存関係がある場合に指定する。(積極的に使用しない。)
output "output_variable" {
}
Output Values - Configuration Language | Terraform | HashiCorp Developer
Output values are the return values of a Terraform module.

ローカル変数(locals)

tfファイル内でのみ使用できる変数です。
local_variable_1〜local_variable_3に任意の変数名を指定します。

locals {
  local_variable_1 = 12
  local_variable_2 = "sample"
  local_variable_3 = true
}
Local Values - Configuration Language | Terraform | HashiCorp Developer
Local values assign a name to an expression that can be used multiple times within a Terraform modul...

リソース(resource)

実際のリソースを構築するためのブロックです。
第一引数にAWSのサービス名、第二引数に任意の名前を記述することでAWSサービスを構築することができます。

以下はEC2インスタンスを作成するサンプルになります。

resource "aws_instance" "sample" {
  ami = "ami-0404778e217f54308"
  instance_type = "t2.micro"
}
Modules - Configuration Language | Terraform | HashiCorp Developer
Modules are containers for multiple resources that are used together in configurations. Learn how to...

モジュール(module)

リソース定義を共通モジュール化したいときに使用します。
共通化することで、最低限の変数を共通モジュールに渡すだけで、リソースを作成することができます。
一つのプロジェクトの中でたくさん作成するリソースは共通化しておくと良いでしょう。

以下は「./modules/s3」にあるリソースをそれぞれ別の変数を渡して3つ作成しています。

module "S3_a" {
  source     = "./modules/s3"
  name = "a"
}

module "S3_b" {
  source     = "./modules/s3"
  name = "b"
}

module "S3_c" {
  source     = "./modules/s3"
  name = "c"
}
Modules - Configuration Language | Terraform | HashiCorp Developer
Modules are containers for multiple resources that are used together in configurations. Learn how to...

データ(data)

terraformの管理対象外のリソース(外部のjsonファイルなど)をtfファイル内に取り込みたい時に使用します。

以下はS3バケットへの読み取りアクセス許可を記載しています。

dataブロックでIAMポリシーの情報を記載しています。

data "aws_iam_policy_document" "s3_read" {
  statement {
    sid       = "s3_read"
    actions   = ["s3:GetObject"]
    effect    = "Allow"
    resources = ["arn:aws:s3:::sample-bucket/*"]
  }

実際にIAMポリシーを作成する箇所で、上記で定義したdataを使用しています。

resource "aws_iam_policy" "s3_iam_policy" {
  name   = "s3_iam_policy"
  policy = data.aws_iam_policy_document.s3_read.json 
}
Data Sources - Configuration Language | Terraform | HashiCorp Developer
Data sources allow Terraform to use external data, function output, and data from other configuratio...

終わりに

本記事はここまでとなります。

ご覧いただきありがとうございました。ご指摘等がございましたら頂けますと嬉しいです。
引き続き、プログラミングについて定期的に発信していきますのでよろしくお願いします!
また、もしよろしければtwitterもフォローしていただけると嬉しいです!🐢

コメント