Terraformを実践で使う際のポイントについて記載します。
具体的には
- ファイル構成
- 実行手順
の順に、記載していきます。
Terraformとは?という方は以下の記事をご参照ください。
細かな文法については以下の記事を参考にさせていただくのが良いかと思います
ではまずファイル構成から記載していきます。
以降、S3バケットを作成する例で記載していきます。
ファイル構成
上記の例はS3バケットを作成するのみの単純な構成となっています。
それぞれのファイルの役割について記載していきます
- provider.tf
- 以下のような情報を記載します。
- terraformバージョン
- AWSプロバイダーの定義
- tfstateファイルを管理する場所の定義
- 以下のような情報を記載します。
- variables.tf
- ローカル変数の管理
- aws_s3_bucket.tf
- 実際に作成するAWSリソースの情報を管理
- 「AWS_{サービス名}.ft」というファイル名で作成する
- 今回の例ではS3バケットを作成するため「aws_s3_bucket.tf」というファイル名にしています。
provider.tfについて詳しく見ていく
まず、provider.tfのファイルの中身は以下のようになります。
# terraformバージョンを固定
terraform {
required_version = "1.3.9"
}
# AWSプロバイダーの定義
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.0"
}
}
}
#tfstateファイルを管理するS3バケットを定義
terraform {
backend "s3" {
bucket = "{バケット名}" #バケット名
key = "terraform-test/terraform.tfstate" #tfstateファイルごとに異なる任意の値
region = "ap-northeast-1"
}
}
- Terraformバージョンの固定
- AWSプロバイダーのバージョンを定義
- tfstateファイルをS3で管理
上記がポイントになります。
次にprovider.tfのファイルの中身について詳しく見ていきます。
terraformバージョンを固定について
# terraformバージョンを固定
terraform {
required_version = "1.3.9"
}
AWSプロバイダーの定義について
以下の記述はプロバイダーの定義をしています。
プロバイダーについてもバージョンを記載しておきます。
# AWSプロバイダーの定義
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.0"
}
}
}
tfstateファイルを管理する場所の定義について
まず、tfstateファイルについて記載します。
tfstateファイルはTerraformが生成するファイルで、現在のインフラの状態を記録しています。
tfstateファイルは
- terraform apply
- terraform destroy
などインフラリソースを操作する際に参照される大事なファイルです。
tfstateファイル管理のポイント
#tfstateファイルを管理するS3バケットを定義
terraform {
backend "s3" {
bucket = "{バケット名}" #バケット名
key = "terraform-test/terraform.tfstate" #tfstateファイルごとに異なる任意の値
region = "ap-northeast-1"
}
}
{バケット名}にはS3バケット名を記載します。
variables.tfファイルについて詳しく見ていく
まず、variables.tfのファイルの中身は以下のようになります。
locals {
s3_bucket_name = {
public = "{バケット名}"
}
}
ローカル変数を管理しています。
本記事ではS3バケットを作成していきますので、
S3のバケット名をローカル変数に格納しています。
aws_s3_bucket.tfファイルについて詳しく見ていく
まず、aws_s3_bucket.tfのファイルの中身は以下のようになります。
resource "aws_s3_bucket" "terraform_test_public" {
bucket = local.s3_bucket_name.public
lifecycle {
prevent_destroy = true
}
}
ローカル変数(variables.tfで記載した変数)のバケット名でバケットを作成するファイルです。
リソース作成時の注意ポイント
実行手順
改めて、実行するTerraformファイルについて記載します
用意するファイルは以下の3つです。
ファイル名:provider.tf
# terraformバージョンを固定
terraform {
required_version = "1.3.9"
}
# AWSプロバイダーの定義
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.0"
}
}
}
#tfstateファイルを管理するS3バケットを定義
terraform {
backend "s3" {
bucket = "{tfstateファイルを管理するS3バケット名}" #バケット名
key = "terraform-test/terraform.tfstate" #tfstateファイルごとに異なる任意の値
region = "ap-northeast-1"
}
}
ファイル名:variables.tf
locals {
s3_bucket_name = {
public = "{作成するバケット名}"
}
}
ファイル名:aws_s3_bucket.tf
resource "aws_s3_bucket" "terraform_test_public" {
bucket = local.s3_bucket_name.public
lifecycle {
prevent_destroy = true
}
}
次にTerraformを実行していきます。
tfstateファイルを管理するS3バケットの作成
実行の準備として、以下のコマンドで作成し、tfstateファイルを管理するS3を作成します。
tfstateファイルを管理するS3の作成は手動で行う必要があります。
aws s3 mb s3://{tfstateファイルを管理するS3バケット}
terraform initの実行
実行するコマンド:terraform init
terraform fmtの実行
実行するコマンド:terraform fmt
terraform validateの実行
実行するコマンド:terraform validate
tflintの実行
インストールコマンド:brew install tflin
インストール後にtflintを実行します。
実行するコマンド:tflint
terraform planの実行
実行するコマンド:terraform plan
terraform applyの実行
実行するコマンド:terraform apply
上記コマンドでS3作成ができたかと思います。
次は削除してみます。
terraform destroyの実行
実行するコマンド:terraform destroy
ただし、S3リソースを保護しているため、以下のエラーになると思います。
Resource aws_s3_bucket.terraform_test_public has lifecycle.prevent_destroy set, but the plan calls for this resource to be destroyed. To avoid this error and continue with the plan, either disable lifecycle.prevent_destroy or reduce the scope of the plan using the -target flag.
aws_s3_bucket.tfファイルを以下の通りに修正します。
resource "aws_s3_bucket" "terraform_test_public" {
bucket = local.s3_bucket_name.public
lifecycle {
prevent_destroy = false
}
}
上記のように「prevent_destroy=false」に修正後に以下のコマンドを実行します
実行するコマンド:terraform apply
その後、以下のコマンドで削除できます
実行するコマンド:terraform destroy
まとめ
まとめると、Terraformでのインフラ構築では以下の順で、作業を進めていくことになります。
- Terraformファイルの作成
- Terraformバージョンを固定する
- プロバイダーバージョンを指定する
- tfstateファイルはS3で管理するようにする
- インフラリソースは簡単に削除できないように、削除保護設定をしておく
- tfstateファイルを管理するS3バケットの作成
- tfstateを管理するS3バケットは手動で作成する
- terraform initの実行
- ワークスペースの初期化
- terraform fmtの実行
- ソースファイルのフォーマット
- terraform validateの実行
- バリデーションする
- tflintの実行
- Linter実行
- terraform planの実行
- ドライラン
- terraform applyの実行
- インフラ構築を実行!!
より実践的な記事もありますので、よろしければ、ご参照くださいー
↓公式サイト↓