🎼

GitHub Actions から Terraform で AKS を作成する

2022/02/04に公開

最近、ちょこちょこ 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 の三つを作成しました。

versions.tf
terraform {
  required_version = ">=v1.1.4"
  required_providers {
    azurerm = {
      version = "~>2.36.0"
      source  = "hashicorp/azurerm"
    }
  }
}

provider "azurerm" {
  features {}
}
variables.tf
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"
}
main.tf
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 のコードを書いていきます。

terraform.yml
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