概要
GitHub Actions を利用した Terraform による Azureリソースの作成の流れを簡単に この記事 にまとめています。が、tfstateファイルをリモートストレージに格納していなかったので、作成したリソースの更新(変更)ができていません。なので、今回は問題なくできるようにしてみました。
実行環境
macOS Monterey 12.3.1
python 3.8.12
Azure CLI 2.34.1
事前準備
- この記事のリポジトリと Github Actions の環境が準備されていること
-
この記事 にあるように Terraform の tfstate ファイル保存用のストレージアカウント・コンテナが準備されており、かつ、そのストレージアカウントの認証情報を入手できていること
- ストレージアカウント情報
- リソースグループ名 : rg-ituru-tfstate
- アカウント名 : iturutfstate
- コンテナ名 : tfstate
- 認証情報
- ARM_ACCESS_KEY
- ストレージアカウント情報
GitHub での追加の仕込み
GitHub へのシークレッの追加登録
- 対象のリポジトリの「Settings」-「Secrets」-「Actions」にて、事前準備で取得しているストレージアカウントの認証情報を登録します(「New repository secret」ボタンを押して順次登録)
必要なコード
この記事 からの変更ファイルのみ記載しています。
Terraformコード
編集が必要なファイルは1つだけです。
# プロバイダーの定義
terraform {
required_providers {
azurerm = "~> 2.33"
}
}
# tfstate ファイルの保存先(ローカルに保存の場合、不要) <--- ここを追加
terraform {
backend "azurerm" {
resource_group_name = "rg-ituru-tfstate"
storage_account_name = "iturutfstate"
container_name = "tfstate"
key = "githubactions001/terraform.tfstate"
}
}
provider "azurerm" {
features {}
}
# リソースグループ
resource "azurerm_resource_group" "this" {
name = var.resource_group_name
location = var.region
tags = var.tags_def
}
GitHub Actions の yaml ファイルの追加更新
.github/workflows 配下にある terraform.yml というファイルを編集します。
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 }}
ARM_ACCESS_KEY: ${{ secrets.ARM_ACCESS_KEY }} # <--- ここを追加
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 -check -recursive
- 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
「Terraform Format」をコメントアウトしている理由は、Actions が走ったときに、以下のようなErrorが表示されるためです。このエラーを解決する方法をご存じの方がいらっしゃればご一報いただければ幸いです。
## Errorメッセージ
Error: Terraform exited with code 3.
Error: Process completed with exit code 1.
Azureリソースの新規作成
git push してみる (新規リソース作成)
git push することにより、Terraform による Azure への ResourceGroup の新規作成がおこなわれます。
git add .
git commit -m "Actions commit"
git push -u origin main
ローカル環境からの確認
Azure CLI を利用して、新規作成された ResourceGroup を確認します。
$ az group show --name rg_ituru_github
{
"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": "Github",
"owner": "ituru",
"period": "2022-09-12"
},
"type": "Microsoft.Resources/resourceGroups"
}
無事にリソースが作成されています!
Terraform tfstateファイルの確認
Azure CLI を利用して、ストレージアカウント・コンテナに作成された tfstateファイルを確認します。
## コンテナー内の BLOB を一覧表示する
$ az storage blob list --account-name iturutfstate --container-name tfstate -o table
Name Blob Type Blob Tier Length Content Type Last Modified Snapshot
---------------------------------- ----------- ----------- -------- ---------------- ------------------------- ----------
githubactions001 BlockBlob Hot 2022-09-12T14:34:57+00:00
githubactions001/terraform.tfstate BlockBlob Hot 1080 application/json 2022-09-12T14:37:50+00:00
Azureリソースの更新
タグ情報の編集
タグ情報を以下のように更新します(period を 2022-09-12 から 2022-09-30 へ)
# タグ情報
variable "tags_def" {
default = {
owner = "ituru"
period = "2022-09-25" # <--- ここを更新
CostCenter = "PSG2"
Environment = "Gitlab"
}
}
# 各種パラメータ
variable "region" {} // 利用リージョン
variable "resource_group_name" {} // リソースグループ名
git push してみる (リソースの更新)
git push することにより、Terraform による Azure への ResourceGroup へのタグ情報の更新が行われます。
git add .
git commit -m "Tags_period Modify"
git push -u origin main
ローカル環境からの確認
Azure CLI を利用して、更新された ResourceGroup を確認します。
$ az group show --name rg_ituru_github
{
"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": "Github",
"owner": "ituru",
"period": "2022-09-25" # <--- 更新され、日付が変わっています
},
"type": "Microsoft.Resources/resourceGroups"
}
無事にリソースが更新されています!
まとめ
GitHub Actions を利用した Terraform による Azureリソースの作成において、Terraform の tfstateファイルをリモートストレージに格納することにより、問題なくリソース更新(変更)ができることを確認できました。
次は、作ったリソースを削除する terraform destroy はどうすれば、、、ということで、リソースの削除方法を組み込んでみたいと思います。
おまけ
teffarom tfstate 用のストレージアカウントの認証情報の取得方法(Key1、Key2のいずれかを利用します)
$ az storage account keys list --account-name $STORAGE_TF_ACCOUNT --subscription $SUBS_NAME --resource-group $RG_TF_NAME --output table
CreationTime KeyName Permissions Value
-------------------------------- --------- ------------- ----------------------------------------------------------------------------------------
2021-12-04T16:11:49.888094+00:00 key1 FULL pppppppppppppppppppppppppppp....ppppp
2021-12-04T16:11:49.888094+00:00 key2 FULL qqqqqqqqqqqqqqqqqqqqqqqqqqqq....qqqqq
参考記事
以下の記事を参考にさせていただきました。感謝申し上げます
GitHub Actions から Terraform で AKS を作成する
GitHub ActionsでTerraformを実行する
azurerm