🐈
【GitHub Actions × Terraform】Azureリソースを自動デプロイする手順まとめ
執筆日:2025/5/13
はじめに
普段は Azure DevOps を利用しているエンジニアですが、最近業務で GitHub を使う機会が増えてきました。その中で、Terraform を GitHub Actions 経由で Azure にデプロイしてみたので、手順をまとめました。
✅ 全体の流れ
- サービスプリンシパルの作成
- Terraform ステート管理用の Azure Storage 構築
- Terraform コードの準備
- GitHub Secrets の設定
- 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 を設定
- リポジトリの
Settings > Secrets and variables > Actions
に移動 -
New repository secret
をクリック
- 以下を登録:
シークレット名 | 値の内容 |
---|---|
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