APC 技術ブログ

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

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

GitHub Copilot ChatでAzureのインフラを爆速実装しよう

はじめに

弊部のEMから、以下のGitHub Copilot ChatでTerraformコードを書いてもらう動画を、
シェアしてもらいまして、「すげーーーーー!」となりました。
どうも語彙力不足な感想しか吐けない、ACS事業部の谷合です。

Accelerate creating IaC with Terraform and GitHub Copilot Chat

www.youtube.com

実は私GitHub Copilotのハンズオンセミナーの講師とかやっちゃう人間なのですが、
以前、セミナーのハンズオンでTerraformコードを書く演習を用意したことがありました。
その際、純粋なGitHub Copilotでは意図したTerraformコードを出力してくれなかったんですよね。

言語のプログラムと異なり、インフラをコードで表現するIaCは、GitHub Copilotさん苦手?と思っていた際、
GitHub社のエンジニアの方とお話する機会に聞いてみたら、どうやらIaCの場合は、組み合わせの多さや、
設定の複雑さなどからGitHub Copilotでは表現がしづらく、細かく要件を伝えることができるGitHub Copilot Chatの方が
向いているのでは?と見解をいただいていました。

そこからは「へーー、やっぱそうなのかーー」で終わっていたのですが、先の動画を共有いただいた際に、
「やっぱりかーーー!すげーーーー」と語彙を失ったのです。

ということで、動画に倣って、今回はGitHub Copilot ChatでTerraformコードを爆速で書いてみます。

早速書いてもらうyo!

以下の流れで書いてもらいます。

  1. variables.tfで変数定義
  2. variables.tfを参照の上、main.tfを定義
  3. 細かな要求を伝えていく

なお、今回はGitHub Copilot ChatにTerraformコードを書いてもらうことを目的としており、生成されたコードの
デバッグや実行はターゲットにしていません。

それではGitHub Copilot Chatとお話していきましょう。

<要望>
Azure Kubernetes Service (AKS) を構築するための基本的な Terraform コードを提供したいです。 
まずは、variables.tfの内容を書いてください。

<提示コード>
以下に、Azure Kubernetes Service (AKS) を構築するための基本的な variables.tf の内容を示します。
このファイルでは、Terraform の変数を定義します。

variable "resource_group_name" {
  description = "The name of the resource group in which to create the AKS cluster"
}

variable "location" {
  description = "The location/region in which to create the AKS cluster"
}

variable "cluster_name" {
  description = "The name of the AKS cluster"
}

variable "dns_prefix" {
  description = "DNS prefix specified when creating the managed cluster"
}

variable "kubernetes_version" {
  description = "Version of Kubernetes specified when creating the AKS managed cluster"
}

variable "node_pool_name" {
  description = "The name of the default node pool"
}

variable "node_count" {
  description = "The number of nodes in the default node pool"
}

variable "vm_size" {
  description = "The size of the Virtual Machine"
}

これらの変数は、Terraform の terraform apply コマンドを実行する際に設定することができます。

youtu.be

いいですね!
一通りほしい変数はありそうです!

次は、main.tfを作成してもらいましょう。

<要望>
次はvariables.tfを元にしたmain.tfを書いてください。

<提示コード>
以下に、variables.tf を元にした main.tf の内容を示します。このファイルでは、Azure Kubernetes Service (AKS) のリソースを作成します。

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "example" {
  name     = var.resource_group_name
  location = var.location
}

resource "azurerm_kubernetes_cluster" "example" {
  name                = var.cluster_name
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  dns_prefix          = var.dns_prefix

  default_node_pool {
    name       = var.node_pool_name
    node_count = var.node_count
    vm_size    = var.vm_size
  }

  identity {
    type = "SystemAssigned"
  }

  tags = {
    Environment = "Production"
  }
}

output "client_certificate" {
  description = "Kube config file to connect to the cluster"
  value       = azurerm_kubernetes_cluster.example.kube_config.0.client_certificate
}

output "kube_config" {
  description = "Kube config file to connect to the cluster"
  value       = azurerm_kubernetes_cluster.example.kube_config_raw
}

このコードは、AKS クラスタを作成し、そのクラスタへの接続に必要な情報を出力します。

youtu.be

おお、ちゃんとvariables.tfもContextとして、読み込んでるみたいですね。
ただ、kubernetes_version変数が使われていないようです。
修正してもらいましょう。

<要望>
main.tfでは、variables.tfの変数kubernetes_versionが使われていないようです。
変数kubernetes_versionを使ったコードに変更してください。

<提示コード>
ご指摘の通り、kubernetes_version 変数が使用されていませんでした。この変数を azurerm_kubernetes_cluster リソースの
kubernetes_version パラメータに適用するように main.tf を修正します。

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "example" {
  name     = var.resource_group_name
  location = var.location
}

