Azure PowerShellを使ってログインする

# Azure PowerShellを使ってログインする

## ゴール

* Azure PowerShellを使用する目的、できることを知る
* Auzre PowerShellのインストール方法を知る
* Azure PowerShellを使用してログイン、ログアウトの方法を知る

## この記事について

この記事は、Microsoftの公式ドキュメントをもとに実際に試した際に、調べたことをまとめました。  
手順やコマンドは基本的に同じものを使用しており、記事内にリンクを掲載します。  

## 用語

|||
|-|-|
|Azure PowerShell|PowerShellからAzureへアクセスするためのPowerShellコマンド群のこと。|
|Az PowerShell|Azure PowerShellのひとつでAzモジュールを使用する。こちらの利用が推奨されている。|
|AzureRM PowerShell|Azure PowerShellのひとつでAzureRMモジュールを使用する。 2024/2/29に廃止される。|
|Azure CLI|クロスプラットフォームなCUIツール。 Windows/macOS/Linuxにインストールでき、シェルもPowerShell/Cmd/Bashを選択できる。|
|Azure Cloud Shell|Azure PowerShellとAzure CLIがインストールされたVMのこと。ブラウザからアクセスすることができ、起動のたびに環境が作成される。利用するにはストレージの用意が必要。|
|サービスプリンシパル|Azureリソースへアクセスするための権限を定義したIDのこと。スクリプトなどでアクセスするときに、ログインをせずにこれを使用してアクセスができる。|
|テナント|Azureのアカウントと同じような概念のこと。|
|サブスクリプション|Azureの契約単位のこと。この単位ごとにコストが計算され、請求される。|

## Azure PowerShellとは

PowerShellからAzureへアクセスするためのコマンド群のこと。  
例えば、あるリソースの情報を閲覧したり新たに作成するようなときにブラウザからAzureポータルへにアクセスすること、つまりGUIでの操作は誰もが実施しているはず。  
この方法以外にもCUIからアクセスする方法があり、それがAzure PowerShellというツールで提供がされている。  

CUIを使う目的は、スクリプトに組み込み操作を自動化することがもっとも大きいと考えている。  
人間が操作する必要がないような定型処理を行うときや、Azureリソースの情報を使用して後続処理をしたいとき、GUIでは自動化が難しいがCUIであればそれが可能となる。  
また、画面操作を誤ることがなくなり定義された処理を確実に実行することができる。

* CUIでAzureリソースにアクセスができる
* 定型処理をスクリプト化できる
* 操作が確実に実行される

公式ドキュメントで概要から用法と例まで解説されています。  
[Azure PowerShell のドキュメント](https://learn.microsoft.com/ja-jp/powershell/azure/)

## AzureのCUI系ツールの違い

AzureのCUI系ツールはいくつか似た名前のものがあるので、整理する。  

### Azure PowerShell と Azure CLI

 AzureのCUIツールとして、この2種類がある。  
 両者の機能の差は公式では明言されておらず、利用状況を考慮し使用するツールを採用すればよいとあるため、どちらを利用しても同等のことは可能だと思われる。  

[適切な Azure コマンド ライン ツールを選択する](https://learn.microsoft.com/ja-jp/cli/azure/choose-the-right-azure-command-line-tool)

||Azure PowerShell|Azure CLI|
|:-:|-|-|
|環境|Windows/macOS/Linux|Windows/macOS/Linux|
|シェル|PowerShell|PowerShell/Cmd/Bash|
|コマンド|動詞-名詞 <br>e.g.) Connect-AzAccount|az \<action> <br> e.g.) az login|
|構文|PowerShell|Bashに近い|

個人的には以下のように使い分けする。

* Windowsのクライアントから手動操作したい場合は、Azure PowerShellを使用する
* Linux系VMでスクリプトに組み込む場合は、Azure CLIを使用する

### Az PowerShell と AzureRM PowerShell

同じAzure PowerShellと呼ばれているが、コマンド名も異なり両者は異なる。  
AzureRM PowerShellはすでに廃止が決定されているため、Az PowerShellを使用することを推奨。  

* Az PowerShellは、[動詞]-Az[名詞]という名前のコマンド。  
* AzureRM PowerShellは、[動詞]-AzureRm[名詞]という名前のコマンド。  

### Azure Cloud Shell

 上記の実行環境のことで、CUIのツールそのものではない。  
 ポータルから起動でき、ブラウザ上でコマンドを実行することができる。  

![AzurePowerShell_CloudShell.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3018916/7f711d4a-8259-a43e-a9e0-9c0d51d9286c.png)

## Azure PowerShellのインストール

ここではWindowsのクライアントPCへのインストール方法を想定する。  
PowerShellのコマンドラインからのインストールと、MSIインストーラからインストールする2つの方法がある。  

コマンドラインからのインストールは環境によってはアクセス制限がかかっていることもあり、インストーラをダウンロードする方法のほうが簡単な場合もあるが、どちらも同じであるため好みで決めてよい。  
公式ドキュメントに説明があるので、説明は省略。  

