Terraformを本気で使う。Azureで【準備編】

2024/10/05に公開

はじめに

Microsoft AzureのインフラをARM Template、Bicep、Azure CLIなどを使って構築することは良くやっていましたが、実はTerraformはそれほど使ってきていませんでした。

Bicepはとても便利で使いやすいと自分は思っているのですが、対象となるクラウドサービスはMicrosoft Azure限定(ARM Template, Azure CLIも同様)であるため、どうせだったらちゃんと使えるようになっておこうという意思表示として、本エントリを投稿します。

以下の記事も本記事の後にお読みください。

https://zenn.dev/yotan/articles/f67037e76526e3

Microsoftが推しているIaCツール

実際MicrosoftもBicep、ARM TemplateだけではなくTerraformも同じくらい力を入れているようです。

こちらはAzure Virtual NetworkをIaCで作成するためのドキュメントですが、デプロイ言語の選択にはしっかりとTerraformが載っています(載っていない機能のページも過去に見たことはあるけど)。

Microsoft.Network virtualNetworks

Terraformから呼ばれるAzureモジュール(azurerm)もMicrosoftのAzureチームが関わっているとのことです。

azurerm

Terraform Cloud

Terraformをそれほど使ってはいなかったといっても、Azure IaaSの基本的なリソース群をTerraformで1から作成して流したことはあります。

インフラの状態を保持して他の開発者と共有するtfstateファイルなどはローカルディスクだったり、Azure Storage Accountに置いたりしましたが、このTerraform Cloudを使ったほうが捗りそうなので、まずはこちらを理解していきます(私が)。

今回の記事はここがメイン。

とりあえずCopilotさんに聞くと、まさに状態管理が真っ先に機能として出てきますね。フリープランではどこまでできるのだろうか。

img

サインアップ

以下のページから先ずは「Try HCP Terraform」に移動してアカウントを作成しました。

Terraform by HashiCorp

2024年末にはIBMへの買収が完了する予定だそうなので、その後はURLや名称について変更があるかもしれません。

最初にログインするとOrganizations(組織)を作成させられます。FreeプランではこのOrganizationsの範囲内で自分を含めて5名までが利用できるみたい。

このOrganization名はユニークである必要があります。

APIキーの払い出し

いわゆる「terraform」コマンドを使って対話的に操作する方法をCLIドリブンというらしい。

私はコンソールを持たないUbuntu Server上でterraformコマンドを使いたいので、まずはTerraformのポータルからAPIキーを払い出します。

Account settingsから「Tokens」を選択後、「Create an API tokens」をクリックして発行します。

img

名前や有効期限を聞かれますが、とりあえず有効期限はデフォルトの30日でお試しします。

できました。

img

CLIのインストールとログイン

以下のサイトの説明に沿って、クライアント端末の種類におうじて適切な方法でCLI(terraformコマンド)をインストールします。

Install Terraform

私はAMD64のLinux実行形式ファイルのtarballをダウンロードして、手動で/usr/binにコピーしました。

以下のコマンドでTerraform cloudにログインを行うと、APIキーの入力が必要になるので入力すると準備は完了です。

terraform login
実行例
terraform login
Terraform will request an API token for app.terraform.io using your browser.

If login is successful, Terraform will store the token in plain text in
the following file for use by subsequent commands:
    /home/yotan/.terraform.d/credentials.tfrc.json

Do you want to proceed?
  Only 'yes' will be accepted to confirm.

  Enter a value: yes (yesと入力)

(snip)

Generate a token using your browser, and copy-paste it into this prompt.

Terraform will store the token in plain text in the following file
for use by subsequent commands:
    /home/yotan/.terraform.d/credentials.tfrc.json

Token for app.terraform.io:
  Enter a value: (APIキーを入力)


Retrieved token for user ****

