APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

GPT-4Vで構成図を元にAKSクラスタをデプロイするTerraformファイルを生成する

こんにちは!ACSD 松崎です。ChatGPT Plusに画像読み込み機能(GPT-4V)がリリースされてから数週間が経過しましたが、皆様もう試されましたでしょうか?今回はこちらの機能を使って、Azure Kubernetes Service(AKS)の構成図を元に、TerraformのIaCファイルを生成できるかどうかを試してみようと思います。

検証の概要

    1. 以下の構成図をChatGPT Plusにアップロードし、内容を正しく解釈できるか確認する
    1. 構成図に記述のシステムをデプロイするTerraformファイルを作成できるかどうかを試す

※画像の出展 : AKS のマイクロサービス アーキテクチャ - Azure Architecture Center | Microsoft Learn

検証(1) 構成図を読めるかの確認

ChatGPT Plusに実装された画像アップロード用のボタンから、前述のAKSの構成図をアップロードし、

添付された構成図を元に、このシステムのアーキテクチャを解説してください

と質問します。

すると、以下のように回答が返ってきます。 おおっすごい!ちゃんと画像からシステム構成を読み取れていそうです。

この構成図は、Azure Kubernetes Service (AKS) 上で動作するコンテナ化されたアプリケーションのアーキテクチャを示しています。以下は、この構成図の各コンポーネントとその役割についての説明です:
_
Azure Kubernetes Service (AKS): AKS は、Kubernetes クラスタを簡単にデプロイ、管理、スケールするためのマネージドサービスです。この構成図では、AKS が中心的な役割を果たしています。
Client apps: ユーザーが利用するアプリケーション。これは、Azure Load Balancer を経由してAKS上のFront-endサービスにアクセスします。
Azure Load Balancer: クライアントのリクエストを適切なノードやサービスに分散するためのロードバランサー。
Ingress: クラスタ内のサービスへの外部からのアクセスを管理するKubernetesリソース。ルーティングルールを持ち、トラフィックを適切なサービスに転送します。
(略) _
  全体的に、このアーキテクチャはAzureのマネージドサービスとKubernetesの統合を強調しており、効率的かつセキュアなアプリケーションのデプロイと運用を目指しています。

検証(2) Terraformファイルを生成できるかの確認

Terraformファイルを生成できるかの実験に進みます。以下のプロンプトを送信します。

以下のリソースを対象にサンプルとなるterraformファイルを生成してください。
# 対象リソース
・ VNet, subnet
・AKS
・Azure Load Balancer

すると、以下のファイルが生成されました。

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "example" {
  name     = "example-resources"
  location = "West Europe"
}

resource "azurerm_virtual_network" "example" {
  name                = "example-vnet"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  address_space       = ["10.0.0.0/16"]
}

resource "azurerm_subnet" "example" {
  name                 = "example-subnet"
  resource_group_name  = azurerm_resource_group.example.name
  virtual_network_name = azurerm_virtual_network.example.name
  address_prefixes     = ["10.0.1.0/24"]
}

resource "azurerm_kubernetes_cluster" "example" {
  name                = "example-aks"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  dns_prefix          = "exampleaks"

  default_node_pool {
    name       = "default"
    node_count = 1
    vm_size    = "Standard_D2_v2"
    vnet_subnet_id = azurerm_subnet.example.id
  }

  identity {
    type = "SystemAssigned"
  }
}

resource "azurerm_lb" "example" {
  name                = "example-lb"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name

  frontend_ip_configuration {
    name                 = "example-frontend"
    subnet_id            = azurerm_subnet.example.id
  }
}

パッと見は良さそうですが、 terraform apply して動作確認をしたところ、エラーがでました。通常の作業時は、Google検索で該当となるエラーを調査しますが、ここでは、ChatGPT Plusの問題解決能力を見たいので、トラブルシュートもお願いしてみます。

applyしたところ以下のエラーが出ました。想定される原因を説明してください。
Error: creating Cluster: (Managed Cluster Name "example-aks" / Resource Group "example-resources"): containerservice.ManagedClustersClient#CreateOrUpdate: Failure sending request: StatusCode=400 -- Original Error: Code="ServiceCidrOverlapExistingSubnetsCidr" Message="The specified service CIDR 10.0.0.0/16 is conflicted with an existing subnet CIDR 10.0.1.0/24" Target="networkProfile.serviceCIDR"
_
with azurerm_kubernetes_cluster.example,
on main.tf line 20, in resource "azurerm_kubernetes_cluster" "example":
20: resource "azurerm_kubernetes_cluster" "example" {

回答は以下の通りでした。

このメッセージは、AKS クラスタのサービス CIDR (10.0.0.0/16) が、既存のサブネットの CIDR (10.0.1.0/24) と重複していることを示しています。
_
AKS クラスタを作成する際には、Kubernetes のサービス用に CIDR ブロックが必要です。この CIDR ブロックは、Kubernetes の Service オブジェクトに IP アドレスを割り当てるためのものです。この CIDR は、他のネットワークリソースと重複してはいけません。
_
具体的には、サンプルの Terraform コードでは、VNet のアドレススペースを 10.0.0.0/16 として、その中にサブネット 10.0.1.0/24 を作成しています。この構成では、AKS のデフォルトのサービス CIDR が VNet のアドレススペースと重複してしまいます。
_
解決策としては、AKS のサービス CIDR を変更するか、VNet とサブネットの CIDR を変更することが考えられます。例えば、AKS のサービス CIDR を 10.1.0.0/16 のように VNet の範囲外に設定することで、この問題を回避できます。

回答の内容はErr MSGと大きく矛盾しないように見えたので、超際してもらった内容に基づきファイルを修正してもらいます。

ありがとうございます。上記の分析をもとにIaCコードを修正してください。

再度出力されたIaCコードを見ると、以下が追加されていました。

  network_profile {
    network_plugin     = "kubenet"
    service_cidr       = "10.1.0.0/16"
    dns_service_ip     = "10.1.0.10"
    docker_bridge_cidr = "172.17.0.1/16"
  }

こちらをTerraformファイルに追記し、無事、 terraform apply が走り切ることを確認しました!

終わりに

ChatGPT Plusで画像ファイルが読めるようになったことで、対応可能な作業の範囲がだいぶ広がった印象があります。まだまだ、人間の作業を完全に代替とはいきませんが今後の可能性を感じさせる内容で個人的に満足です。他にはどんなことができるのか、引き続きあれこれ試してみようと思います。

私達ACS事業部はAzure・AKSなどのクラウドネイティブ技術を活用した内製化のご支援をしております。ご相談等ありましたらぜひご連絡ください。

www.ap-com.co.jp

また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。

www.ap-com.co.jp

本記事の投稿者: Shin Matsuzaki
個人ブログ