はじめに
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"
}
}
プロバイダー(provider)
Terraformはさまざまなプロバイダーに対応しているので、
使用するプロバイダーを指定する必要があります。
provider "aws" {
region = "ap-northeast-1"
}
変数
Terraformで宣言できる変数を紹介します。
入力変数(variable)
tfファイル外から値を受け取る場合に使用します。
input_variableに任意の変数名を指定します。
ブロック内では以下のオプションを記載することができます。
- type:型を指定できます。(number、string、boolean)
- default:デフォルト値を指定できます。
- sensitive:trueにするとCLIへの出力を抑制できます。(機密情報をマスク化したい場合)
- description:変数の説明を記載します。
variable "input_variable" {
type = string
}
出力変数(output)
作業ディレクトリ外から値を使用する場合に使用する変数です。
output_variableに任意の変数名を指定します。
ブロック内では以下のオプションを記載することができます。
- sensitive:trueにするとCLIへの出力を抑制できます。(機密情報をマスク化したい場合)
- description:変数の説明を記載します。
- depends_on:値の出力に依存関係がある場合に指定する。(積極的に使用しない。)
output "output_variable" {
}
ローカル変数(locals)
tfファイル内でのみ使用できる変数です。
local_variable_1〜local_variable_3に任意の変数名を指定します。
locals {
local_variable_1 = 12
local_variable_2 = "sample"
local_variable_3 = true
}
リソース(resource)
実際のリソースを構築するためのブロックです。
第一引数にAWSのサービス名、第二引数に任意の名前を記述することでAWSサービスを構築することができます。
以下はEC2インスタンスを作成するサンプルになります。
resource "aws_instance" "sample" {
ami = "ami-0404778e217f54308"
instance_type = "t2.micro"
}
モジュール(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"
}
データ(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
}
終わりに
本記事はここまでとなります。
ご覧いただきありがとうございました。ご指摘等がございましたら頂けますと嬉しいです。
引き続き、プログラミングについて定期的に発信していきますのでよろしくお願いします!
また、もしよろしければtwitterもフォローしていただけると嬉しいです!🐢
コメント