ForgeVision Engineer Blog

フォージビジョン エンジニア ブログ

Terraform Workspace を利用したディレクトリ構成でのパラメータの運用パターンをご紹介!(ゼロから始める Terraform 講座~その3~)

こんにちは、こんばんわ!クラウドインテグレーション事業部の魚介系エンジニア松尾です。

前回ご紹介させていただいた Terraform の記事は、「Terraform プロジェクトの効果的なディレクトリ構成パターン(ゼロから始める Terraform 講座~その2~)」ということで、いくつかのディレクトリ構成パターンについてご紹介させていただきました。

その中で、「ルートディレクトリが複数の場合 パターン②」として紹介させていただいた、Terraform Workspace を利用したディレクトリ構成に関して、細かい注意点まで言及できていませんでしたので、今回はそれを補完する追加情報をご提供できればと思います。

これまで投稿させていただいた記事と併せて、ご参考にいただければ幸いです!

なお、前回までの Terraform に関する投稿は以下の通りです!

ゼロから始める Terraform 講座~その1~ - ForgeVision Engineer Blog

Terraform プロジェクトの効果的なディレクトリ構成パターン(ゼロから始める Terraform 講座~その2~) - ForgeVision Engineer Blog

注:本記事は AWS 利用者向けの記事となり、AWS 環境をベースにコードの記載をさせていただいております。

はじめに

本記事をご覧いただく上での前提事項

本記事内では基本的な Terraform の使い方などには言及しません。
一部のディレクトリ構成で活用できる応用的な手順となりますので、予めご容赦下さい。

複数の環境を単一のルートディレクトリで管理する場合の注意事項

Terraform のディレクトリ構成パターンはどれもメリット・デメリットがあり、一概に構成の良し悪しを判断することはできません。
前回の Terrarform の記事でご紹介した「ルートディレクトリが複数の場合 パターン②」もコードの肥大化が抑えられる一方で、一部の環境のみ必要な設定などがあると、コードが複雑化していくというデメリットもあります。(実際にこの構成での運用から離脱されたケースもあります)

今回は「ルートディレクトリが複数の場合 パターン②」での利用をご検討中の方向けに、環境ごとに適用を分岐させる方法をご紹介したいと思います。
こちらを踏まえた上で、Terraform の構成検討の一助となれば幸いです。

Terraform Workspace 利用時のパラメータの運用パターン

①一部の環境のみリソースを展開する場合

複数の環境を単一のディレクトリ構成で運用している場合、モジュールも共通で利用することとなりますが、一部のリソースに関して本番環境のみ実装するが、開発環境では不要というパターンも実際に運用する中で発生することもあるかと思います。
条件分岐に if 文がそのまま使えればよいのですが、Terraform で if 文は使えません
そういった場合には count メタ引数+三項演算子を利用する必要があります。

count メタ引数は通常引数に整数を与えることでリソースの作成数を指定することができるものとなります。

  • count 実装例
resource "aws_instance" "fv-server" { 
  count          =  3  # EC2 インスタンスを 3 つ作成する
  ami            =  "ami-xxxxxxxx" 
  instance_type  =  "t3.large" 
  tags  =  { 
    Name  =  "FV-Server-${count.index}" 
  } 
}

※count を使って作成されたリソースは index 番号が付与されるため、個々のリソースの属性値を取り出したい場合は index 番号を用いて参照する必要があります。

これに三項演算子を加えることで、リソース作成の有無を指定することが可能です。

  • count + 三項演算子実装例
resource "aws_instance" "fv-server" { 
  count          =  var.env == "production" ? 1 : 0  # env 変数が production の場合に EC2 インスタンスを 1 つ作成する
  ami            =  "ami-xxxxxxxx" 
  instance_type  =  "t3.large" 
  tags  =  { 
    Name  =  "FV-Server-${var.env}" 
  } 
}

※variables(環境変数)に productiondevelopment などの変数が準備されていることを前提としております。

この count を用いた運用は、本ディレクトリの構成ではこの count を多用するケースがどうしても増えてくることが多く、属性値の参照にもインデックス情報を付与する必要があるなど、前述した「コードが複雑化する」原因の1つとなっております。
そのため本ディレクトリ構成を検討する場合は、環境間でのリソースの種類や数に差分が可能な限り少ない環境での利用をお勧めします。

②一部の環境のみパラメータを変更したい場合

一部の環境のみパラメータを変更したい場合は三項演算子のみ利用します。
以下の例では EC2 のインスタンスタイプを本番環境以外「t3.micro」とする例です。
※①では値がが等しい場合の例を上げましたので、以下は値が等しくない場合を例に挙げております。

  • 三項演算子実装例
resource "aws_instance" "fv-server" { 
  ami            =  "ami-xxxxxxxx" 
  instance_type  =  var.env != "production" ? "t3.micro" : "t3.large"  # env 変数が「production」以外の場合に「t3.micro」とし、「production」の場合は「t3.large」とする
  tags  =  { 
    Name  =  "FV-Server-${var.env}" 
  } 
}

※variables(環境変数)に productiondevelopment などの変数が準備されていることを前提としております。

管理している環境が3環境までかつパラメータが2パターンの場合は上記の方法でパラメータを分岐させることが可能です。
ただし、通常の運用中でこれを多用すると可読性が悪くなるため、一時的な設定変更の時のみのご利用をお勧めします。

恒久的なパラメータ設定は、「ルートディレクトリが複数の場合 パターン②」でご紹介している通り、locals.tf にてパラメータを定義し各ブロックから参照を行ったほうが後々の運用も考えると効率的です。

最後に

今回は複数環境を単一のルートディレクトリで構成する場合の注意点や運用方法についてご紹介させていただきました。
どういったディレクトリ構成であってもメリット・デメリットは存在しており、ご検討の際は実際の運用に最もマッチする構成を選択いただければと思います。
本記事で紹介した Tips はあくまで一部となりますが、皆様のご参考になれれば幸いです!!

では次回もお楽しみに!!!