【Terraform】workspaceを利用した環境別リソース作成【AWS】

10月 11, 2023

どもども、お久しぶりです。


今回はTerraformのworkspaceという機能を利用してAWSリソースを環境別に作成する方法を記事にしてみたいと思います。


AWSリソースを利用する場合、多くの場合は本番環境だけで無くステージング環境や開発環境も作成するかと思います。


Terraformを用いてリソースを環境別にリソースを作成する場合はmoduleを利用する方法がよく用いられると思いますが、リソース構成自体がそこまで大規模でない場合はworkspaceを利用してサクッと作成してしまう方がいいと僕は思っています。


というわけで、workspaceを利用したリソース作成方法をご紹介しようと思います。


今回の記事ではlocal変数を用いたリソース作成を行うので、その辺りに不安がある方は是非当ブログのこちらの記事を一度ご確認ください!

workspaceを作成する

まずは今回の主役、workspaceを用意します。workspaceを用意するとterraformのstateを環境別に管理することができます。今回は"production"と"staging"のworkspaceを作成します。

$ terraform workspace new 'staging' 
$ terraform workspace new 'production' 

上記コマンドでworkspaceの作成は完了です。実際にどのようなworkspaceが存在するかは下記コマンドで確認できます。

$ terraform workspace list
  default
* production
  staging

defaultはその名の通り、terraform initすると自動で作成されるworkspaceです。そして今回はそれ以外にも作成したworkspaceがちゃんと存在していることが確認できますね!

また、現在は"production"のworkspaceにて作業していることがわかります。workspaceを利用してリソースを作成する際は常に自身がどのworkspaceにいるのかを意識しておくことが大切です。下記コマンドで確認することができます。

$ terraform workspace show
production

他のworkspaceに移動する場合は下記コマンドを利用しましょう。

$ terraform workspace select staging
Switched to workspace "staging"
$ terraform workspace show          
staging

これで一通りworkspaceを操作することができるようになりましたね!

local変数を準備

次にlocal変数の準備を行います。今回はproduction環境とstaging環境それぞれのs3バケットの作成を作成してみようと思います。

locals.tfファイルを作成し、そこにlocal変数をまとめておきます。

locals{
    name_prefix = "my-tf-demo"
    s3_bucket_name = "${local.name_prefix}-bucket-${terraform.workspace}"
    s3_tag_map = {
        production = {
            env = terraform.workspace
            description = "Do not delete"
        }
        staging = {
            env = terraform.workspace
        }
    }
    s3_tags = local.s3_tag_map[terraform.workspace]
}

ここでポイントとなるのが"terraform.workspace"という変数です。これはterraform側で元から用意されているもので、現在作業しているworkspace名を取得してくれる大変便利なものです。

また下記部分に注目してください。

    s3_tag_map = {
        production = {
            env = terraform.workspace
            description = "Do not delete"
        }
        staging = {
            env = terraform.workspace
        }
    }
    s3_tags = local.s3_tag_map[terraform.workspace]

環境によって設定項目の種類や数などが異なる際は上記のようにworkspace名を用いたmapを作成し、実際に呼び出す変数にはworkspaceに応じたものを格納できるようにします。

例えば上記はproduction環境のs3バケットだけにはdescriptionタグを追加したいという場合を想定しています。


このようにworkspaceはリソース状況の細やかな制御も可能です。

リソースの作成

それではいよいよ実際にリソースを作成しましょう。

resource "aws_s3_bucket" "demo" {
  bucket = local.s3_bucket_name
  tags = local.s3_tags
}

これで環境別のs3バケットを作成することができるはずです。

実際にworkspaceを移動しながら"terraform plan"や"terraform apply"でリソースを作成してみてください!それぞれの設定でs3バケットが作成されていることを確認できると思います!

さいごに

今回はterraformのworkspaceを用いて環境別にリソースを作成する方法をご紹介しました。


僕自信この方法はかなり気に入っていますし、とても手軽でおすすめです。terraformの環境分けに苦労されている方は是非利用してみてください!


最後まで読んでいただきありがとうございました!

AWS,Terraform

Posted by CY