概要
インフラも IaC(コード)化して CIやりましょ! ってことで、GitHub Actions を利用して Azure 上に ResourceGroup を作成してみました(かなりものたりませんが、、、)。なお、Terraform は Hashicorp/setup-terraform を利用しています。
実行環境
macOS Monterey 12.3.1
python 3.8.12
Azure CLI 2.34.1
事前準備
-
この記事 にあるように Terraform用のサービスプリンシパルが準備されており、以下のシークレット情報を入手できていること
- ARM_TENANT_ID
- ARM_SUBSCRIPTION_ID
- ARM_CLIENT_ID
- ARM_CLIENT_SECRET
GitHub での仕込み
GitHub の Personal Access Token の作成
- GitHub Actions の workflow を実行する権限を有するアクセストークンを発行します(git clone/push時に必要)
- サインインアカウントの「Settings」-「Developer settings」-「Personal access token」から「Generate new token」ボタンを押す
- 「Select scopes」で、「workflow」を選択する(生成されたトークンのScopeは「repo」と「workflow」になる)
GitHub リポジトリの作成
- GitHub にて Terraformのコードを管理するリポジトリ(プライベートリポジトリで可)を作成し、ローカルで git clone します
GitHub へのシークレット登録
- 上記で作成したリポジトリの「Settings」-「Secrets」-「Actions」にて、事前準備で入手している情報を使って下記のようにシークレット情報を登録します(「New repository secret」ボタンを押して順次登録)
必要なコード
Terraformコード
今回は以下の3つのコードで構成されています(リソースグループを作成するだけなので、、、)
# プロバイダーの定義
terraform {
required_providers {
azurerm = "~> 2.33"
}
}
provider "azurerm" {
features {}
}
# リソースグループ
resource "azurerm_resource_group" "this" {
name = var.resource_group_name
location = var.region
tags = var.tags_def
}
# タグ情報
variable "tags_def" {
default = {
owner = "ituru"
period = "2022-09-11"
CostCenter = "PSG2"
Environment = "Gitlab"
}
}
# 各種パラメータ
variable "region" {} // 利用リージョン
variable "resource_group_name" {} // リソースグループ名
# パラメータ値の定義
region = "japaneast" // 利用リージョン
resource_group_name = "rg_ituru_github" // リソースグループ名
GitHub Actions の yaml ファイルの作成
リポジトリの .github/workflows 配下に terraform.yml というファイルを作成します。ここに、GitHub Actions のコードを記載していきます。記載方法は Hashicorp/setup-terraform を参照ください。
name: 'Terraform'
on:
push:
branches:
- main
pull_request:
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
defaults:
run:
shell: bash
steps:
- name: Checkout
uses: actions/checkout@v2
- name: setup Terraform
uses: hashicorp/setup-terraform@v1
with:
terraform_version: 1.0.11
- 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
git push してみる
これで、準備完了です。git push することにより、Terraform による Azure への ResourceGroup の作成がおこなわれます。
push
git add .
git commit -m "Actions commit"
git push -u origin main
Actions
GitHub Actions のジョブを確認します。順次処理が実施され、エラーもなく正常に終了しています。
ローカル環境からの確認
$ az group show --name rg_ituru_github [main]
{
"id": "/subscriptions/xxxxxxxx-1717-4343-9797-zzzzzzzzzzzz/resourceGroups/rg_ituru_github",
"location": "japaneast",
"managedBy": null,
"name": "rg_ituru_github",
"properties": {
"provisioningState": "Succeeded"
},
"tags": {
"CostCenter": "PSG2",
"Environment": "GitLab",
"owner": "ituru",
"period": "2022-09-11"
},
"type": "Microsoft.Resources/resourceGroups"
}
無事にリソースが作成されています!
Terraformファイルの編集による Azureリソース変更 のための Actions の実行
編集後の git push
上記までで、今回の記事目的は達成です。が、Terraformファイルの編集からの GitHub Actions による Azure ResurceGreoup のタグ情報の変更を試みました。
- variables.tf ファイルの「period」の値を「2022-09-12」に変更します
- git push します
- Github Actions のジョブが実行されます
Actions
GitHub Actions のジョブが途中で止まってしまいます。リソースの更新(変更)ではなく、新規作成を試みた結果となります。
原因は tfstate ファイルをきちんと保持していないためです。このファイルもきちんとリモートストレージ等に格納して実行する必要があるようです。
まとめ
GitHub Actions を利用した Terraform による Azureリソース作成 の流れを簡単に理解することができました。次回は tfstateファイルをリモートストレージに格納して、問題なくリソース更新(変更)ができることを確認したいと思います。
参考記事
以下の記事を参考にさせていただきました。感謝申し上げます
GitHub Actions から Terraform で AKS を作成する
GitHub ActionsでTerraformを実行する
github actions(w/z composite) + setup-terraform