0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【ハンズオン】WindowsでAzure CLI・Azure Powershell・Terraformをインストールして触ってみる

Last updated at Posted at 2024-08-18

きっかけ

自己学習のため、Azureの無料アカウントを作成した。GUIでの操作と同時にTerraformも学びたかったためインストールを行う。

次のステップ
環境に応じて、Terraform をインストールして構成します。

Terraform の構成: まだ行っていない場合は、次のいずれかのオプションを使用して Terraform を構成します。

Terraformのインストール方法が4つ案内されていたが、一番下の方法で行っていく。

本記事の内容

上記のMS記事内では下記の内容が説明されている。

今回は、1~7までを行っていく。

  1. 最新バージョンの PowerShell をインストールする
  2. 新しい PowerShell Az モジュールをインストールする
  3. Azure CLI をインストールする
  4. Terraform をインストールする
  5. Terraform と Azure の一般的な認証シナリオを理解する
  6. Microsoft アカウントを使用して、Cloud Shell から認証する (Bash または PowerShell を使用)
  7. Microsoft アカウントを使用して、Windows から認証する (Bash または PowerShell を使用)
  8. Azure CLI を使用してサービス プリンシパルを作成する
  9. Azure PowerShell を使用してサービス プリンシパルを作成する
  10. 環境変数でサービス プリンシパルの資格情報を指定する
  11. Terraform プロバイダー ブロックでサービス プリンシパルの資格情報を指定する

前提条件

環境を構成する
Azure サブスクリプション:Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。

恐縮だが、私のQiita記事を参考に挙げておく。

1. 最新バージョンの PowerShell をインストールする

Azure リソースの操作を可能にする最新の PowerShell モジュールは、Azure PowerShell Az モジュールと呼ばれています。 Azure PowerShell Az モジュールを使用する場合、すべてのプラットフォームで推奨されるバージョンは PowerShell 7 (またはそれ以降) です。

Windowsに標準でインストールされているPowerShellは推奨されない。

command1
$PSVersionTable.PSVersion

推奨バージョンが入っていない方は以下記事を参考。

私は推奨方法のWingetパッケージを使用したインストールを行ったので、その流れを記載しておく。

Winget を使用して PowerShell をインストールする (推奨)

公開済みのwingetパッケージを使用して最新バージョンのPowerShellを検索。

command2
winget search Microsoft.PowerShell

id パラメーターを使用して PowerShellをインストール。

command3
winget install --id Microsoft.Powershell --source winget

プレビュー版をインストールする場合はこちら

command4
winget install --id Microsoft.Powershell.Preview --source winget

2. 新しい PowerShell Az モジュールをインストールする

参考にしていたMS記事内にはAzモジュールのインストール方法がなかった。
下記のMS記事を参考にインストールしていく。

既にAzure PowerShellモジュールがインストール済みでないか確認。
インストール済みの場合、後からでてくるUpdate-Moduleのみ実行すればよいと思われる。

command5
Get-Module -Name Az -ListAvailable

前提条件

AzureRM PowerShell モジュールがインストールされているかどうかを確認

command6
Get-Module -Name AzureRM -ListAvailable

AzureRM PowerShell モジュールがインストールされている場合は、次に進む前に、「Az と AzureRM の共存」を参照してください。

PowerShell スクリプトの実行ポリシーの確認・変更

command7
Get-ExecutionPolicy -List
command8
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

実行ポリシーの詳細については、「about_Execution_Policies」を参照

Az PowerShell モジュールのインストール

インストール

command9
Install-Module -Name Az -Repository PSGallery -Force

更新

command10
Update-Module -Name Az -Force

PowerShellでAzureにサインイン

commnad11
Connect-AzAccount

対象を選択する。個人で作った場合はほとんどMicrosoftアカウント?

サインインできた。

[お試し]PowerShellでリソースグループの作成

command12
$rg = @{
    Name = 'test-rg'
    Location = 'eastus2'
}
New-AzResourceGroup @rg

確認

command13
Get-AzResourceGroup -ResourceGroupName 'test-rg'

Azure Portalでもリソースグループが作成されたことを確認できた。

終わったらAzureからサインアウトしておく。

command14
Disconncet-AzAccount

3. Azure CLI をインストールする

Terraform で Azure に対して認証を行うには、Azure CLI をインストールする必要があります。

Azure CLI の現在のバージョンは 2.63.0 です。 最新リリースについては、リリース ノートをご覧ください。

Azure CLIが既にインストール済みでないか確認

Azure CLI1
az --version

出力の最下行にYour CLI is up-to-date.とあれば最新バージョン。
最新バージョンでなければ後述のAzure CLIの更新の実施を推奨。

Azure CLIのインストール

