Terraform構成をビジュアライズできるツール Pluralithを使ってAWS構成図を自動作成してみる

Terraform構成をビジュアライズできるツール Pluralithを使ってAWS構成図を自動作成してみる

Clock Icon2023.06.29 04:30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

「Terraformのコードから構成図作れないかな?」

構成図の管理は中々大変なものです。自動化するソリューションは色々あると思います。

今回はTerraformコードから構成図を作成できるPluralithというツールが便利だったため、紹介します。

Pluralithとは

Terraformの構成をビジュアライズできるツールです。

引用: Pluralith - Visualize Terraform Infrastructure

例えばEC2とVPCの構成をTerraformで書くと、以下のように図にしてくれます。

実行モードにLocalとCIの2つがあります。

実行モード 概要 料金 備考
Local ローカルPC上で実行 無料 実行結果が48時間で削除される等、制限あり。
CI GitHubActionsやGitLab、Terraform CLoud上で実行 Plan数課金(500 Runsで$250/USD)

CIに組み込むことで真価を発揮するツールかと思うので、Localは検証・実運用はCIといった使い分けをするのが良さそうです。

やってみた

今回はLocalで試してみます。

Pluralith CLIのインストール

利用にはユーザー登録が必要です。

以下のページからユーザー登録します。

Pluralith

サインインができたら以下のページに遷移します。

Localで試したいため、Local Setupを選択します。

Download CLIでバイナリをダウンロードして、macの場合は以下のコマンドでcliを利用できるようにします。

mv pluralith_cli_darwin_amd64_v0.2.2 pluralith
mv pluralith /usr/local/bin/
chmod +x /usr/local/bin/pluralith

ブラウザで表示されているAPI Keyを使って、CLIでログインします。

PLURALITH_API_KEY="<API Key>"
pluralith login --api-key $PLURALITH_API_KEY

構成図を作成してみる

VPCとEC2の構成をTerraformで用意しました。

この構成で構成図を作成してみます。

provider "aws" {
  region = "ap-northeast-1"
}

data "aws_availability_zones" "available" {}

locals {
  name     = basename(path.cwd)
  vpc_cidr = "10.0.0.0/16"
  azs      = slice(data.aws_availability_zones.available.names, 0, 3)
}

module "vpc" {
  source             = "terraform-aws-modules/vpc/aws"
  name               = local.name
  cidr               = local.vpc_cidr
  azs                = local.azs
  private_subnets    = [for k, v in local.azs : cidrsubnet(local.vpc_cidr, 8, k)]
  enable_nat_gateway = false
}

data "aws_ssm_parameter" "amazonlinux_2023" {
  name = "/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64" # x86_64
}

resource "aws_instance" "main" {
  ami           = data.aws_ssm_parameter.amazonlinux_2023.value
  instance_type = "t3.micro"
  subnet_id     = module.vpc.private_subnets[0]
  tags = {
    Name = local.name
  }
}

terraform applyでリソースを作成します。

terraform apply

リソースが作成できたら、Pluralithで構成図を作成します。

$ pluralith graph


⠿ Initiating Graph ⇢ Posting Diagram To Pluralith Dashboard

→ Authentication
  ✔ API key is valid, you are authenticated!

→ Plan
  ✔ Local Execution Plan Generated
  ✔ Local Plan Cache Created
  ✔ Secrets Stripped
  ✔ Costs Calculated

→ Graph
  ✔ Local Diagram Generated
  ✔ Diagram Posted To Pluralith Dashboard

  → Diagram Pushed To: https://app.pluralith.com/#/orgs/<URL>

コマンドを実行すると自動的にブラウザで構成図が表示されました。

作成される図も見やすくていい感じです。

PDFやPNGにエクスポートすることもできます。

変更箇所とコストの確認

作成するだけではなく、変更履歴も確認できます。

EC2をコメントアウトしてみてみましょう。

provider "aws" {
  region = "ap-northeast-1"
}

data "aws_availability_zones" "available" {}

locals {
  name     = basename(path.cwd)
  vpc_cidr = "10.0.0.0/16"
  azs      = slice(data.aws_availability_zones.available.names, 0, 3)
}

module "vpc" {
  source             = "terraform-aws-modules/vpc/aws"
  name               = local.name
  cidr               = local.vpc_cidr
  azs                = local.azs
  private_subnets    = [for k, v in local.azs : cidrsubnet(local.vpc_cidr, 8, k)]
  enable_nat_gateway = false
}

data "aws_ssm_parameter" "amazonlinux_2023" {
  name = "/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64" # x86_64
}

# resource "aws_instance" "main" {
#   ami           = data.aws_ssm_parameter.amazonlinux_2023.value
#   instance_type = "t3.micro"
#   subnet_id     = module.vpc.private_subnets[0]
#   tags = {
#     Name = local.name
#   }
# }

以下コマンドで構成図を作成します。

$ pluralith graph

変更を検知して、コメントアウトしたEC2がハイライトされています。

また、コストの変化も確認できます。

EC2が1台削除されるため、10USD/月程度が削減できることを確認できました。

Pull Requestとかに添付されていたら、とても便利ですね。

おわりに

Terraform構成をビジュアライズできるツール Pluralith の紹介でした。

作成される図もきれいで実用的でした。

CIに組み込むことでPull Requestで変更がビジュアルで確認できるため、変更箇所の把握がしやすくなり、生産性が上がりそうです。

料金もそこまで高く無いのも嬉しいポイントですね。(500 Plan/月で250USD)

Terraform CloudのRun Tasksで使えるみたいなので、次回はこちらを試してみたいと思います。

以上、AWS事業本部の佐藤(@chari7311)でした。

参考

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.