Terraformを本気で使う。Azureで【準備編】
はじめに
Microsoft AzureのインフラをARM Template、Bicep、Azure CLIなどを使って構築することは良くやっていましたが、実はTerraformはそれほど使ってきていませんでした。
Bicepはとても便利で使いやすいと自分は思っているのですが、対象となるクラウドサービスはMicrosoft Azure限定(ARM Template, Azure CLIも同様)であるため、どうせだったらちゃんと使えるようになっておこうという意思表示として、本エントリを投稿します。
以下の記事も本記事の後にお読みください。
Microsoftが推しているIaCツール
実際MicrosoftもBicep、ARM TemplateだけではなくTerraformも同じくらい力を入れているようです。
こちらはAzure Virtual NetworkをIaCで作成するためのドキュメントですが、デプロイ言語の選択にはしっかりとTerraformが載っています(載っていない機能のページも過去に見たことはあるけど)。
Microsoft.Network virtualNetworks
Terraformから呼ばれるAzureモジュール(azurerm)もMicrosoftのAzureチームが関わっているとのことです。
Terraform Cloud
Terraformをそれほど使ってはいなかったといっても、Azure IaaSの基本的なリソース群をTerraformで1から作成して流したことはあります。
インフラの状態を保持して他の開発者と共有するtfstateファイルなどはローカルディスクだったり、Azure Storage Accountに置いたりしましたが、このTerraform Cloudを使ったほうが捗りそうなので、まずはこちらを理解していきます(私が)。
今回の記事はここがメイン。
とりあえずCopilotさんに聞くと、まさに状態管理が真っ先に機能として出てきますね。フリープランではどこまでできるのだろうか。
サインアップ
以下のページから先ずは「Try HCP Terraform」に移動してアカウントを作成しました。
2024年末にはIBMへの買収が完了する予定だそうなので、その後はURLや名称について変更があるかもしれません。
最初にログインするとOrganizations(組織)を作成させられます。FreeプランではこのOrganizationsの範囲内で自分を含めて5名までが利用できるみたい。
このOrganization名はユニークである必要があります。
APIキーの払い出し
いわゆる「terraform」コマンドを使って対話的に操作する方法をCLIドリブンというらしい。
私はコンソールを持たないUbuntu Server上でterraformコマンドを使いたいので、まずはTerraformのポータルからAPIキーを払い出します。
Account settingsから「Tokens」を選択後、「Create an API tokens」をクリックして発行します。
名前や有効期限を聞かれますが、とりあえず有効期限はデフォルトの30日でお試しします。
できました。
CLIのインストールとログイン
以下のサイトの説明に沿って、クライアント端末の種類におうじて適切な方法でCLI(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(環境変数)にします。
準備したClient IDはAzure Subscriptionに対して共同作成者権限を付与しています。
ワークスペースの作成
Terraform cloudは、Organization配下に複数のワークスペースというデプロイ環境毎に利用するスペースを作成できます。
Freeプランでもワークスペースは複数作成することができますが、すべてのワークスペース内で管理できるリソース(多分AzureだったらVM, NIC, Public IPなどの単位)の最大数が500個までと制限される模様。
ワークスペースはポータルから追加しますが、terraform initで作成することもできるみたいです。
今回はローカルPC側の任意のディレクトリ上に以下の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
実行結果は以下の通り。
ワークスペースがポータルからも追加されていることが確認できました。
Azureリソース
ここからはローカル環境のTerraformとほとんど変わらずに利用可能です。
違いと言えば状態管理のtfstate関連ファイルがTerraform cloud上にあることですかね。
後、ワークスペース内で閉じたパラメータをローカルPC側に持たずにTerraform cloudのワークスペース側に持つことができます。
例えばAzureのリソースグループ名やリージョンなどはワークスペース毎に異なる値を設定しておくことで、デプロイする人はワークスペースを切り替えるだけでAzureの環境を簡単に切り替えることができそうです。
ワークスペースにVariableを設定
今回は追加したワークスペースの「Workspace variables」にlocation, resource_group_nameの二つを追加しました。
Categoryはenvではなくterraformです。
リソースグループ作成
今回はお試しでAzureのリソースグループを作成するtfファイルを用意しました。
variable "resource_group_name" {
type = string
}
variable "location" {
type = string
}
resource "azurerm_resource_group" "main" {
name = var.resource_group_name
location = var.location
}
では、まずはterraform planを実行してみます。
terraform plan
よさそうですね。リソースグループを作成する気満々です。
この時点でOrganizationに設定した各種Azure接続情報がちゃんとazurermモジュールで適用されて、Terraform cloud→Azureサブスクリプションにアクセス出来ていることがわかります。
それではterraform applyで適用しましょう。
terraform apply
無事成功です。
Terraform cloudのポータルでワークスペースの「States」を確認すると、ちゃんと状態が保存されています。
無論Azure側も指定したリソースグループ名、リージョンでリソースグループが作成されました。
おわりに
はい、今回はここまでです。
Terraform cloudの基本的な初期設定方法、Organizationに設定する「Variable sets」、ワークスペースに設定する「Workspace variables」の用途について理解が深まりました。
今回試せなかった、チームで活用する際の権限付与、プロジェクト分け、GitHub/Azure DevOpsとの連携などについては次の機会で試していこうと思います。
以上です。
Discussion