メインコンテンツまでスキップ

Difyを使って、terraformとアーキテクチャー図を作成する

· 約10分
Masanori Taguchi

こんにちは、田口です。

はじめに

Terraformは、インフラストラクチャをコードとして管理し、クラウドリソースを効率的にプロビジョニングするための強力なツールです。しかし、Terraformのコードを書くことは、特に複雑なインフラストラクチャを管理する際に手間がかかることがあります。そこで、Difyのローコードプラットフォームを活用して、Terraformのコード生成を効率化する方法を試してみました。

Difyとは?

Difyは、ローコード/ノーコードプラットフォームであり、GUIベースのインターフェースを提供して、複雑なコードを簡単に生成できます。開発者は手動でコードを書く手間を省き、効率的にアプリケーションなど構築することができます。

今回試したこと

非常に簡単なサンプルになりますが、Difyを使って、terraformの構成の作成と、アーキテクチャー図を作成したいと思います。

TL;DR

  • Difyのローコードプラットフォームを活用する試みをしている
  • Terraformのコード生成や、アーキテクチャー図の簡素化を試してる
  • まだ、初歩の使い方で、実際の運用には、まだまだ課題があるが今後も検証を続ける予定

作成に用いたプロンプトと狙い

狙い

「terraformのvpcとalbの構成を作成して、そのアーキテクチャー図を作成する」ということをDify上で実現してみたいと思います。

本来であれば、terraformのコードを書いて、アーキテクチャー図を作成するのが一般的ですが、今回は、Difyを使って、ローコードで、簡単に作成できるか挑戦してみたいと思います。

今回は、terraformのディレクトリ構成や、moduleの使い方、stateの保存先などを細かく指定し、それらのsampleコードの出力をし、それと同時に、アーキテクチャー図を作成することを試してみたいと思います。 これらをDifyを使って、どの程度の効率化ができるかを試してみたいと思います。

difyは以下のようなフローで作成していきます。

  1. インプットとして、terraformのコードで出力したい構成を指示
  2. diagramをDifyのナレッジとして取得
  3. これらを元に、terraformのコード生成並び、アーキテクチャー図を生成する

プロンプトとしては以下になります。

terraformのソースコードを作って

環境は、devとprdの2つを別々にできるように
依存ファイルはterraform.tfvarsに設定して
例えば、public_subnets_cidrやavailability_zonesは、terraform.tfvarsに設定して

moduleはmodules配下に作成して

vpcの以下のmoduleを作って
public subnetを2つ作って
azは、ap-northeast-1のaとcを使って

internet gatewayとalbを繋いで
albからpublic subnetにアクセスできるように設定して

albの以下のmoduleを作って
albはpublic subnet内に作って
albは固定でokのレスポンスを設定して
HTTPでアクセスできるalbとseculity groupを作って

