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