はじめに
IaC環境のひとつ、Terraformでコード管理しようとするとき、一般的にはバックエンドで生成される状態を管理するファイルである terraform.tfstate
ファイルを、AWSではS3バケット上に格納することが多いですが、複数の環境のステートファイルをS3バケットで管理しようとするとなかなか煩雑になることが多々あるので、それを少し改良しようと、試しにTerraform Cloudで管理をしてみることにしました。
Terraform Cloudは、HashiCorp社が提供するTerraform向けのSaaS型のホスティングサービスで、本来はTerraformを組織の中で共同で利用するためのリポジトリを提供してくれたり、使いこなすことができれば、例えばGitHub上で管理しているTerraformのコードのプルリクエストがマージされた際に、GitHub Actionsのように、変更されたリソースの記述を環境上に反映してくれたりといったCI/CD的な機能を提供してくれたりと結構便利な機能が搭載されているのですが、そこまでのコントロールが必要でなくても、例えばステートファイルだけを管理することも可能です。
今回は、本当のスモールスタートで、ステートファイルだけをTerraform Cloud上に管理するところだけをスコープにしています。
設定手順
HashiCorp Cloud PlatformアカウントとOrganizationの作成
まずはHashiCorp Cloud Platformアカウントをトップページから作成してアカウントを取得後、Organizationの設定を行います。無料のプランであれば、5人まで組織の中にアカウントを紐づけることが可能です。
参考:
Projectとworkspaceの作成
Terraform Cloudは、Organizationの下に複数のProjectをぶら下げることができ、さらにその下に実際のステートファイルを管理するworkspaceを作成していくことができます。Terraform Cloudに作成したアカウントでログインすると、Projects & workspacesという画面に遷移するので、まずは右上の[New]ボタンをクリックしてProjectを作成します。
Projectの作成が完了したら、同じく[New]ボタンをクリックしてworkspaceを作成します。今回はコードの管理はGitHub上で行い、ローカルのターミナル環境を利用してTerraformの操作を行うので、Create a new Workspaceの画面上では[CLI-driven workflow]を選択します。すると次の画面でWorkspaceの名前と、Projectとの紐付けを行う画面に遷移するので、workspace名を入力して、先ほど作成したProjectを選択し、一旦[Create workspace]ボタンをクリックします。これでworkspaceまでが作成できています。
workspaceの設定
workspaceの設定まで完了したら、左ペインの[Settings]をクリックしてExecution Modeを”Local”に、Remote state sharingを”Share with all workspaces in this organization”に変更します。Execution Modeを”Remote”にすると、Terraformの実行に関する操作がすべてTerraform Cloud上にある仮想マシン上で実行されます。今回はステートファイルだけをTerraform Cloud上で管理したいため、”Local”に設定して、[Save settings]ボタンをクリックします。
Terraform側の設定
Terraform Cloudと連携できるようにするために、Terraformの実行環境を設定している .tf
ファイルを以下のように記述します。(敢えてバックエンドをS3に設定していた時の設定をコメントアウトして残しています)
# ===============================================================================
# Terraform
# ===============================================================================
terraform {
required_version = "1.4.6"
# backend "s3" {
# bucket = "terraform-bucket"
# key = "terraform.tfstate"
# region = "ap-northeast-1"
# }
cloud {
organization = "vlayusuke"
hostname = "app.terraform.io"
workspaces {
name = "vlayusuke-poc-infrastructure-develop"
}
}
required_providers {
aws = {
source = "hashicorp/aws"
version = "4.65.0"
}
}
}
実際に動かしてみる
Terraformを実行するときには、ターミナル上でまず最初に terraform login
してTerraform Cloudにログインします。このときにトークンの発行を求められるので、 yes
を入力するとWebブラウザに遷移してトークン発行画面が表示されます。
トークンを発行したらターミナルコマンドに貼り付けるとTerraform Cloudのログイン画面に遷移するので、あとは普通に terraform init
して terraform plan
して terraform apply
することで、ステートファイルをTerraform Cloud上に保持しながらTerraformの操作を実行することが可能になります。
そしてステートファイルは以下のようにTerraform Cloud上に保持されます。
今後進めたいこと
これで、バックエンドに terraform.tfstate
ファイルを管理することなく、Terraformを用いた環境の構築と構成管理を進めていくことが可能になりました。
とはいえTerraform Cloudではまだまだ色々なことができそうなので、効率的に環境構築と構成管理をできるように、Terraform Cloudの機能を色々と試していきたいと思います。