インストール方法は4種類ある。今回は2で行う。

  1. Microsoftインストーラー(MSI)
  2. PowerShellを使用したMicrosoftインストーラー(MSI)
  3. Windows パッケージ マネージャー
  4. ZIPパッケージ(プレビュー段階)

管理者でPowerShellを起動し、下記のコマンドを実行。

command16
$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のターミナルを再起動する(コマンドプロンプトでもよい)。
以下のコマンドを実行し、インストールできたか確認。

Azure CLI2
az
Azure CLI3
az --version

出力の最下行にYour CLI is up-to-date.となければ更新を推奨。

Azure CLIの更新

バージョン 2.11.0 以降の Azure CLI には、最新バージョンに更新するためのツール内コマンドが用意されています。

Azure CLI4
az upgrade

az upgrade オプションの詳細については、コマンド リファレンス ページをご覧ください。

Azure CLIを用いたAzureへのサインイン

Azure CLI を使用する場合、次の4つの認証オプションがあります。

  1. Azure Cloud Shell
  2. 対話操作でサインインする
  3. サービス プリンシパルを使用してサインインする
  4. マネージド ID を使用してサインインする

今回は、2で行う。

Azure CLI5
az login

Azure CLI バージョン 2.61.0 以降では、複数のサブスクリプションにアクセスできる場合は、次の例に示すように、ログイン時に Azure サブスクリプションを選択するように求められます。

次回ログインすると、以前に選択したテナントとサブスクリプションが既定値としてマークされ、その番号の横にアスタリスク (*) が付きます。 これにより、Enterキーを押して既定のサブスクリプションを選択できます。

既定のサブスクリプションを変更する場合は以下のコマンドを実行。

Azure CLI6
az account set --subscription "<subscription ID or name>"

詳細についてはこちら。

[お試し]Azure CLIでリソースグループを作成

Azure CLI7
az group create --name demoResourceGroup --location westus
Azure CLI8
az group show --name 'demoResourceGroup'

作業が終わったらサインアウトしておく。

Azure CLI9
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」

「詳細設定」タブ → 「環境変数」

下の「システム環境変数」の「Path」を選択 → 「編集」

「新規」

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 リソース プロバイダー登録を選択します。
  • [登録] を選択して、状態を [登録解除] から [登録済み] に変更します。

少し待つ。今回は1,2分程度だった。

登録が完了した。

Cloud Shell の起動

  • Azure Portal 上部のナビゲーションから Cloud Shell を起動します。
  • 初めて Cloud Shell を起動すると、どのシェルを使うかを確認するダイアログが表示されます。

今回は「PowerShell」を選択。

  • [使用を開始する] ウィンドウで、エフェメラル セッションに [ストレージ アカウントは不要] を選択します。 ドロップダウン メニューを使って、Cloud Shell に使うサブスクリプションを選び、[適用] ボタンを選びます。

Cloud Shellが起動できた。

認証済みかつ構成済みの Azure ワークステーション

Azure CLI または Azure PowerShell コマンドレットを介してすばやくリソースにアクセスできるよう、Cloud Shell では安全に自動認証が行われます。 Cloud Shell にインストールされているツールの一覧はこちらからご覧いただけます。

認証済みなので、わざわざaz loginコマンドを実行する必要がない。
インストール済みのモジュールを確認してみる。

command15
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.tf
terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~>3.0"
    }
    random = {
      source  = "hashicorp/random"
      version = "~>3.0"
    }
  }
}

provider "azurerm" {
  features {}
}

main.tf

main.tf
resource "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.tf
variable "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.tf
output "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 コマンドは、実行プランを作成しますが、実行はしません。 代わりに、構成ファイルに指定された構成を作成するために必要なアクションを決定します。 このパターンを使用すると、実際のリソースに変更を加える前に、実行プランが自分の想定と一致しているかどうかを確認できます。

結果が出力されるまで3分ほどかかった。

Terraform 実行プランを適用する

terraform apply を実行して、クラウド インフラストラクチャに実行プランを適用します。

terraform apply main.tfplan

20秒ほどで実行が完了した。

今回はrandom_petでリソースグループのidがrg-sure-gliderとなった。

結果を確認する

1. Azure リソース グループ名を取得します。

command16
$resource_group_name=$(terraform output -raw resource_group_name)

2. Get-AzResourceGroup を実行して、リソース グループを表示します。

command17
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の取得

Azure Portalの場合

PowerShellの場合

command18
(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を新規作成。

rg.tfvars
resource_group_name     = "test-rg"
resource_group_location = "East US 2"

下記を追加。

main.tf
resource "azurerm_resource_group" "example" {
  location = var.resource_group_location
  name = var.resource_group_name
}

こちらも追加。

variables.tf
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関連について記事を投稿していくので、気になる方いらっしゃれば是非フォローお願いします🥰

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?