Terraform Cloud で AKS を作成する

# はじめに

Qiita の Azure Advent Calendar 2021 の 2 日目として投稿させていただきます！

https://qiita.com/advent-calendar/2021/azure

Software Design 8月号の『DevOps エンジニアのための節約簡単時短レシピ』にて、Terraform Cloud で AWS 環境を構築する手順が解説されていました。

Terraform Cloud も触ってみたいなと思っていたので、AWS ではなく Azure、自分の好きな AKS (Azure Kubernetes Service) を作成する手順を実施してみましたので、公開しておこうと思います。

# GitHub リポジトリの作成

まず、GitHub にて Terraform のコードを保存するリポジトリを作成します。

Terraform Cloud からアクセスできれば良いため、今回はプライベートリポジトリで作成しました。

# Azure 側サービスプリンシパルの作成

Terraform Cloud から Azure リソースを操作する際に利用するサービスプリンシパルを作成しておきます。

```
az ad sp create-for-rbac -n '<SERVICE PRINCIPAL NAME>' --role Owner
```

上記を実行すると、下記の JSON が出力されますので控えておきます。

```
{
  "appId": "<A NEW GUID>",
  "displayName": <SERVICE PRINCIPAL NAME>,
  "name": "<SERVICE PRINCIPAL NAME>",
  "password": "<SECRET STRING>",
  "tenant": "<TENANT ID>"
}
```

# Terraform Cloud の準備

Terraform Cloud の環境を作成します。とりあえず登録して組織名を決めれば OK です。

## Workspace の作成

https://www.terraform.io/docs/cloud/workspaces/creating.html

Choose Type にて `Version control workflow` を選択し、Connect VCS では `GitHub` を選択して、先ほど作成したリポジトリとの連携を作成します。


## Azure 認証情報の登録

作成後の画面にて `Variables` タブから Azure への認証情報を登録していきます。

先ほどの手順で控えた文字列を利用し、Key と Value を `Environment variable` として登録します。最低でも `ARM_CLIENT_SECRET` は `Sensitive` にチェックを入れておきましょう。

| Key | Value |
| --- | --- |
| ARM_CLIENT_ID | \<appId\> |
| ARM_CLIENT_SECRET | \<password\> |
| ARM_TENANT_ID | \<tenant\> |
| ARM_SUBSCRIPTION_ID | \<Subscription ID\> |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218221/e76d4c37-6066-656d-9aa7-bbdc18dafb50.png)

https://blog.xmi.fr/posts/terraform-cloud/

## backend.tf の作成

GitHub リポジトリのフォルダにて、バックエンドにて Terraform Cloud を設定するよう backend.tf を作成します。

```terraform:backend.tf
terraform {
  backend "remote" {
    organization = "<TERRAFORM CLOUD ORGANIZATION NAME>"

    workspaces {
      name = "<TERRAFORM CLOUD WORKSPACE NAME>"
    }
  }
}
```

# リソースグループの作成

動作確認も兼ねて、リソースグループを Terraform Cloud から作成してみます。

## provider.tf の作成

Terraform のプロバイダーを指定するため、provider.tf を作成します。

```terraform:provider.tf
terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = ">= 2.0"
    }
    azuread = {
      source  = "hashicorp/azuread"
      version = ">= 2.0"
    }
  }
}

provider "azurerm" {
  features {}
}
```

## az-rg.tf の作成

リソースグループを作成する tf ファイルを作成します。

```terraform:provider.tf
resource "azurerm_resource_group" "rg" {
  name     = "rg-terracloudtest"
  location = "japaneast"
}
```

ここまでできたら、GitHub に push しておきます。

## デプロイしてみる

Terraform Cloud 上で「Start new plan」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218221/dd1bca32-d4cd-134f-a657-263724343c91.png)
Plan チェックは OK っぽいですね。問題なさそうなら「Confirm & Apply」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218221/1592e72e-f76f-f194-aa6b-05b29692741e.png)
実行が完了しました。

Azure portal 上で確認してみると…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218221/febdcf42-418d-351c-62aa-fe61f2dc96d6.png)
ちゃんと作成されていました🤗

# AKS の作成

いよいよ、AKS を作成してみます。AKS を作成する際のドキュメントは、下記のあたりを参考にします。

https://docs.microsoft.com/ja-jp/azure/developer/terraform/create-k8s-cluster-with-tf-and-aks

https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/kubernetes_cluster

## tf ファイルの作成

簡単なものですが、作成した tf ファイルは下記のようになりました。

```terraform:provider.tf
resource "azurerm_kubernetes_cluster" "example" {
  name                = "ndsou-terracloud-aks1"
  location            = "japaneast"
  resource_group_name = rg.name
  dns_prefix          = "ndsou-terracloud-aks1"

  default_node_pool {
    name       = "default"
    node_count = 1
    vm_size    = "Standard_D2_v2"
  }

  identity {
    type = "SystemAssigned"
  }
}

output "client_certificate" {
  value = azurerm_kubernetes_cluster.example.kube_config.0.client_certificate
}

output "kube_config" {
  value = azurerm_kubernetes_cluster.example.kube_config_raw

  sensitive = true
}
```

GitHub リポジトリに push します。

## デプロイ！

push すると、自動で Plan が開始されます。もし開始されていなければ、手動で開始しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218221/84314f4f-3908-b926-029a-1c9df0343dc4.png)
Plan チェックは OK っぽいですね。問題なさそうなら「Confirm & Apply」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218221/3b979d66-84c6-cf00-a222-00ace3e38729.png)
さすがに AKS クラスターを作成するので時間がかかりますが、しばらく経つと実行が完了しました。

Azure portal 上で確認してみると…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218221/807ff03a-97fd-5dc6-5fc9-b8a41a90d93d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218221/e2cce351-43e1-ab27-ff9f-24eda19dfd93.png)
ちゃんと作成されていました🤗

# おわりに

Azure 的な IaC は ARM Template とか Bicep とか色々と触っていますが、Terraform 良いですね。

Bicep も書きやすくて良いのですが、何より AWS なども使うマルチクラウドな場面でも統一的に利用できるのは嬉しいところです。Terraform 連携の Microsoft Docs も出てきていますし、エコシステム的にも連携は維持されていそうです。

基本 Azure しか使わないなら Bicep、他クラウドも色々使うなら Terraform、とかですかね。今のところ。