GitHub Actions から Terraform で Azure の ResourceGroup を更新（変更）してみました

## 概要

GitHub Actions を利用した Terraform による Azureリソースの作成の流れを簡単に [この記事](https://qiita.com/turupon/items/0068fe23930116e329a5) にまとめています。が、tfstateファイルをリモートストレージに格納していなかったので、作成したリソースの更新（変更）ができていません。なので、今回は問題なくできるようにしてみました。

### 実行環境

macOS Monterey 12.3.1 
python 3.8.12
Azure CLI 2.34.1

### 事前準備

- [この記事](https://qiita.com/turupon/items/0068fe23930116e329a5)のリポジトリと Github Actions の環境が準備されていること
- [この記事](https://qiita.com/turupon/items/5d024d43a60cd101be94) にあるように Terraform の tfstate ファイル保存用のストレージアカウント・コンテナが準備されており、かつ、そのストレージアカウントの認証情報を入手できていること
  - ストレージアカウント情報
    - リソースグループ名 : rg-ituru-tfstate
    - アカウント名 : iturutfstate
    - コンテナ名 : tfstate
  - 認証情報
    - ARM_ACCESS_KEY

---

## GitHub での追加の仕込み

### GitHub へのシークレッの追加登録

- 対象のリポジトリの「Settings」-「Secrets」-「Actions」にて、事前準備で取得しているストレージアカウントの認証情報を登録します（「New repository secret」ボタンを押して順次登録）
![スクリーンショット 2022-09-12 10.00.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/8c07a324-c540-436c-5132-ed934bbea9ab.png)


---

## 必要なコード

[この記事](https://qiita.com/turupon/items/0068fe23930116e329a5) からの変更ファイルのみ記載しています。

### Terraformコード

編集が必要なファイルは１つだけです。

```main.tf
# プロバイダーの定義
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 というファイルを編集します。

```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 へ）

```variables.tf
# タグ情報
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 を作成する](https://zenn.dev/08thse/articles/64-create-aks-by-terraform)
[GitHub ActionsでTerraformを実行する](https://qiita.com/keitakn/items/db2e9c68019594885ac4)
[azurerm](https://www.terraform.io/language/settings/backends/azurerm)