きっかけ
自己学習のため、Azureの無料アカウントを作成した。GUIでの操作と同時にTerraformも学びたかったためインストールを行う。
次のステップ
環境に応じて、Terraform をインストールして構成します。Terraform の構成: まだ行っていない場合は、次のいずれかのオプションを使用して Terraform を構成します。
Terraformのインストール方法が4つ案内されていたが、一番下の方法で行っていく。
本記事の内容
上記のMS記事内では下記の内容が説明されている。
今回は、1~7までを行っていく。
- 最新バージョンの PowerShell をインストールする
- 新しい PowerShell Az モジュールをインストールする
- Azure CLI をインストールする
- Terraform をインストールする
- Terraform と Azure の一般的な認証シナリオを理解する
- Microsoft アカウントを使用して、Cloud Shell から認証する (Bash または PowerShell を使用)
- Microsoft アカウントを使用して、Windows から認証する (Bash または PowerShell を使用)
- Azure CLI を使用してサービス プリンシパルを作成する
- Azure PowerShell を使用してサービス プリンシパルを作成する
- 環境変数でサービス プリンシパルの資格情報を指定する
- Terraform プロバイダー ブロックでサービス プリンシパルの資格情報を指定する
前提条件
環境を構成する
Azure サブスクリプション:Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。
恐縮だが、私のQiita記事を参考に挙げておく。
1. 最新バージョンの PowerShell をインストールする
Azure リソースの操作を可能にする最新の PowerShell モジュールは、Azure PowerShell Az モジュールと呼ばれています。 Azure PowerShell Az モジュールを使用する場合、すべてのプラットフォームで推奨されるバージョンは PowerShell 7 (またはそれ以降) です。
Windowsに標準でインストールされているPowerShellは推奨されない。
$PSVersionTable.PSVersion
推奨バージョンが入っていない方は以下記事を参考。
私は推奨方法のWingetパッケージを使用したインストールを行ったので、その流れを記載しておく。
Winget を使用して PowerShell をインストールする (推奨)
公開済みのwingetパッケージを使用して最新バージョンのPowerShellを検索。
winget search Microsoft.PowerShell
id パラメーターを使用して PowerShellをインストール。
winget install --id Microsoft.Powershell --source winget
プレビュー版をインストールする場合はこちら
winget install --id Microsoft.Powershell.Preview --source winget
2. 新しい PowerShell Az モジュールをインストールする
参考にしていたMS記事内にはAzモジュールのインストール方法がなかった。
下記のMS記事を参考にインストールしていく。
既にAzure PowerShellモジュールがインストール済みでないか確認。
インストール済みの場合、後からでてくるUpdate-Moduleのみ実行すればよいと思われる。
Get-Module -Name Az -ListAvailable
前提条件
AzureRM PowerShell モジュールがインストールされているかどうかを確認
Get-Module -Name AzureRM -ListAvailable
AzureRM PowerShell モジュールがインストールされている場合は、次に進む前に、「Az と AzureRM の共存」を参照してください。
PowerShell スクリプトの実行ポリシーの確認・変更
Get-ExecutionPolicy -List
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
実行ポリシーの詳細については、「about_Execution_Policies」を参照
Az PowerShell モジュールのインストール
インストール
Install-Module -Name Az -Repository PSGallery -Force
更新
Update-Module -Name Az -Force
PowerShellでAzureにサインイン
Connect-AzAccount
対象を選択する。個人で作った場合はほとんどMicrosoftアカウント?
[お試し]PowerShellでリソースグループの作成
$rg = @{
Name = 'test-rg'
Location = 'eastus2'
}
New-AzResourceGroup @rg
確認
Get-AzResourceGroup -ResourceGroupName 'test-rg'
Azure Portalでもリソースグループが作成されたことを確認できた。
終わったらAzureからサインアウトしておく。
Disconncet-AzAccount
3. Azure CLI をインストールする
Terraform で Azure に対して認証を行うには、Azure CLI をインストールする必要があります。
Azure CLI の現在のバージョンは 2.63.0 です。 最新リリースについては、リリース ノートをご覧ください。
Azure CLIが既にインストール済みでないか確認
az --version
出力の最下行にYour CLI is up-to-date.
とあれば最新バージョン。
最新バージョンでなければ後述のAzure CLIの更新の実施を推奨。
Azure CLIのインストール
インストール方法は4種類ある。今回は2で行う。
- Microsoftインストーラー(MSI)
- PowerShellを使用したMicrosoftインストーラー(MSI)
- Windows パッケージ マネージャー
- ZIPパッケージ(プレビュー段階)
管理者でPowerShellを起動し、下記のコマンドを実行。
$ProgressPreference = 'SilentlyContinue'; Invoke-WebRequest -Uri https://aka.ms/installazurecliwindowsx64 -OutFile .\AzureCLI.msi; Start-Process msiexec.exe -Wait -ArgumentList '/I AzureCLI.msi /quiet'; Remove-Item .\AzureCLI.msi
今回は、64 ビットの方で、インストールするため、URL をhttps://aka.ms/installazurecliwindowsx64
に変更している。
2.51.0 以降では、Azure CLI には 64 ビット MSI も用意されており、パフォーマンスを向上させるために推奨されます。
インストールの確認
PowerShellのターミナルを再起動する(コマンドプロンプトでもよい)。
以下のコマンドを実行し、インストールできたか確認。
az
az --version
出力の最下行にYour CLI is up-to-date.
となければ更新を推奨。
Azure CLIの更新
バージョン 2.11.0 以降の Azure CLI には、最新バージョンに更新するためのツール内コマンドが用意されています。
az upgrade
az upgrade
オプションの詳細については、コマンド リファレンス ページをご覧ください。
Azure CLIを用いたAzureへのサインイン
Azure CLI を使用する場合、次の4つの認証オプションがあります。
今回は、2で行う。
az login
Azure CLI バージョン 2.61.0 以降では、複数のサブスクリプションにアクセスできる場合は、次の例に示すように、ログイン時に Azure サブスクリプションを選択するように求められます。
次回ログインすると、以前に選択したテナントとサブスクリプションが既定値としてマークされ、その番号の横にアスタリスク (*) が付きます。 これにより、Enterキーを押して既定のサブスクリプションを選択できます。
既定のサブスクリプションを変更する場合は以下のコマンドを実行。
az account set --subscription "<subscription ID or name>"
詳細についてはこちら。
[お試し]Azure CLIでリソースグループを作成
az group create --name demoResourceGroup --location westus
az group show --name 'demoResourceGroup'
作業が終わったらサインアウトしておく。
az logout
4. Terraform をインストールする
1. Terraform をダウンロードします。 この記事は、Terraform バージョン 1.1.4 を使用してテストされました。
MS記事では1.1.4で実施されたようだが、2024/08/17現在の最新は1.9.4だったため、この最新バージョンをインストールする。
32bit版の方は386、64bit版の方はAMD64を選択。
違いについては下記のサイトが参考になった。呼び名の歴史の話が面白かった。
2. ダウンロードから、任意のディレクトリ (例:
c:\terraform
) に実行可能ファイルを抽出します。
環境変数PATHにterraformのパスを追加
3. 実行可能ファイルを含むディレクトリが含まれるように、システムのグローバル PATH 環境変数を更新します。
「Windows」+「R」キーを同時押し→ 「sysdm.cpl」
「詳細設定」タブ → 「環境変数」
terraform.exeを格納したパス(今回であればC:\terraform
)を入力 → 「OK」
4. ターミナル ウィンドウを開きます。
更新された環境変数PATHの読み込みが必要なため、ターミナルを開きなおす。
5. terraform コマンドでグローバル パス構成を確認します。
terraform --version
Terraform バージョン 1.9.4でもMS記事の手順でインストールができた。
5. Terraform と Azure の一般的な認証シナリオを理解する
Azure サブスクリプションに対して Terraform コマンドを使用するには、まず、そのサブスクリプションに対して Terraform を認証する必要があります。
Terraform では、Azure CLI を使用した Azure への認証のみがサポートされます。 Azure PowerShell を使用した認証はサポートされていません。 そのため、Terraform の作業を行うときには Azure PowerShell モジュールを使用できますが、まず Azure CLI を使用して Azure に対する認証を行う必要があります。
6. Microsoft アカウントを使用して、Cloud Shell から認証する (Bash または PowerShell を使用)
今回は、一時的な検証目的のため、ストレージアカウントの作成が不要なCloud Shell エフェメラル セッションを使用する。
前提条件
Azure Cloud Shell を使用する前に、Microsoft.CloudShell リソース プロバイダーを登録する必要があります。 リソースへのアクセスは、サブスクリプションに登録する必要があるプロバイダー名前空間を通じて有効になります。 名前空間はサブスクリプションごとに 1 回だけ登録する必要があります。
リソースプロバイダーとは
上記MS記事より引用したが、以下画像の部分の赤枠のリソースを提供するサービス。
リソース プロバイダー - Azure リソースを提供するサービス。 一般的なリソースプロバイダーの一例として、仮想マシン リソースを提供する
Microsoft.Compute
があります。
Azure リソース プロバイダーは、特定の Azure サービスの機能を有効化する REST 操作のセットです。
リソースプロバイダーは、以下記事にもある通り、一部のリソースを除き、必要な時に自動で登録される。
一部のリソース プロバイダーが既定で登録されています。 既定で登録されているリソース プロバイダーの一覧については、「Azure サービスのリソース プロバイダー」を参照してください。
その他のリソース プロバイダーは、特定のアクションを実行すると自動的に登録されます。
ただ今回は、MS記事の手順に従い手動で登録する。
リソースプロバイダーの登録
- Azure portal にサインインします。
- Azure portal のメニューでサブスクリプションを検索します。 使用可能なオプションから、それを選択します。
- 表示するサブスクリプションを選択します。
- 左側のメニューの [設定] で、 [リソース プロバイダー] を選択します。
- 検索ボックスに「cloudshell」と入力して、リソース プロバイダーを検索します。
- プロバイダーの一覧から Microsoft.CloudShell リソース プロバイダー登録を選択します。
- [登録] を選択して、状態を [登録解除] から [登録済み] に変更します。
Cloud Shell の起動
- Azure Portal 上部のナビゲーションから Cloud Shell を起動します。
- 初めて Cloud Shell を起動すると、どのシェルを使うかを確認するダイアログが表示されます。
- [使用を開始する] ウィンドウで、エフェメラル セッションに [ストレージ アカウントは不要] を選択します。 ドロップダウン メニューを使って、Cloud Shell に使うサブスクリプションを選び、[適用] ボタンを選びます。
認証済みかつ構成済みの Azure ワークステーション
Azure CLI または Azure PowerShell コマンドレットを介してすばやくリソースにアクセスできるよう、Cloud Shell では安全に自動認証が行われます。 Cloud Shell にインストールされているツールの一覧はこちらからご覧いただけます。
認証済みなので、わざわざaz loginコマンドを実行する必要がない。
インストール済みのモジュールを確認してみる。
Get-Module -ListAvailable
7. Microsoft アカウントを使用して、Windows から認証する (Bash または PowerShell を使用)
Azure CLIでAzureへのサインイン
PowerShellを起動し、az login
でAzureにサインインする。
再掲
Terraform では、Azure CLI を使用した Azure への認証のみがサポートされます。 Azure PowerShell を使用した認証はサポートされていません。 そのため、Terraform の作業を行うときには Azure PowerShell モジュールを使用できますが、まず Azure CLI を使用して Azure に対する認証を行う必要があります。
クイック スタート: Terraform を使用して Azure リソース グループを作成する
この記事では、次のことについて説明します。
- random_pet を使用して Azure リソース グループ名のランダムな値を作成する。
- azurerm_resource_group を使用して Azure リソース グループを作成する。
The resource
random_pet
generates random pet names that are intended to be used as unique identifiers for other resources.
Terraform コードを実装する
この記事のサンプル コードは、Azure Terraform GitHub リポジトリにあります。
サンプルの Terraform コードをテストするディレクトリを作成し、それを現在のディレクトリにします。
下記4つの.tfファイルを作成し、そのディレクトリに格納する。
providers.tf
providers.tfterraform { required_providers { azurerm = { source = "hashicorp/azurerm" version = "~>3.0" } random = { source = "hashicorp/random" version = "~>3.0" } } } provider "azurerm" { features {} }
main.tf
main.tfresource "random_pet" "rg_name" { prefix = var.resource_group_name_prefix } resource "azurerm_resource_group" "rg" { location = var.resource_group_location name = random_pet.rg_name.id }
variables.tf
variables.tfvariable "resource_group_location" { type = string default = "eastus" description = "Location of the resource group." } variable "resource_group_name_prefix" { type = string default = "rg" description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription." }
outputs.tf
outputs.tfoutput "resource_group_name" { value = azurerm_resource_group.rg.name }
Terraform を初期化する
terraform init を実行して、Terraform のデプロイを初期化します。 このコマンドによって、Azure リソースを管理するために必要な Azure プロバイダーがダウンロードされます。
terraform init -upgrade
Terraform 実行プランを作成する
terraform plan を実行して、実行プランを作成します。
terraform plan -out main.tfplan
terraform plan
コマンドは、実行プランを作成しますが、実行はしません。 代わりに、構成ファイルに指定された構成を作成するために必要なアクションを決定します。 このパターンを使用すると、実際のリソースに変更を加える前に、実行プランが自分の想定と一致しているかどうかを確認できます。
Terraform 実行プランを適用する
terraform apply を実行して、クラウド インフラストラクチャに実行プランを適用します。
terraform apply main.tfplan
今回はrandom_pet
でリソースグループのidがrg-sure-glider
となった。
結果を確認する
1. Azure リソース グループ名を取得します。
$resource_group_name=$(terraform output -raw resource_group_name)
2. Get-AzResourceGroup を実行して、リソース グループを表示します。
Get-AzResourceGroup -Name $resource_group_name
[お試し]terraform import で既存のリソースをterraform管理下にする
MS記事ではこの後リソースのクリーンアップとなるが、先ほどコマンドで作成したリソースをterraform管理下にしてから一緒に削除を試してみる。
https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/resource_group
Importについて
Resource Groups can be imported using the
resource id
, e.g.
terraform import azurerm_resource_group.example /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/group1
上記コマンドの2つ目の引数はresource id
なのは分かったが、1つ目の引数がよくわからなかったので調べてみた。
resource "azurerm_resource_group" "example" {
name = "example"
location = "West Europe"
}
azurerm_resource_group
がterraformのazurerm providerの一種なのはわかったがexample
が何なのか公式ドキュメントを読んでもすぐには見つからなかったので、ChatGPTに聞いてみた。
terraform内だけの名前らしい。
resource id
の取得
PowerShellの場合
(Get-AzResourceGroup -Name 'test-rg').ResourceId | clip
パイプラインでclipに渡すことで、クリップボードにコピーできる。
最近知ったので使ってみたかった。
https://gigazine.net/news/20240812-windows-clip-command-clipboard/
terraform importの実行
実行すると、エラーとなった。先にmain.tfにresourceブロックを書いておく必要があるらしい。
:::note warn
この書き方は良くない。この後実行するコマンドでエラーが発生するのでその際にlocationとnameを追加する。
importできた。
リソースをクリーンアップする
Terraform を使用して作成したリソースが不要になった場合は、次の手順を実行します。
1. terraform plan を実行して、
destroy
フラグを指定します。
terraform plan -destroy -out main.destroy.tfplan
resource
ブロックにlocationとnameが必要らしい。
rg.tfvarsを新規作成。
resource_group_name = "test-rg"
resource_group_location = "East US 2"
下記を追加。
resource "azurerm_resource_group" "example" {
location = var.resource_group_location
name = var.resource_group_name
}
こちらも追加。
variable "resource_group_name" {
description = "The name of the resource group."
type = string
default = "test-rg"
}
文法や構文が正しいかどうかを確認。
terraform validate
2. terraform apply を実行して、実行プランを適用します。
terraform apply main.destroy.tfplan
Azure Portalでもterraform管理下のリソースグループが削除されたことを確認。
おわりに
WindowsやPowershellでTerraformを試す記事はあまりなかったので、初めてTerraformを触れる方には多少は読む価値のある記事になっていると良いなと思いました。
これからも主にAzureやMicrosoft関連について記事を投稿していくので、気になる方いらっしゃれば是非フォローお願いします🥰