Windows で Azure CLI を使用する手順と注意点

## インストール手順

https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli-windows?tabs=azure-cli

基本的には👆の手順ですが、それもめんどくさいという人は以下のようになります。

Azure CLI のインストール (Microsoft インストーラーを使用する場合）
https://aka.ms/installazurecliwindows

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505421/5e884431-e965-8f41-ac9e-a906f88e8841.png)

完了すると、Windows コマンド プロンプトか PowerShell で `az` コマンドが使用できるようになっています。

:::note warn
コマンドプロンプト / Powershell をインストール前から開いていた場合は、エラー出ます。コマンドプロンプト等を再起動でOK。
:::
```
PS C:\Users\*****> az

Welcome to Azure CLI!
---------------------
Use `az -h` to see available commands or go to https://aka.ms/cli.

Telemetry
---------
The Azure CLI collects usage data in order to improve your experience.
The data is anonymous and does not include commandline argument values.
The data is collected by Microsoft.

You can change your telemetry settings with `az configure`.


     /\
    /  \    _____   _ _  ___ _
   / /\ \  |_  / | | | \'__/ _\
  / ____ \  / /| |_| | | |  __/
 /_/    \_\/___|\__,_|_|  \___|


Welcome to the cool new Azure CLI!

# 以下、略
```

## Azure CLI のログイン

コマンドプロンプト や Windows PowerShell (以下、Windows PowerShell を使用)で
`az login` コマンドを実行します。

```
PS C:\Users\*****> az login
A web browser has been opened at https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize. Please continue the login in the web browser. If no web browser is available or if the web browser fails to open, use device code flow with `az login --use-device-code`.
```

すると、既定のブラウザで Azure の認証画面が表示されます。
認証してください。

すると、また PowerShell には以下のような表示がされるはずです。
```
[
  {
    "cloudName": "AzureCloud",
    "homeTenantId": "********-****-****-****-************",
    "id": "********-****-****-****-***********",
    "isDefault": true,
    "managedByTenants": [],
    "name": "Azure サブスクリプション 1",
    "state": "Enabled",
    "tenantId": "********-****-****-****-************",
    "user": {
      "name": "**********@example.com",
      "type": "user"
    }
  }
]
```

少しだけ👆の見方に触れておくと、もっと長く表示されることがあると思いますが、それは複数のサブスクリプションを持っている場合です。
`"isDefault": true,` となっている（１つの）サブスクリプションが現在有効となっています。切り替え方はググってください。

認証に成功しても、PowerShell の画面は以下のように変わりませんが、もう作業に入れる状態となっているはずです。
```
PS C:\Users\*****>
```
ここから、`az` から始まるコマンドを実行していくことができます。
Microsoft の ドキュメント や Learn などを思う存分試していけます。

:::note info
当記事の以降のコード例では `PS C:\Users\*****>` 表示の後に書いていくコードを記載します。
:::

## Windows PowerShell で Azure CLI を使用する際の注意点

### 1. コードの途中に改行するときは `` ` `` (バッククオート) を使う
たとえば、以下のようなサンプルコードがあるとします。
```
az vm create -n MyVm -g MyResourceGroup --public-ip-address-dns-name MyUniqueDnsName \
    --image ubuntults --data-disk-sizes-gb 10 20 --size Standard_DS2_v2 \
    --generate-ssh-keys
```
1 行目と 2 行目の最後に `\` と書いてありますが、そのままコピペをしても動きません。
Azure CloudShell などで実行している場合は改行記号が `\` でよいのですが、Windows PowerShell で実行している場合の改行記号は `` ` `` となるため、以下のように書き直す必要があります。
```
az vm create -n MyVm -g MyResourceGroup --public-ip-address-dns-name MyUniqueDnsName `
    --image ubuntults --data-disk-sizes-gb 10 20 --size Standard_DS2_v2 `
    --generate-ssh-keys
```
:::note warn
👆のコードをそのままコピーしてもエラーが出ると思います。二つ目の注意点にもつながるのですが、指定しているリソースが試している Azure の実行環境にないためです。
:::

### 2. コマンド で操作をする場合は、順番が大切
Azure Portal で何か操作をする場合は、準備しなければいけないリソースを合わせて選択したり、その場で元となるリソースを作成できることがあります。

例えば、仮想マシンを作成する場合、リソースグループを選択するだけでなく、仮想マシンの作成画面でそのままリソースグループを新規作成することもできます。

[Azure Portal]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505421/8e777786-e74c-27fb-7335-07dfb56cd5ee.png)

これを Azure CLI や Azure PowerShell で一気に実行しようとしてもできません。
たとえば、仮想マシンを作成しようとしたときに、指定したリソースグループ (ここでは`myResourceGroup`) を用意していない場合、以下のようにエラーとなります。
```
az vm create `
>>   --resource-group myResourceGroup `
>>   --name myVM `
>>   --image UbuntuLTS `
>>   --admin-username azureuser `
>>   --generate-ssh-keys
(ResourceGroupNotFound) Resource group 'myResourceGroup' could not be found.
Code: ResourceGroupNotFound
Message: Resource group 'myResourceGroup' could not be found.
```

まず、リソースグループを作ることから始めなければいけません。
Azure Portal で作成しても、Azure CLI で作成しても問題ありません。

[Azure CLI]
```
az group create --name myResourceGroup --location japaneast
```

Azure Portal では、自動的に必要なリソースを適切な手順で作成してくれるためです。
Azure Portal では以下のような画面がリソースの作成中に表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505421/86042320-46a4-eef7-8a87-882eea6974ae.png)

コマンドで一つずつ実行していくことは面倒くさいといえば面倒くさいのですが、一方で自分で順番を指定して実行することができるということでもあります。
何らかの理由で Azure Portal 上でうまくリソースの CRUD 操作ができない場合も コマンド操作 を適切な順番で実行すると、うまくいくことがあります。

### 3. おまけ `admin user name cannot contain upper case character A-Z, ...` エラーの対処法
あまり本文と関係ないのですが、私がハマったポイント で ググっても海外のサイトを見ても解決されなかった問題をおまけで記載しておきます。

[実行コード]
```
az vm create `
>>   --resource-group myRG `
>>   --name myVM `
>>   --image UbuntuLTS `
>>   --admin-username sample@sample.com `
>>   --generate-ssh-keys
```
[エラー]
```
admin user name cannot contain upper case character A-Z, special characters \/"[]:|<>+=;,?*@#()! or start with $ or -
```

#### 対処法
`--admin-username` は作成する仮想マシンの管理ユーザー名を新たに指定する部分です。
Azure のユーザー名と勘違いしていました。
※ 大文字やエラーで表示さえている記号が使えません。

Azure Portal だと👇の部分です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505421/e82d2616-7673-f1fc-9b41-6e33d7349e49.png)

そんな間違いする人、私のほかにいないですかね…。公式文書の例を見て急いで作らなかきゃいけなかったので、焦っていたんですよね（言い訳）