GitHub Actions から Terraform で AKS を作成する
最近、ちょこちょこ Terraform を勉強しております。以前も Qiita Azure Advent Calendar で Terraform Cloud で作ってみた話を公開しましたが、あらためて GitHub Actions でもやってみました。
既存の記事も少し見つけましたが、GitHub Actions の「hashicorp/setup-terraform」を使っているバージョンは少なそうだったので、こちらを使ってみています。
GitHub リポジトリの作成
まず、GitHub にて Terraform のコードを保存するリポジトリを作成します。
GitHub Actions が使えれば良いため、今回はプライベートリポジトリで作成しました。
すぐ使うので、手元に clone しておきましょう。
Azure 側サービスプリンシパルの作成
GitHub Actions から Azure リソースを操作する際に利用するサービスプリンシパルを作成しておきます。
az ad sp create-for-rbac -n '<SERVICE PRINCIPAL NAME>' --role Owner
上記を実行すると、下記の JSON が出力されますので控えておきます。
{
  "appId": "<A NEW GUID>",
  "displayName": "<SERVICE PRINCIPAL NAME>",
  "name": "<SERVICE PRINCIPAL NAME (GUID)>",
  "password": "<SECRET STRING>",
  "tenant": "<TENANT ID>"
}
GitHub へのシークレットの登録
GitHub リポジトリの「Settings」⇒「Secrets」⇒「Actions」にて、上記で控えた文字列を使って各シークレットを登録していきます。
| Name | Value | 
|---|---|
| AZURE_AD_CLIENT_ID | appId | 
| AZURE_AD_CLIENT_SECRET | password | 
| AZURE_SUBSCRIPTION_ID | 別途サブスクリプションIDを取得して登録 | 
| AZURE_AD_TENANT_ID | tenant | 
Terraform コードの作成
今回は下記の感じで versions.tf, variables.tf, main.tf の三つを作成しました。
terraform {
  required_version = ">=v1.1.4"
  required_providers {
    azurerm = {
      version = "~>2.36.0"
      source  = "hashicorp/azurerm"
    }
  }
}
provider "azurerm" {
  features {}
}
variable "resource_group_name" {
  type    = string
  default = "ndsou-test-tfaks01"
}
variable "resource_location" {
  type    = string
  default = "japaneast"
}
variable "aks_cluster_name" {
  type    = string
  default = "ndsou-test-tfaks01-cl"
}
resource "azurerm_resource_group" "rg" {
  name     = var.resource_group_name
  location = var.resource_location
}
resource "azurerm_kubernetes_cluster" "aks" {
  name                = var.aks_cluster_name
  location            = var.resource_location
  resource_group_name = var.resource_group_name
  dns_prefix          = var.aks_cluster_name
  depends_on = [
    azurerm_resource_group.rg
  ]
  default_node_pool {
    name       = "default"
    node_count = 3
    vm_size    = "Standard_D2_v2"
  }
  identity {
    type = "SystemAssigned"
  }
}
output "client_certificate" {
  value = azurerm_kubernetes_cluster.aks.kube_config.0.client_certificate
}
output "kube_config" {
  value     = azurerm_kubernetes_cluster.aks.kube_config_raw
  sensitive = true
}
GitHub Actions の yaml ファイルの作成
リポジトリの .github/workflows 配下に terraform.yml というファイルを作成しました。ここに、GitHub Actions のコードを書いていきます。
name: 'Terraform'
 
on:
  push:
    branches:
    - main
  pull_request:
 
jobs:
  terraform:
    name: 'Terraform'
    env:
      ARM_CLIENT_ID: ${{ secrets.AZURE_AD_CLIENT_ID }}
      ARM_CLIENT_SECRET: ${{ secrets.AZURE_AD_CLIENT_SECRET }}
      ARM_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
      ARM_TENANT_ID: ${{ secrets.AZURE_AD_TENANT_ID }}
    runs-on: ubuntu-latest
 
    defaults:
      run:
        shell: bash
    steps:
    - name: Checkout
      uses: actions/checkout@v2
 
    - name: setup Terraform
      uses: hashicorp/setup-terraform@v1
      with:
        terraform_version: 1.1.4
    - name: 'Terraform Format'
      run: terraform fmt -diff -check
    - name: 'Terraform Init'
      run: terraform init
    - name: 'Terraform Plan'
      run: terraform plan -no-color -lock=false
    - name: Terraform Apply
      if: github.ref == 'refs/heads/main'
      run: terraform apply -auto-approve
コマンドの使い方などは、冒頭の hashicorp/setup-terraform のサイトなどを参照してください。
その他参考
push する
ここまできたら、リポジトリにプッシュして動作を確認しましょう。

こんな感じで、無事成功していれば OK です!
ひとこと
実は、上記画面のように成功するまでに Terraform Format で何度かスペース不足などの不備があってエラーが出たのですが、ここで VS Code が役に立ちました。
コードを選択して右クリックし「ドキュメントのフォーマット」をクリックすると、ほとんど良い感じに自動整形してくれました。ありがたや🤗
※前記の .tf ファイルは、既に修正済みのファイルになっていますです。
最後に
今回は tfstate をローカル保存のまま済ませちゃいましたが、そのあたりもきちんとリモートストレージに格納して実行したい方は、下記の公式ドキュメント等を参考にしてみてください。
結構マイクロソフト公式からも Terraform 観点でのドキュメントが出ているのは嬉しいですね!
Discussion