environments/dev/vpc/** のような階層で作って

以下は必ず結果として出力して
environments/dev/vpc/terraform.tfvars
environments/dev/vpc/variables.tfvars

stateの保存先は、s3を利用して、環境とコンポーネント単位にキーを設定して
例えば、keyは "dev/vpc/terraform.tfstate" と "dev/alb/terraform.tfstate" として
tfstate間は、dataを使って参照して

environments/dev/alb/terraform.tfvarsの
vpc_idの参照は、albのdataを参照してください

かなり雑な命令になってます。本来であれば、もう少し細かく指示するべきですが、今回は、簡単なサンプルを作成するため、このような指示になりました。 実現したかった点としては、terraformのコードを作成する際に、moduleを使って、環境ごとに変数を設定できるようにしたかったです。また、stateの保存先をs3にして、dataを使って参照することで、環境ごとにtfstateを分けることができるようにしたかったので、その点を意識して作成しました。

terraformの構成

上記の指示に従って、terraformのコードを作成できました。 今回は、gpt4oを使って、terraformのコードを生成し、ある程度は簡単に作成できたのですが、指示毎に、かなり手間がかかりました。この辺りは生成AIに対する慣れが必要だと感じました。 結果以下のような、構成と、ソースコードを出力するできました。

ディレクトリ構成
.
├── environments
│ ├── dev
│ │ ├── alb
│ │ │ ├── main.tf
│ │ │ ├── outputs.tf
│ │ │ ├── terraform.tfvars
│ │ │ └── variables.tf
│ │ └── vpc
│ │ ├── main.tf
│ │ ├── outputs.tf
│ │ ├── terraform.tfvars
│ │ └── variables.tf
│ └── prd
│ └── (同様の構成)
└── modules
├── alb
│ ├── main.tf
│ ├── outputs.tf
│ └── variables.tf
└── vpc
├── main.tf
├── outputs.tf
└── variables.tf

modules/vpc/main.tf

provider "aws" {
region = var.region
}

resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
}

resource "aws_subnet" "public" {
count = 2
vpc_id = aws_vpc.main.id
cidr_block = element(var.public_subnets_cidr, count.index)
availability_zone = element(var.availability_zones, count.index)
map_public_ip_on_launch = true
}

resource "aws_internet_gateway" "main" {
vpc_id = aws_vpc.main.id
}

output "vpc_id" {
value = aws_vpc.main.id
}

output "public_subnet_ids" {
value = aws_subnet.public[*].id
}

environments/dev/vpc/terraform.tfvars

region = "ap-northeast-1"

public_subnets_cidr = ["10.0.1.0/24", "10.0.2.0/24"]
availability_zones = ["ap-northeast-1a", "ap-northeast-1c"]

environments/dev/alb/main.tf

data "terraform_remote_state" "vpc" {
backend = "s3"
config = {
bucket = "my-terraform-state-bucket"
key = "dev/vpc/terraform.tfstate"
region = "ap-northeast-1"
}
}

module "alb" {
source = "../../modules/alb"

region = var.region
vpc_id = data.terraform_remote_state.vpc.outputs.vpc_id
public_subnet_ids = data.terraform_remote_state.vpc.outputs.public_subnet_ids
}

ソースコードは一部になりますが、このような形で、terraformのコードを生成できました。まだ簡単に作れるといったレベルではないですが、ある程度形にはなりました。

作成したアーキテクチャー図

次に、作成したアーキテクチャー図を見てみましょう。

アーキテクチャー図は以下のようになりました。

これは、diagramsと呼ばれるツールを使って、作成したものです。このツールは、pythonでコードを書くことで、アーキテクチャー図を作成できます。今回は、terraformのコードを生成する際に、アーキテクチャー図も生成できるようにしたかったので、このツールを使って作成しました。

また、difyフローの2.で知識取得機能を使って、diagramsのことを知識として与え、3.で、1.の指示に加え、アーキテクチャー図の生成も出力指示をするようにしました。 これにより、diagramsの知識をベースとして、アーキテクチャー図を生成することができました。

以下、出力したdiagramsのコードです。

from diagrams import Diagram, Cluster
from diagrams.aws.network import VPC, PublicSubnet, InternetGateway, ALB
from diagrams.aws.compute import EC2Instance

with Diagram("VPC Architecture", show=False):
with Cluster("VPC (10.0.0.0/16)"):
igw = InternetGateway("Internet Gateway")

with Cluster("Public Subnets"):
subnet1 = PublicSubnet("10.0.1.0/24")
subnet2 = PublicSubnet("10.0.2.0/24")

alb = ALB("Application Load Balancer")
igw >> alb
alb >> subnet1
alb >> subnet2

このあたりは、一文字変えると全く違った結果になったり、知識取得しているにも関わらず、diagramsにないコードを生成したりと、まだまだ課題が多いと感じました。

まとめ

Difyを使ってTerraformのローコード化を試してみた結果、ある程度想定通りできましたが、まだまだ課題が多いと感じました。 1つは私自身のDifyの使い方に対する慣れが必要だと感じました。結果が安定しなかったり、指示に対して、適切なコードが生成されなかったりと、まだまだ課題があります。

また、可能性として、もう少し細分化して、指示することで部分的に最適化するとか、ヒント的な使い方が良いのか?なども検討していきたいと思います。ワークフローとしても今回かなりシンプルであったため、Difyの良さは活かし切れていないので、今後も検証を続けて効率化へと繋げられればと思っています。