Azure Container InstancesからAzure PowerShellを実行する

前回の記事 [DockerコンテナからAzure PowerShellを実行する](https://qiita.com/ytamu2/items/e3bde581ce01a273b7e6) は、ローカル環境のDockerコンテナから
Azure PowerShellを実行しました。
今回はAzureのコンテナサービス **Azure Container Instances（ACI）** を使ってみます。

## コンテナの作成 
Azureポータルからコンテナーインスタンスを選んで追加。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604991/035f3c3e-80ea-a60d-29a9-17d55f8a5100.png" width=80%>

情報を入力していきます。
###### 基本
イメージはDocker Hubの[Azure Powershell](https://hub.docker.com/_/microsoft-azure-powershell)を使用します。
Azure Container Registry等、自分で作成したコンテナの利用も可能ですね。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604991/24bb9f49-2a75-d46c-4ee5-ad836cea832a.png" width=80%>

###### ネットワーク
今回はコンテナを仮想ネットワーク内に配置します。
サブネットはACI専用のものが必要になります [^1] ので空のサブネットを用意してください。

[^1]: 仮想ネットワーク内の配置について ：https://docs.microsoft.com/ja-jp/azure/container-instances/container-instances-vnet

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604991/f9ec1672-3574-69e3-4e05-70ef00676729.png" width=80%>

###### 詳細
コマンドのオーバーライドに`[ "tail", "-f", "/dev/null" ]`を入れます。
これがないとコンテナ起動後すぐにプロセスが落ちてコンテナも停止します。
ここ大分ハマりました…。
プロセスが停止しないコマンドなら他の物でも大丈夫な気がします。試していませんが…
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604991/62f0e711-7595-282a-057d-73dec9b6c407.png" width=80%>

上記入力完了後、作成ボタンを押下してコンテナを作成します。
デプロイは数分程度掛かります。

…
……
………

起動！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604991/049c533f-6d6b-f6ba-579e-2f85bc178065.png" width=60%>

## コンテナにアクセスしてみる
Azureポータルからコンソール接続できます。
設定 -> コンテナー -> 接続タブで使用するコマンドを選択しConnect。
コマンドは`pwsh`と入力することでPowerShellが使えます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604991/d49e2a52-a65a-f572-079d-8b17bb1843cb.png" width=80%>

ログインできました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604991/df91e766-4006-98a6-06b9-42a359545061.png" width=80%>

## ローカルのターミナルからアクセスしてみる
ローカルのターミナルからアクセスするにはAzure CLIを使用します。
Azure PowerShellは、アクセス可能なコマンドがないので無理そうです。
この為に普段使わないAzure CLIをインストールしました。
[Azure PowerShellのACIコマンドレット](https://docs.microsoft.com/ja-jp/powershell/module/az.containerinstance/)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604991/7831a444-89a7-a12a-8955-c96a6e9e5828.png" width=80%>

Azureのログイン。
Azure PowerShellと同様に表示されるURLにブラウザでアクセスし認証コードを入力します。

```
az login
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code xxxxxxxxx to authenticate.
```

ログインアカウントが複数サブスクリプションに紐づいている場合は、ACIを作成したサブスクリプションを選択してください。
サブスクリプションの一覧は`az account list`で出せます。

```
az account set -s <サブスクリプションID>
```

[`az container exec`](https://docs.microsoft.com/en-us/cli/azure/container?view=azure-cli-latest#az-container-exec) コマンドでコンテナにアクセスします。
オプションで高さと幅を指定しています。
デフォルトで高さ200、幅80となっており、このサイズが小さいとターミナルで正しく表示できないため、大きめに指定する必要があります。

```
az container exec --resource-group <リソースグループ名> --name <ACI名> --exec-command "pwsh" --terminal-col-size 1000 --terminal-row-size 1000

PowerShell 7.0.0
Copyright (c) Microsoft Corporation. All rights reserved.

https://aka.ms/powershell
PS /> help' to get help.
PS /> 
```

## 終わりに
これでサーバーレス（Cloud Shellを除く）でAzure PowerShell実行環境を作ることが出来ました。
ジョブスケジューラと上手く連携出来たら運用で使えそうです。