AzureAppServiceでContainerを使ってWebアプリを公開する

## 概要
試しに利用してみたら便利だったので、記録として残します。
ただ、個人的にはVPC内に置く機能がβ版だったり、Webアプリとしてしか公開ができなかったり、
本番運用としてはログ周りの機能が弱いとも感じるので趣味サイトとして利用することを前提とした方がいいと思います。

## 仕様等
AzureAppServiceを利用するにはAppServicePlanとAppServiceを作成する必要があります。
例えるとAppServicePlanがサーバであり、AppService自体はアプリケーションを管理する物という感じ。

## Azure CLIのインストール
```
$ brew install azure-cli
```

[Windwosの場合はこちらをご覧ください](https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli-windows?view=azure-cli-latest)

## azコマンドのリファレンス
- [コマンドのリファレンスはこちら](https://docs.microsoft.com/en-us/cli/azure/reference-index?view=azure-cli-latest)
- az xxx --helpからも確認できます

## 構築手順
RailsのWelcome画面を出すまでところまでとします。

1. Azure環境にログイン
1. ResourceGroupの作成
1. AzureContainerRegistry(以下ACR)の作成
1. RailsのDockerImageの準備
1. ACRにDockerImageのPush
1. AppServicePlanの作成
1. AppServiceの作成
1. CDの設定
1. 環境変数の設定
1. 確認


### 1. Azure環境にログイン
ブラウザでログイン画面が表示されるのでログインする

```
$ az login
```

### 2. ResourceGroupの作成
これに各種リソースを登録していきます

```
$ az group create --name nagi125-dev --location japaneast
```

### 3. AzureContainerRegistryの作成
これにDockerImageを登録していきます

```
$ az acr create --resource-group nagi125-dev --name nagi125acr --sku Basic --admin-enabled true --location japaneast
```

### 4. RailsのDockerImageの準備
Railsアプリケーションの作成

```
$ rails new rails-sample-app
$ cd ./rails-sample-app
$ touch Dockerfile
$ vim Dockerfile
```

Dockerfileの準備

```Dockerfile
FROM ruby:2.6.3

ENV TZ Asia/Tokyo
ENV RAILS_ENV development

RUN apt-get update -qq && \
    apt-get install --no-install-recommends -y netcat build-essential libpq-dev nodejs && \
    apt-get clean && \
    rm -rf /var/cache/apt
RUN gem install bundler

COPY Gemfile Gemfile.lock /app/

WORKDIR /app
RUN bundle install

COPY . /app

ENTRYPOINT ["rails", "server", "-b", "0.0.0.0"]
```

Imageの作成とACR用のタグをつける

```
$ docker build -t nagi125/rails-sample-app .
$ docker tag nagi125/rails-sample-app:latest nagi125acr.azurecr.io/nagi125/rails-sample-app:latest
```

### 5. ACRにDockerImageのPush
```
$ az acr login --name nagi125acr
$ docker push nagi125acr.azurecr.io/nagi125/rails-sample-app:latest
```

### 6. AppServicePlanの作成
```
$ az appservice plan create --resource-group nagi125-dev --name rails-sample-app-plan --sku B1 --location japaneast --is-linux
```

### 7. AppServiceの作成
AppServicePlanとACRのImageを指定して作成する

```
$ az webapp create --resource-group nagi125-dev --plan rails-sample-app-plan --name rails-sample-app --deployment-container-image-name nagi125acr.azurecr.io/nagi125/rails-sample-app:latest
```

### 8. CD設定
これを設定する事でImageをPushしてしばらくするとAppServiceに反映されるようになります。
※ 2-3分経っても反映されない場合AppServiceの再起動をしてみるとよいかも。
#### AppServiceとACRの紐付け
```
$ az webapp config container set --name rails-sample-app --resource-group nagi125-dev --docker-custom-image-name nagi125acr.azurecr.io/nagi125/rails-sample-app:latest --docker-registry-server-url http://nagi125acr.azurecr.io --docker-registry-server-user nagi125acr --docker-registry-server-password xxxxx
```
※ passwordはコマンドから確認できないため下記手順で確認する
<img width="1814" alt="nagi125acr_-_アクセス_キー_-_Microsoft_Azure.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23306/7e8fddb0-2406-f5fe-1597-ef646524821d.png">

#### CD設定
webhookのuriは返ってきた値を利用する
※ zsh等を利用している人は$のエスケープを忘れないようにしてください

```
$ az webapp deployment container config -g nagi125-dev -n rails-sample-app --enable-cd true
$ az acr webhook create -n railsSampleApp -r nagi125acr --scope nagi125/rails-sample-app:latest --location japaneast --uri xxxxx --actions push delete
```

### 9. 環境変数の設定
```
$ az webapp config appsettings set --settings RAILS_ENV=development -g nagi125-dev -n rails-sample-app
```

### 10. 確認
```
$ az webapp browse --resource-group nagi125-dev --name rails-sample-app
```

ブラウザに例の画面が表示されれば成功です。
※ 初回だと反映までに5分ぐらいかかるかもしれません。
<img width="1409" alt="Ruby_on_Rails.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23306/16160331-04d8-5ec1-6358-708e6d20f951.png">