GitHub Actions から Terraform で Azure の ResourceGroup を作成してみました

## 概要

インフラも IaC（コード）化して CIやりましょ！　ってことで、GitHub Actions を利用して Azure 上に ResourceGroup を作成してみました（かなりものたりませんが、、、）。なお、Terraform は [Hashicorp/setup-terraform](https://github.com/hashicorp/setup-terraform) を利用しています。

### 実行環境

macOS Monterey 12.3.1 
python 3.8.12
Azure CLI 2.34.1

### 事前準備

- [この記事](https://qiita.com/turupon/items/5d024d43a60cd101be94) にあるように 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」ボタンを押して順次登録）
![スクリーンショット 2022-09-08 13.56.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/fcc8932e-3a0c-a970-b0ca-90ec4b9b09ae.png)


---

## 必要なコード

### Terraformコード

今回は以下の３つのコードで構成されています（リソースグループを作成するだけなので、、、）

```main.tf
# プロバイダーの定義
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
}
```

```variables.tf
# タグ情報
variable "tags_def" {
  default = {
    owner       = "ituru"
    period      = "2022-09-11"
    CostCenter  = "PSG2"
    Environment = "Gitlab"
  }
}

# 各種パラメータ
variable "region" {}              // 利用リージョン
variable "resource_group_name" {} // リソースグループ名
```

```terraform.tfvar
# パラメータ値の定義
region              = "japaneast"       // 利用リージョン
resource_group_name = "rg_ituru_github" // リソースグループ名
```

### GitHub Actions の yaml ファイルの作成

リポジトリの .github/workflows 配下に terraform.yml というファイルを作成します。ここに、GitHub Actions のコードを記載していきます。記載方法は [Hashicorp/setup-terraform](https://github.com/hashicorp/setup-terraform) を参照ください。

```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 }}
    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 のジョブを確認します。順次処理が実施され、エラーもなく正常に終了しています。
![スクリーンショット 2022-09-08 21.31.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/20482d5d-e67f-62d5-48da-bcb80186e50a.png)


### ローカル環境からの確認

```
$ 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 のタグ情報の変更を試みました。

1. variables.tf ファイルの「period」の値を「2022-09-12」に変更します
2. git push します
3. Github Actions のジョブが実行されます

### Actions

GitHub Actions のジョブが途中で止まってしまいます。リソースの更新（変更）ではなく、新規作成を試みた結果となります。
![スクリーンショット 2022-09-08 21.50.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/21387a19-c306-dc02-dcb5-1efc72dca095.png)
![スクリーンショット 2022-09-08 21.51.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/a2218a5e-48ac-a87e-f8ff-c7d6d78c1701.png)


原因は tfstate ファイルをきちんと保持していないためです。このファイルもきちんとリモートストレージ等に格納して実行する必要があるようです。

---

### まとめ

GitHub Actions を利用した Terraform による Azureリソース作成 の流れを簡単に理解することができました。次回は tfstateファイルをリモートストレージに格納して、問題なくリソース更新（変更）ができることを確認したいと思います。

### 参考記事

以下の記事を参考にさせていただきました。感謝申し上げます
[GitHub Actions から Terraform で AKS を作成する](https://zenn.dev/08thse/articles/64-create-aks-by-terraform)
[GitHub ActionsでTerraformを実行する](https://qiita.com/keitakn/items/db2e9c68019594885ac4)
[github actions(w/z composite) + setup-terraform](https://qiita.com/raki/items/30124512f45d79ae02d8)