(snip)

   New to HCP Terraform? Follow these steps to instantly apply an example configuration:

   $ git clone https://github.com/hashicorp/tfc-getting-started.git
   $ cd tfc-getting-started
   $ scripts/setup.sh

このあとチュートリアルをcloneして実行してみてって言われていますが、ガン無視していきましょう。

Azure接続情報の設定

ローカルPC側には基本的にはTerraform cloudのAPIキーだけを保持して、実際に操作するAzureなどの接続情報はTerraform cloud側に保持するのが良いっぽいです。

azurermモジュールが参照してくれる環境変数や接続情報(サービスプリンシパルなど)の確認方法、設定方法は以下URLに書かれています。

Azure Provider: Authenticating using a Service Principal with a Client Secret

OrganizationのVariable setsで以下の感じに設定しました。VariableのCategoryはenv(環境変数)にします。

img

準備したClient IDはAzure Subscriptionに対して共同作成者権限を付与しています。

img

ワークスペースの作成

Terraform cloudは、Organization配下に複数のワークスペースというデプロイ環境毎に利用するスペースを作成できます。

Freeプランでもワークスペースは複数作成することができますが、すべてのワークスペース内で管理できるリソース(多分AzureだったらVM, NIC, Public IPなどの単位)の最大数が500個までと制限される模様。

ワークスペースはポータルから追加しますが、terraform initで作成することもできるみたいです。

今回はローカルPC側の任意のディレクトリ上に以下のtfファイルを準備して作成します。

providers.tf
terraform {
  cloud {
    organization = "組織名"
    hostname     = "app.terraform.io"
    workspaces {
      name = "ワークスペース名"
    }
  }
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "=4.1.0"
    }
  }
}

provider "azurerm" {
  features {}
}

以下のコマンドで初期化してワークスペースを作成します。この操作は初回のみで大丈夫です。

terraform init

実行結果は以下の通り。

img

ワークスペースがポータルからも追加されていることが確認できました。

img

Azureリソース

ここからはローカル環境のTerraformとほとんど変わらずに利用可能です。

違いと言えば状態管理のtfstate関連ファイルがTerraform cloud上にあることですかね。

後、ワークスペース内で閉じたパラメータをローカルPC側に持たずにTerraform cloudのワークスペース側に持つことができます。

例えばAzureのリソースグループ名やリージョンなどはワークスペース毎に異なる値を設定しておくことで、デプロイする人はワークスペースを切り替えるだけでAzureの環境を簡単に切り替えることができそうです。

ワークスペースにVariableを設定

今回は追加したワークスペースの「Workspace variables」にlocation, resource_group_nameの二つを追加しました。

Categoryはenvではなくterraformです。

img

リソースグループ作成

今回はお試しでAzureのリソースグループを作成するtfファイルを用意しました。

variables.tf
variable "resource_group_name" {
  type = string
}

variable "location" {
  type = string
}
azureresource.tf
resource "azurerm_resource_group" "main" {
  name     = var.resource_group_name
  location = var.location
}

では、まずはterraform planを実行してみます。

terraform plan

よさそうですね。リソースグループを作成する気満々です。

img

この時点でOrganizationに設定した各種Azure接続情報がちゃんとazurermモジュールで適用されて、Terraform cloud→Azureサブスクリプションにアクセス出来ていることがわかります。

それではterraform applyで適用しましょう。

terraform apply

無事成功です。

img

Terraform cloudのポータルでワークスペースの「States」を確認すると、ちゃんと状態が保存されています。

img

無論Azure側も指定したリソースグループ名、リージョンでリソースグループが作成されました。

img

おわりに

はい、今回はここまでです。

Terraform cloudの基本的な初期設定方法、Organizationに設定する「Variable sets」、ワークスペースに設定する「Workspace variables」の用途について理解が深まりました。

今回試せなかった、チームで活用する際の権限付与、プロジェクト分け、GitHub/Azure DevOpsとの連携などについては次の機会で試していこうと思います。

以上です。

Discussion