[Azure PowerShell をインストールする方法](https://learn.microsoft.com/ja-jp/powershell/azure/install-azure-powershell)

### インストール結果の確認

```PowerShell
PS C:\Users\user> Get-InstalledModule -Name Az

Version    Name                                Repository           Description                                                                                                                
-------    ----                                ----------           -----------                                                                                                                
9.7.1      Az                                  https://www.power... Microsoft Azure PowerShell - Cmdlets to manage resources in Azure. This module is compatible with PowerShell and Windows...

PS C:\Users\user> 
```

## 対話形式でログインする

### ログイン

`Connect-AzAccount`コマンドを実行すると画面が表示されるので、ログインする。  

![AzurePowerShell_Login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3018916/8de6160d-5f90-d3a1-2be6-2c4c05f03ed3.png)

```PowerShell
PS C:\Users\user> Connect-AzAccount

Account         SubscriptionName TenantId                             Environment
-------         ---------------- --------                             -----------
user@mail.co.jp subscription-1   xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxxxxxxx AzureCloud 
```

```PowerShell
PS C:\Users\user> Get-AzContext -ListAvailable

Name                                     Account             SubscriptionName         Environment          TenantId                            
----                                     -------             ----------------         -----------          --------                            
subscription-1 (xxxxxxxx-xxxx-xxxx-xx... user@mail.co.jp     subscription-1           AzureCloud           xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
```

### ログアウト

```PowerShell
PS C:\Users\user> Disconnect-AzAccount

Id                    : user@mail.co.jp
Type                  : User
Tenants               : {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
Credential            : 
TenantMap             : {}
CertificateThumbprint : 
ExtendedProperties    : {...}
```

## サービスプリンシパルを使ってログイン

上記は対話形式でのログインをしているので、画面上でユーザ/パスワードの入力が伴う。  
しかしスクリプトで実行するのであればスクリプト内でログイン処理も行いたい。その方法のひとつに、サービスプリンシパルというIDを発行しておくものがある。  

[Azure PowerShell を使用してサインインする](https://learn.microsoft.com/ja-jp/powershell/azure/authenticate-azureps)  
[Azure PowerShell で Azure サービス プリンシパルを作成する](https://learn.microsoft.com/ja-jp/powershell/azure/create-azure-service-principal-azureps)

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

まず、ログインした状態で`New-AzADServicePrincipal`によってサービスプリンシパルを作成する。  
戻り値の`MicrosoftGraphServicePrincipal型`から、次の情報を保存しておく。  

|||
|-|-|
|AppId|ユーザ名に相当する|
|PasswordCredentials.SecretText|パスワードに相当する|

```PowerShell
PS C:\Users\user> $sp = New-AzADServicePrincipal -DisplayName ServicePrincipalName
PS C:\Users\user> $sp.AppId
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

PS C:\Users\user> $sp.PasswordCredentials.SecretText
xxxxxxxxxxxxxxxxxxxxxxxxxxx           #パスワードが平文で表示される。
```

:::note warn
パスワードを発行したあとは二度と閲覧することができないため、保管する必要があります。  
:::

[New-AzADServicePrincipal リファレンス](https://learn.microsoft.com/ja-jp/powershell/module/Az.Resources/New-AzADServicePrincipal)

### テナントIDの取得

ログイン時にサービスプリンシパルを作成したテナントを指定するため、テナントIDを事前に取得する。  
テナントはAzureのアカウントと同じような概念で、ログイン先のAzureアカウントを指定すると考えると良いと思う。(厳密には異なるかもしれないです)  
Azure ADとテナントは1:1の関係となるらしい。  

```PowerShell
PS C:\Users\user> $tenantId = (Get-AzContext).Tenant.Id
PS C:\Users\user> $tenantId
aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
```

ここまで完了したら、`Disconnect-AzAccount`でログアウトしてよい。  

### スクリプトでログイン処理

ログアウトした状態で、サービスプリンシパル、テナントID次のように指定すると、ログインが可能。  

|||
|-|-|
|$user|サービスプリンシパルで作成した `AppId`|
|$password|サービスプリンシパルで作成した `PasswordCredentials.SecretText`|
|$tenantId|テナントID|

```PowerShell
$SecureStringPwd = $password | ConvertTo-SecureString -AsPlainText -Force;
$pscredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $user, $SecureStringPwd;
Connect-AzAccount -ServicePrincipal -Credential $pscredential -Tenant $tenantId;


Account                              SubscriptionName TenantId                             Environment
-------                              ---------------- --------                             -----------
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx                  aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa AzureCloud 
```

### サービスプリンシパルの確認

`Azure Active Directory`の`アプリの登録`でサービスプリンシパルを確認することができる。  
今回作成したサービスプリンシパルには権限の範囲を与えていないため、実際に使用するにはその設定をしたうえで権限のコントロールをする。  

![AzurePowerShell_AzureAD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3018916/6d7d778f-42bc-6951-6a51-4c9ab4abbd5a.png)