resource "azurerm_kubernetes_cluster" "example" {
  name                = var.cluster_name
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  dns_prefix          = var.dns_prefix
  kubernetes_version  = var.kubernetes_version

  default_node_pool {
    name       = var.node_pool_name
    node_count = var.node_count
    vm_size    = var.vm_size
  }

  identity {
    type = "SystemAssigned"
  }

  tags = {
    Environment = "Production"
  }
}

output "client_certificate" {
  description = "Kube config file to connect to the cluster"
  value       = azurerm_kubernetes_cluster.example.kube_config.0.client_certificate
}

output "kube_config" {
  description = "Kube config file to connect to the cluster"
  value       = azurerm_kubernetes_cluster.example.kube_config_raw
}

この修正により、azurerm_kubernetes_cluster リソースが作成する AKS クラスタの Kubernetes のバージョンを、
variables.tf で定義した kubernetes_version 変数の値に設定します。

youtu.be

AKSはこれで作成できそうです。
次はACRと統合させてみましょう。

<要望>
このterraformコードで、AKSとACRを統合したいです。AKSのマネージドIDにはACRへのPullを許可してください。
 
<提示コード>
Azure Container Registry (ACR) と Azure Kubernetes Service (AKS) を統合するためには、ACR リソースを作成し、
AKS のマネージド ID に対して ACR への pull 権限を付与する必要があります。
以下に、そのための Terraform コードを示します。

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "example" {
  name     = var.resource_group_name
  location = var.location
}

resource "azurerm_container_registry" "example" {
  name                     = "acr${var.resource_group_name}"
  resource_group_name      = azurerm_resource_group.example.name
  location                 = azurerm_resource_group.example.location
  sku                      = "Basic"
  admin_enabled            = false
}

resource "azurerm_kubernetes_cluster" "example" {
  name                = var.cluster_name
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  dns_prefix          = var.dns_prefix
  kubernetes_version  = var.kubernetes_version

  default_node_pool {
    name       = var.node_pool_name
    node_count = var.node_count
    vm_size    = var.vm_size
  }

  identity {
    type = "SystemAssigned"
  }

  tags = {
    Environment = "Production"
  }
}

resource "azurerm_role_assignment" "example" {
  scope                = azurerm_container_registry.example.id
  role_definition_name = "AcrPull"
  principal_id         = azurerm_kubernetes_cluster.example.kubelet_identity[0].object_id
}

output "client_certificate" {
  description = "Kube config file to connect to the cluster"
  value       = azurerm_kubernetes_cluster.example.kube_config.0.client_certificate
}

output "kube_config" {
  description = "Kube config file to connect to the cluster"
  value       = azurerm_kubernetes_cluster.example.kube_config_raw
}

このコードは、ACR リソースを作成し、AKS のマネージド ID に対して ACR への pull 権限を付与します。
これにより、AKS クラスタは ACR からコンテナイメージを pull することができます。

youtu.be

できたーーー!

GitHub Copilot Chatは対話的にIaCするにはピッタリですね!
ただ、あくまでもCoilot(副操縦士)なので、100点のコードを求めてはいけません。
ご使用の際には、GitHub Copilot Chatでコードの骨を書いてもらって、人間が100点を目指すのがいいかと思います!

さいごに

今回はGitHub Copilot ChatでIaCしてみました。
今後はGitHub Copilot Chatでハンズオンセミナーできたらいいな!
開催するときは告知するので、GitHub Copilot Chatに興味持っていただけたらご参加ください!!

告知

イベントの宣伝です。
1月31日にAzureのインフラをTerraformで実装するWebinerを開催します!

www.ap-com.co.jp

このような方におすすめのウェビナーですので、是非奮ってご参加ください!

  • 設計書の更新および管理から解放されたい方
  • インフラストラクチャーの作成/破棄がよく発生する方
  • インフラストラクチャーの作成におけるオペミスをなくしたい方
  • バージョン管理システムでインフラストラクチャーを管理したい方
  • これからクラウド利用を検討している方

ACS事業部のご紹介

私達ACS事業部はAzure・AKSなどのクラウドネイティブ技術を活用した内製化やGitHub Enterpriseの導入のご支援をしております。
www.ap-com.co.jp www.ap-com.co.jp また、一緒に働いていただける仲間も募集中です!
我々の事業部のCultureDeckはコチラ。

www.ap-com.co.jp 今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。 www.ap-com.co.jp

本記事の投稿者: 谷合純也
AKS/ACA、GitHubをメインにインフラ系のご支援を担当しています。
junya0530さんの記事一覧 | Zenn