🐈

【GitHub Actions × Terraform】Azureリソースを自動デプロイする手順まとめ

に公開

執筆日:2025/5/13

はじめに

普段は Azure DevOps を利用しているエンジニアですが、最近業務で GitHub を使う機会が増えてきました。その中で、Terraform を GitHub Actions 経由で Azure にデプロイしてみたので、手順をまとめました。


✅ 全体の流れ

  1. サービスプリンシパルの作成
  2. Terraform ステート管理用の Azure Storage 構築
  3. Terraform コードの準備
  4. GitHub Secrets の設定
  5. GitHub Actions によるデプロイ実行

① サービスプリンシパルの作成

1. Azure にログイン(PowerShell)

az login -t "<テナントID>"

2. サービスプリンシパルを作成

$env:SP_TF_NAME = "sp4terraform"
az ad sp create-for-rbac `
  --name $env:SP_TF_NAME `
  --skip-assignment `
  --years 2

以下のような JSON が出力されるので、後ほど使用するため控えておきましょう。

{
  "appId": "ARM_CLIENT_ID",
  "displayName": "sp4terraform",
  "password": "ARM_CLIENT_SECRET",
  "tenant": "ARM_TENANT_ID"
}

3. サービスプリンシパルに権限を付与

$APP_ID = (az ad sp list `
  --display-name $env:SP_TF_NAME `
  --query '[].appId' `
  --output tsv).Trim()

$SUBS_ID = (az account show `
  --query 'id' `
  --output tsv).Trim()

az role assignment create `
  --assignee $APP_ID `
  --scope "/subscriptions/$SUBS_ID" `
  --role Contributor

② Terraform ステート保存用の Azure Storage を作成

1. 環境変数の定義

$env:RG_TF_NAME         = "リソースグループ名"
$env:STORAGE_TF_ACCOUNT = "ストレージアカウント名"
$env:STORAGE_TF_CONTAINER = "コンテナー名"

2. リソースグループ作成

az group create `
  --name     $env:RG_TF_NAME `
  --location japaneast

3. ストレージアカウント作成

az storage account create `
  --name                     $env:STORAGE_TF_ACCOUNT `
  --resource-group           $env:RG_TF_NAME `
  --location                 japaneast `
  --sku                      Standard_LRS `
  --enable-hierarchical-namespace true

4. コンテナ作成

az storage container create `
  --name         $env:STORAGE_TF_CONTAINER `
  --account-name $env:STORAGE_TF_ACCOUNT

③ Terraform コードの準備

📁 フォルダ構成

.
├── .github/
│   └── workflows/
│       └── terraform.yml
├── backend.tf
├── main.tf

main.tf

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 3.0"
    }
  }
}

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "example" {
  name     = "リソースグループ名"
  location = "Japan East"
}

resource "azurerm_storage_account" "example" {
  name                     = "ストレージアカウント名" 
  resource_group_name      = azurerm_resource_group.example.name
  location                 = azurerm_resource_group.example.location
  account_tier             = "Standard"
  account_replication_type = "LRS"
}

resource "azurerm_storage_container" "example" {
  name                  = "コンテナー名"
  storage_account_name  = azurerm_storage_account.example.name
  container_access_type = "private"
}

backend.tf

terraform {
  backend "azurerm" {
    resource_group_name   = "リソースグループ名"
    storage_account_name  = "ストレージアカウント名"
    container_name        = "コンテナー名"
    key                   = "terraform.tfstate"
  }
}

.github/workflows/terraform.yml

name: 'Terraform on Azure'

on:
  push:
    branches:
      - main

jobs:
  terraform:
    name: 'Terraform'
    env:
      ARM_CLIENT_ID: ${{ secrets.ARM_CLIENT_ID }}
      ARM_CLIENT_SECRET: ${{ secrets.ARM_CLIENT_SECRET }}
      ARM_SUBSCRIPTION_ID: ${{ secrets.ARM_SUBSCRIPTION_ID }}
      ARM_TENANT_ID: ${{ secrets.ARM_TENANT_ID }}
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v3

    - name: Setup Terraform
      uses: hashicorp/setup-terraform@v3
      with:
        terraform_version: 1.5.7

    - name: Terraform Init
      run: terraform init

    - name: Terraform Plan
      run: terraform plan

    - name: Terraform Apply
      run: terraform apply -auto-approve

④ GitHub Secrets を設定

  1. リポジトリの Settings > Secrets and variables > Actions に移動
  2. New repository secret をクリック
  3. 以下を登録:
シークレット名 値の内容
ARM_CLIENT_ID appId(クライアントID)
ARM_CLIENT_SECRET password(シークレット)
ARM_SUBSCRIPTION_ID AzureのサブスクリプションID
ARM_TENANT_ID tenant ID


⑤ GitHub Actions の実行確認

main ブランチにマージまたは push すると、GitHub Actions がトリガーされ、Terraform による Azure デプロイが実行されます。



おわりに

GitHub Actions と Terraform を組み合わせることで、Azure 環境へのデプロイもスムーズに自動化できます。
特にチームで IaC を実践する際には、GitHub ベースのワークフロー構築にも慣れておくと便利です。

ヘッドウォータース

Discussion