App Service の Web App for Container に Visual Studio Code 環境を作ってみた

## 背景と目的

code-server というブラウザ上で Visual Studio Code（VSCode）が動作するアプリがあり、仮想マシン上に入れたり、ローカルの Docker 上で動かせたりします。プライベート AKS 上でクローズドな VSCode 環境を社内の開発者に提供する仕組みを作れたら楽しそうだな、と妄想するとワクワクします。今回は、App Service の Web App for Container に Visual Studio Code 環境を作ってみました。

## 前提条件

コマンドの実施環境は、Mac + Azure CLI です。

```bash:bash
$ sw_vers
ProductName:    macOS
ProductVersion: 11.5.2
BuildVersion:   20G95

$ az version
{
  "azure-cli": "2.27.2",
  "azure-cli-core": "2.27.2",
  "azure-cli-telemetry": "1.0.6",
  "extensions": {}
}
```

## 実施内容

```bash:bash
# 環境変数をセットします
region=japaneast
prefix=mnrvscode

# リソースグループを作成します
az group create \
  --name ${prefix}-rg \
  --location $region

# App Service Plan を作成します（デフォルトの SKU は B1 です）
az appservice plan create \
  --name ${prefix}-plan \
  --resource-group ${prefix}-rg \
  --is-linux

# コンテナーイメージに bencdr/code-server-azure を指定して App Service を作成します
az webapp create \
  --resource-group ${prefix}-rg \
  --plan ${prefix}-plan \
  --name ${prefix}-app \
  --deployment-container-image-name bencdr/code-server-azure

# App Service のログを確認します
az webapp log tail \
  --name ${prefix}-app \
  --resource-group ${prefix}-rg

# ひとまず下記のようなログが表示されれば成功です
2021-09-11T23:47:09.801Z INFO  - 86308921272e Pull complete
2021-09-11T23:47:09.853Z INFO  -  Digest: sha256:13567003e93b208b80b2ae02449bc34cfde1d06dc04cff4031e2017badd2d3f2
2021-09-11T23:47:09.897Z INFO  -  Status: Downloaded newer image for bencdr/code-server-azure:latest
2021-09-11T23:47:09.901Z INFO  - Pull Image successful, Time taken: 1 Minutes and 53 Seconds
2021-09-11T23:47:09.934Z INFO  - Starting container for site
2021-09-11T23:47:09.935Z INFO  - docker run -d -p 8629:80 --name mnrvscode-app_0_1c876019 -e WEBSITES_ENABLE_APP_SERVICE_STORAGE=false -e WEBSITE_SITE_NAME=mnrvscode-app -e WEBSITE_AUTH_ENABLED=False -e PORT=80 -e WEBSITE_ROLE_INSTANCE_ID=0 -e WEBSITE_HOSTNAME=mnrvscode-app.azurewebsites.net -e WEBSITE_INSTANCE_ID=a822bcb6dd314caab4bd83084cc7a3991e4965ec4f97b7ce99c0ca46861dc419 bencdr/code-server-azure  

# ストレージアカウントを作成します
az storage account create \
  --name ${prefix}stor \
  --resource-group ${prefix}-rg \
  --https-only true \
  --sku Standard_LRS

# ストレージアカウントのキーを取得します
storagekey=$(az storage account keys list \
  --account-name ${prefix}stor \
  --resource-group ${prefix}-rg \
  --query [0].value \
  --output tsv)

# 作業ファイルの永続化用にファイル共有を作成します
az storage share create \
  --account-name ${prefix}stor \
  --name ${prefix}-project

# /home/coder/project にマウントします
az webapp config storage-account add \
  --name ${prefix}-app \
  --resource-group ${prefix}-rg \
  --custom-id ${prefix}-project \
  --storage-type AzureFiles \
  --share-name ${prefix}-project \
  --account-name ${prefix}stor \
  --access-key $storagekey \
  --mount-path /home/coder/project

# ログインパスワードを作成します
vscodepass=$(openssl rand -base64 16)
echo $vscodepass

# App Service のアプリケーション設定にパスワードを環境変数として登録します（App Service が再起動します）
az webapp config appsettings set \
  --name ${prefix}-app \
  --resource-group ${prefix}-rg \
  --settings PASSWORD=$vscodepass

# もう一度、App Service のログを確認します
az webapp log tail \
  --name ${prefix}-app \
  --resource-group ${prefix}-rg

# 環境変数に設定したパスワードが有効になって起動しました
2021-09-12T00:03:18.623148231Z: [INFO]  [2021-09-12T00:03:18.615Z] info  Wrote default config file to ~/.config/code-server/config.yaml
2021-09-12T00:03:20.373259419Z: [INFO]  [2021-09-12T00:03:20.355Z] info  code-server 3.9.0 fc6d123da59a4e5a675ac8e080f66e032ba01a1b
2021-09-12T00:03:20.373314023Z: [INFO]  [2021-09-12T00:03:20.363Z] info  Using user-data-dir ~/.local/share/code-server
2021-09-12T00:03:20.444925243Z: [INFO]  [2021-09-12T00:03:20.444Z] info  Using config file ~/.config/code-server/config.yaml
2021-09-12T00:03:20.444971147Z: [INFO]  [2021-09-12T00:03:20.444Z] info  HTTP server listening on http://0.0.0.0:80 
2021-09-12T00:03:20.444977047Z: [INFO]  [2021-09-12T00:03:20.444Z] info    - Authentication is enabled
2021-09-12T00:03:20.444981248Z: [INFO]  [2021-09-12T00:03:20.444Z] info      - Using password from $PASSWORD
2021-09-12T00:03:20.444985148Z: [INFO]  [2021-09-12T00:03:20.444Z] info    - Not serving HTTPS 

# App Service に自宅の IP アドレスからのみアクセス出来るようにします
az webapp config access-restriction add \
  --name ${prefix}-app \
  --resource-group ${prefix}-rg \
  --rule-name location-home \
  --action Allow \
  --ip-address $(curl -s inet-ip.info)/32 \
  --priority 100

# App Service の URL を表示しブラウザでアクセスします
az webapp show \
  --name ${prefix}-app \
  --resource-group ${prefix}-rg \
  --query defaultHostName \
  --output tsv
```

## 実施結果

最初に表示される画面。先ほど作成したログインパスワードを入力して SUBMIT します。

![vscode login](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/ac0238ed-bf64-082d-3ad9-cca92cf6c940.png)

Visual Studio Code が App Service 上で動きました！

![vscode ui](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/6660d0dc-4259-dfd5-058d-e1977d473205.png)

## 参考

作成したリソースを削除します。

```bash:bash
# リソースグループを削除します
az group delete \
  --name ${prefix}-rg
```

下記は、参考サイトです。

[code-server-azure](https://github.com/bpmct/code-server-azure#code-server-azure)